常见的微调的方式有哪些?(Lora...)

1. LoRA (Low-Rank Adaptation)

核心思想: 不修改原始权重,旁路添加低秩矩阵

┌─────────────────────────────────┐

│ 原始Linear层 (W: 4096×4096) │

│ ❄️ 冻结不训练 │

│ ↓ x │

│ W·x (输出) │

└─────────────────────────────────┘

  • (相加)

┌─────────────────────────────────┐

│ LoRA旁路 │

│ x → A(8×4096) → B(4096×8) │

│ 🔥 只训练这两个矩阵 │

│ ↓ │

│ B·A·x (输出) │

└─────────────────────────────────┘

2. Prompt Tuning

核心思想: 在输入序列前添加可学习的"软提示词"

原始输入:

The, movie, is, great → Encoder → 输出

Prompt Tuning:

P1, P2, P3, ..., Pk, The, movie, is, great → Encoder → 输出

↑____________↑

可学习的soft prompts

(只训练这些)

具体做法:

  • 模型权重 全部冻结
  • 只在输入前添加 k 个可学习的embedding向量 (比如20个)
  • 只训练这20个向量
  • 参数量: 极少 (20 × 768维 ≈ 15K参数)

输入层:

┌──────────────────────────────────────┐

🔥P₁ 🔥P₂ 🔥P₃ ... 🔥Pₖ │ ← 可训练的prompt embeddings

❄️The ❄️movie ❄️is ❄️great │ ← 真实输入(正常处理)

└──────────────────────────────────────┘

❄️ Transformer层 (冻结)

输出

3. Adapter

核心思想: 在Transformer层之间插入小型瓶颈网络

复制代码
原始Transformer块:
Input → Self-Attention → Add&Norm → FFN → Add&Norm → Output

加入Adapter后:
Input → Self-Attention → Add&Norm → [🔥Adapter] → FFN → Add&Norm → [🔥Adapter] → Output
                                        ↑                                ↑
                                    新插入的模块                    新插入的模块

具体做法:

  • Transformer层 冻结
  • 在每层后插入Adapter模块
  • 只训练Adapter参数
  • 参数量: 1-3% (取决于bottleneck大小)

4. IA3 (Infused Adapter by Inhibiting and Amplifying Inner Activations)【基本不用】

核心思想: 用可学习的缩放向量调整激活值

复制代码
原始:
h = W·x

IA3:
h = (W · diag(l)) · x = W · (l ⊙ x)
           ↑              ↑
      可学习的缩放向量  逐元素相乘

具体做法:

  • 权重矩阵 W 冻结
  • 只学习一个缩放向量 l (长度等于输入维度)
  • 将输入 x 逐元素乘以 l,然后再乘以 W
  • 参数量: 极少 (每层只有一个向量, 比如768个参数)

可视化:

复制代码
对于 K、V、FFN 的投影:

输入 x (768维)
   ↓
x ⊙ l_k (逐元素相乘)  ← 🔥 l_k是768维可训练向量
   ↓
❄️ W_k · (缩放后的x)   ← W_k冻结
   ↓
输出

5. Full FT (Full Fine-Tuning / 全量微调)

核心思想: 所有参数都训练

复制代码
预训练模型的所有参数 → 🔥全部解冻 → 在下游任务上训练

具体做法:

  • 加载预训练权重
  • 所有层的所有参数都设为可训练
  • 在目标数据集上重新训练
  • 参数量: 100%

6. 固定Encoder (Feature Extraction)

核心思想: 把预训练模型当特征提取器,只训练新加的分类头

复制代码
输入 → ❄️Encoder(冻结) → 特征 → 🔥分类头(新建+训练) → 输出

具体做法:

  • Encoder所有层 冻结
  • 去掉原来的输出层,加一个新的(比如线性层)
  • 只训练这个新的分类头
  • 参数量: <1% (只有分类头)

https://mp.weixin.qq.com/s/aAIuZ8LH3flnxNLtlP6d0w

相关推荐
LadenKiller1 分钟前
期货量化成交回报漏记:天勤 get_trade 与 trade_records 对账
python
MemoriKu7 分钟前
Flutter 相册 APP 视频模态稳定化实战:从远端重构冲突到真机 Smoke Test
人工智能·python·flutter·机器学习·重构·音视频·新人首发
芋头莎莎7 分钟前
window 右键菜单添加 vscode
ide·vscode·编辑器
月疯8 分钟前
torch:view和reshape的区别
pytorch·python·深度学习
AC赳赳老秦17 分钟前
OpenClaw + 华为云自动化:批量管理云资源、生成月度云账单分析与成本优化报告
java·开发语言·javascript·人工智能·python·mysql·openclaw
极光代码工作室17 分钟前
基于数据分析的电影票房预测系统
大数据·python·数据分析·spark·数据可视化
量化君也23 分钟前
桥水基金全天候策略拆解,构建中国ETF躺平版策略
大数据·人工智能·python·算法·金融·业界资讯
爱吃苹果的梨叔32 分钟前
2026年分布式坐席系统哪家好:指挥中心与调度大厅选型参考
分布式·python
Stick_ZYZ33 分钟前
A2A:让 Agent 从单兵作战走向团队协作
java·开发语言·网络·人工智能·python·ai
weixin_3077791335 分钟前
从切片迷宫到结构化智能:AI Agent解析PDF的完整范式
图像处理·人工智能·python·自动化·ocr