Stable Diffusion LORA 模型高效微调实战指南
引言:AI 画风优化需求
第一次把 Stable Diffusion 跑通后,常会遇到生成图像缺乏细节或风格统一的问题。通过调整提示词、CFG 等参数往往难以解决根本问题。
引入 LoRA(Low-Rank Adaptation)相当于给模型打'风格疫苗',能以较低成本实现专属风格的微调。
为什么使用 LoRA?
LoRA 将大模型微调从昂贵资源消耗转变为平民化操作。
- 全参数微调:显存占用高(24G+),训练时间长(8h+),适合追求极致效果且预算充足场景。
- DreamBooth:需复制整个模型,显存占用约 10-16G。
- LoRA:仅训练低秩矩阵,显存占用 4-6G,训练时间 30-60 分钟,模型大小仅 8-144MB。
LoRA 原理简述
定义
LoRA = 冻结原模型权重 + 并行插入可训练低秩矩阵。
数学直觉
假设原权重矩阵 W 大小为 d×k,LoRA 将其拆分为两个小矩阵 A(d×r)和 B(r×k),其中 r << min(d,k)。 训练时只更新 A、B,参数量从 d×k 锐减到 (d+k)×r。
数据流
输入 x │ ├─→ 原权重 W(冻结)─┐ │ ⊕→ 输出 h └─→ 低秩分支 A→B(可训练)───────┘
前向计算:h = W·x + B·A·x
反向传播:梯度只走 A、B,W 不变。
LoRA 工作机制
在 Stable Diffusion 中,LoRA 主要作用于 Cross-Attention 层。这里插针相当于给模型打'文本理解疫苗',提示词一出口,风格立刻有反应。
核心代码示例(基于 diffusers 库):
# lora_layer.py
import torch
import torch.nn as nn
class LoRALinear(nn.Module):
"""替换 nn.Linear 的 LoRA 层"""
def __init__(self, in_features, out_features, rank=4, alpha=32):
super().__init__()
self.rank = rank
self.alpha = alpha
# 冻结的原始权重
self.weight = nn.Parameter(torch.empty(out_features, in_features))
self.weight.requires_grad = False
.lora_A = nn.Parameter(torch.empty(rank, in_features))
.lora_B = nn.Parameter(torch.empty(out_features, rank))
nn.init.kaiming_uniform_(.lora_A, a=math.sqrt())
nn.init.zeros_(.lora_B)
():
(torch.nn.functional.linear(x, .weight) +
(.lora_B @ .lora_A) * (.alpha / .rank))


