Hypernetworks 是一种 Stable Diffusion 模型微调机制,它允许用户训练小型辅助神经网络来改变主模型注意力层的行为。与 Textual Inversion 嵌入(请参阅 Textual Inversion (Embeddings))不同,Hypernetworks 不仅仅修改单个 token 的表示,而是通过在生成过程中转换内部模型表示,能够影响更广泛的风格元素和视觉概念。
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 会拦截并修改交叉注意力机制产生的键(K)和值(V)张量。这会改变注意力机制将条件(文本提示)与生成的图像关联的方式,从而使 Hypernetwork 能够植入其训练过的风格或概念。
来源: modules/hypernetworks/hypernetwork.py358-379
Hypernetworks 可以用可自定义的参数创建,然后在一个图像数据集上进行训练,以学习特定的风格或概念。
要创建一个 Hypernetwork,您需要指定:
创建的 Hypernetwork 会以 .pt 文件的形式保存在 hypernetworks 目录下。
来源: modules/hypernetworks/hypernetwork.py440-469 modules/hypernetworks/ui.py11-14
训练过程与 Textual Inversion 训练相似
来源: modules/hypernetworks/hypernetwork.py472-733
| 参数 | 描述 |
|---|---|
| 学习率 | 在训练期间更新 Hypernetwork 权重的速率 |
| 批次大小 | 每次训练步骤处理的图像数量 |
| 梯度累积步数 | 在更新权重之前累积梯度的批次数 |
| 数据集目录 | 包含训练图像的目录 |
| 日志目录 | 用于保存日志、检查点和预览图像的目录 |
| 训练宽度/高度 | 用于训练的图像尺寸 |
| 步数 | 总训练步数 |
| 保存频率 | 训练期间保存 Hypernetwork 的频率 |
| 预览生成 | 使用 Hypernetwork 的当前状态生成预览图像的频率 |
来源: modules/hypernetworks/hypernetwork.py472-516
Hypernetwork 的核心是 HypernetworkModule 类,它实现了一个具有可配置层和激活函数的神经网络。
HypernetworkModule 是一个层序列,可以包括:
结构由 layer_structure 参数定义,该参数指定每层相对于输入维度的相对大小。
来源: modules/hypernetworks/hypernetwork.py25-126
Hypernetworks 通过修改 attention_CrossAttention_forward 方法来与 Stable Diffusion 集成,该方法是 U-Net 架构中注意力机制的一部分。
当加载 Hypernetwork 时,它会拦截交叉注意力计算,在上下文张量被键和值投影处理之前对其应用其转换。
来源: modules/hypernetworks/hypernetwork.py382-407
Hypernetworks 使用 load_hypernetwork 函数加载,该函数接受一个名称参数并返回一个 Hypernetwork 实例。可以同时加载多个 Hypernetworks 并应用不同的乘数。
来源: modules/hypernetworks/hypernetwork.py312-355
| 参数 | 描述 |
|---|---|
| 层结构 | 定义 Hypernetwork 中各层的相对大小(例如,[1, 2, 1]) |
| 激活函数 | 层之间使用的激活函数(例如,ReLU, LeakyReLU) |
| 权重初始化 | 用于初始化权重的技术(例如,Normal, XavierUniform) |
| 添加层归一化 | 是否在每层后添加层归一化 |
| 使用 Dropout | 是否在训练期间使用 Dropout 进行正则化 |
| 激活输出 | 是否将激活函数应用于输出层 |
| Dropout 结构 | 每层的 Dropout 概率配置 |
来源: modules/hypernetworks/hypernetwork.py148-164
Hypernetworks 被保存为 .pt 文件,包含:
来源: modules/hypernetworks/hypernetwork.py213-242
| 功能 | 超网络 | Textual Inversion |
|---|---|---|
| 修改内容 | 注意力层输出 | Token 嵌入 |
| 影响范围 | 全局风格/概念修改 | 与 token 绑定的特定概念 |
| 大小 | 更大(多层) | 更小(仅嵌入) |
| 训练复杂度 | 更复杂 | 更简单 |
| 训练数据需求 | 通常需要更多示例 | 可以使用更少的示例 |
| 集成点 | 交叉注意力机制 | CLIP 文本编码器嵌入 |
来源: modules/hypernetworks/hypernetwork.py modules/textual_inversion/textual_inversion.py
层结构参数定义了 Hypernetwork 模块中每层的相对大小。例如,层结构 [1, 2, 1] 意味着:
这使得可以根据所学习的风格或概念的复杂性来创建更宽或更深的 Hypernetwork。
来源: modules/hypernetworks/hypernetwork.py47-51
Dropout 结构参数允许为训练期间的正则化指定 Dropout 概率。它应该与层结构的长度匹配,每个值表示对应层后的 Dropout 概率。
来源: modules/hypernetworks/hypernetwork.py65-70 modules/hypernetworks/hypernetwork.py129-141
Hypernetworks 支持 PyTorch 的各种优化器,包括:
优化器状态可以与 Hypernetwork 一起保存,以便以后恢复训练。
来源: modules/hypernetworks/hypernetwork.py23 modules/hypernetworks/hypernetwork.py553-565
[1, 2, 1] 结构就足够了。对于更详细的概念,可能需要更复杂的结构。刷新此 Wiki
最后索引时间2025年4月17日(82a973)