LoRA(Low-Rank Adaptation,低秩适应)
文章目录
- LoRA 的核心原理
- LoRA 在 Stable Diffusion 中的应用
- **1. 作用位置**
- **2. 优势**
- **3. 代码中的实现**
- LoRA 的典型使用场景
- LoRA vs 其他微调方法
LoRA(Low-Rank Adaptation,低秩适应)是一种高效微调大模型的技术,主要用于在不显著增加计算资源的情况下,对预训练模型(如Stable Diffusion)进行轻量级适配。它的核心思想是通过低秩矩阵分解来减少可训练参数数量,从而实现对特定任务或风格的快速适配。
LoRA 的核心原理
-
低秩分解:
对原始权重矩阵 W ∈ R d × k W \in \mathbb{R}^{d \times k} W∈Rd×k(例如Attention层的 Q / K / V Q/K/V Q/K/V矩阵),LoRA将其更新量 Δ W \Delta W ΔW分解为两个小矩阵的乘积:
Δ W = B A 其中 B ∈ R d × r , A ∈ R r × k , r ≪ min ( d , k ) \Delta W = BA \quad \text{其中} \quad B \in \mathbb{R}^{d \times r}, \ A \in \mathbb{R}^{r \times k}, \ r \ll \min(d,k) ΔW=BA其中B∈Rd×r, A∈Rr×k, r≪min(d,k)- ( r ) 是秩(rank),通常取
4~64
,远小于原矩阵维度。 - 训练时只更新 A A A和 B B B,冻结原始权重 W W W。
- ( r ) 是秩(rank),通常取
-
前向计算:
实际计算时,将原始输出加上低秩适配项:
h = W x + Δ W x = W x + B A x h = Wx + \Delta W x = Wx + BAx h=Wx+ΔWx=Wx+BAx
LoRA 在 Stable Diffusion 中的应用
1. 作用位置
通常注入到UNet的交叉注意力层(Cross-Attention)和文本编码器中,例如:
to_q
、to_k
、to_v
投影矩阵- 输出投影矩阵
to_out[0]
2. 优势
- 参数高效:
微调时仅需训练原模型参数的 0.1%~1%(例如SD模型原始参数约1B,LoRA可能只需1-10M参数)。 - 即插即用:
训练后的LoRA权重(.safetensors
文件)可独立于原模型加载/卸载。 - 组合灵活:
多个LoRA权重可以叠加使用(需注意scale比例)。
3. 代码中的实现
在Stable Diffusion Pipeline中,LoRA相关逻辑主要通过:
StableDiffusionLoraLoaderMixin
类处理权重加载scale_lora_layers()
和unscale_lora_layers()
控制适配强度- 通过
cross_attention_kwargs={"scale": lora_scale}
传递缩放因子
LoRA 的典型使用场景
场景 | 说明 |
---|---|
风格微调 | 让模型学习特定艺术风格(如动漫、水彩) |
主题适配 | 适配特定对象(如特定角色、品牌logo) |
可控生成 | 增强对某些属性的控制(如光照、姿势) |
多任务切换 | 通过加载不同LoRA快速切换任务,无需存储多个完整模型 |
LoRA vs 其他微调方法
方法 | 参数量 | 存储开销 | 训练速度 | 灵活性 |
---|---|---|---|---|
全参数微调 | 100% | 极大 | 慢 | 低 |
Adapter | ~3-10% | 中等 | 中 | 中 |
LoRA | 0.1-1% | 极小 | 快 | 高 |
Prompt Tuning | ~0.1% | 极小 | 快 | 低 |