菜单

超网络

相关源文件

Hypernetworks 是一种 Stable Diffusion 模型微调机制,它允许用户训练小型辅助神经网络来改变主模型注意力层的行为。与 Textual Inversion 嵌入(请参阅 Textual Inversion (Embeddings))不同,Hypernetworks 不仅仅修改单个 token 的表示,而是通过在生成过程中转换内部模型表示,能够影响更广泛的风格元素和视觉概念。

1. Hypernetwork 架构

Stable Diffusion Web UI 中的 Hypernetworks 由成对的小型网络组成,它们修改 Stable Diffusion U-Net 架构中注意力层的键(K)和值(V)输出。这使得它们能够影响注意力在整个图像生成流程中的分布和处理方式。

结构图

每个 Hypernetwork 实例包含多个 HypernetworkModule 对,按维度组织以匹配模型中的不同注意力层。Hypernetwork 模块是神经网络,它们转换 Stable Diffusion U-Net 的交叉注意力机制中的键(K)和值(V)张量。

来源: modules/hypernetworks/hypernetwork.py25-126 modules/hypernetworks/hypernetwork.py144-190 modules/hypernetworks/hypernetwork.py382-407

Hypernetworks 如何工作

在扩散过程中,Hypernetworks 会拦截并修改交叉注意力机制产生的键(K)和值(V)张量。这会改变注意力机制将条件(文本提示)与生成的图像关联的方式,从而使 Hypernetwork 能够植入其训练过的风格或概念。

来源: modules/hypernetworks/hypernetwork.py358-379

2. 创建和训练 Hypernetworks

Hypernetworks 可以用可自定义的参数创建,然后在一个图像数据集上进行训练,以学习特定的风格或概念。

创建过程

要创建一个 Hypernetwork,您需要指定:

  1. Hypernetwork 的名称
  2. 要启用的维度(大小)
  3. 层结构
  4. 激活函数
  5. 权重初始化方法
  6. 可选参数,如层归一化和 Dropout

创建的 Hypernetwork 会以 .pt 文件的形式保存在 hypernetworks 目录下。

来源: modules/hypernetworks/hypernetwork.py440-469 modules/hypernetworks/ui.py11-14

训练工作流程

训练过程与 Textual Inversion 训练相似

  1. 准备图像数据集,可选择性添加文本描述
  2. 模板文件定义如何为训练格式化提示
  3. 优化 Hypernetwork 的权重,以最小化模型在尝试预测训练图像时的损失
  4. 训练期间可以生成检查点和预览图像
  5. 训练好的 Hypernetwork 会被保存以供以后使用

来源: modules/hypernetworks/hypernetwork.py472-733

Hypernetwork 训练参数

参数描述
学习率在训练期间更新 Hypernetwork 权重的速率
批次大小每次训练步骤处理的图像数量
梯度累积步数在更新权重之前累积梯度的批次数
数据集目录包含训练图像的目录
日志目录用于保存日志、检查点和预览图像的目录
训练宽度/高度用于训练的图像尺寸
步数总训练步数
保存频率训练期间保存 Hypernetwork 的频率
预览生成使用 Hypernetwork 的当前状态生成预览图像的频率

来源: modules/hypernetworks/hypernetwork.py472-516

3. 技术实现

Hypernetwork 模块结构

Hypernetwork 的核心是 HypernetworkModule 类,它实现了一个具有可配置层和激活函数的神经网络。

HypernetworkModule 是一个层序列,可以包括:

  • 线性变换
  • 激活函数(ReLU, LeakyReLU 等)
  • 层归一化
  • Dropout 层

结构由 layer_structure 参数定义,该参数指定每层相对于输入维度的相对大小。

来源: modules/hypernetworks/hypernetwork.py25-126

与 Stable Diffusion 的集成

Hypernetworks 通过修改 attention_CrossAttention_forward 方法来与 Stable Diffusion 集成,该方法是 U-Net 架构中注意力机制的一部分。

当加载 Hypernetwork 时,它会拦截交叉注意力计算,在上下文张量被键和值投影处理之前对其应用其转换。

来源: modules/hypernetworks/hypernetwork.py382-407

4. 使用 Hypernetworks

加载 Hypernetworks

Hypernetworks 使用 load_hypernetwork 函数加载,该函数接受一个名称参数并返回一个 Hypernetwork 实例。可以同时加载多个 Hypernetworks 并应用不同的乘数。

来源: modules/hypernetworks/hypernetwork.py312-355

Hypernetwork 参数

参数描述
层结构定义 Hypernetwork 中各层的相对大小(例如,[1, 2, 1])
激活函数层之间使用的激活函数(例如,ReLU, LeakyReLU)
权重初始化用于初始化权重的技术(例如,Normal, XavierUniform)
添加层归一化是否在每层后添加层归一化
使用 Dropout是否在训练期间使用 Dropout 进行正则化
激活输出是否将激活函数应用于输出层
Dropout 结构每层的 Dropout 概率配置

来源: modules/hypernetworks/hypernetwork.py148-164

Hypernetwork 文件

Hypernetworks 被保存为 .pt 文件,包含:

  • 每个层的 Hypernetwork 状态字典
  • 训练元数据(步数,使用的检查点)
  • 配置参数(层结构、激活函数等)
  • 可选的优化器状态

来源: modules/hypernetworks/hypernetwork.py213-242

5. 与其他微调方法的比较

Hypernetworks vs. Textual Inversion

功能超网络Textual Inversion
修改内容注意力层输出Token 嵌入
影响范围全局风格/概念修改与 token 绑定的特定概念
大小更大(多层)更小(仅嵌入)
训练复杂度更复杂更简单
训练数据需求通常需要更多示例可以使用更少的示例
集成点交叉注意力机制CLIP 文本编码器嵌入

来源: modules/hypernetworks/hypernetwork.py modules/textual_inversion/textual_inversion.py

6. 高级用法

层结构

层结构参数定义了 Hypernetwork 模块中每层的相对大小。例如,层结构 [1, 2, 1] 意味着:

  • 第一层:input_dimension × 1
  • 第二层:input_dimension × 2
  • 第三层:input_dimension × 1

这使得可以根据所学习的风格或概念的复杂性来创建更宽或更深的 Hypernetwork。

来源: modules/hypernetworks/hypernetwork.py47-51

Dropout 结构

Dropout 结构参数允许为训练期间的正则化指定 Dropout 概率。它应该与层结构的长度匹配,每个值表示对应层后的 Dropout 概率。

来源: modules/hypernetworks/hypernetwork.py65-70 modules/hypernetworks/hypernetwork.py129-141

优化方法

Hypernetworks 支持 PyTorch 的各种优化器,包括:

  • AdamW(默认)
  • Adam
  • SGD
  • RMSprop

优化器状态可以与 Hypernetwork 一起保存,以便以后恢复训练。

来源: modules/hypernetworks/hypernetwork.py23 modules/hypernetworks/hypernetwork.py553-565

7. 故障排除和最佳实践

训练技巧

  1. 层结构:对于许多风格,通常采用简单的 [1, 2, 1] 结构就足够了。对于更详细的概念,可能需要更复杂的结构。
  2. 激活函数:ReLU 和 LeakyReLU 是常用的,在大多数情况下效果都很好。
  3. 学习率:从适中的学习率开始(例如 0.0001),然后随着时间的推移降低它。
  4. 批次大小:使用 GPU 内存能够处理的最大批次大小,以获得更稳定的训练。
  5. 数据集:使用 10-20 张相同风格/概念的一致性图像,通常比使用更大、更多样化的数据集能产生更好的结果。

常见问题

  • 过拟合:如果超网络在训练图像上产生良好结果,但在新提示上结果不佳,则可能存在过拟合。解决方案包括使用 dropout、减少训练步数或扩大数据集。
  • 欠拟合:如果超网络未能捕捉到期望的风格,请尝试增加模型复杂度(层结构)或增加训练步数。
  • GPU 内存问题:如果您遇到 CUDA out of memory 错误,请尝试减小批次大小或使用梯度累积。

来源: modules/hypernetworks/hypernetwork.py472-733