终于编好了实习的简历。这个帖子记录一下我准备的可能的问题以及面试中的问题。
微调
LoRA:Low-Rank Adaptation of LLM
- 优点是什么?
- 参数少:0.1%-0.01%
- 速度快:训练和部署
- 模块化:不影响原始模型
- 避免灾难性遗忘
- 存储效率高
- 快速切换
- 兼容性强
- 为什么可以进行低秩分解?
- 奇异值分解
- 大部分信息集中在了少量的奇异值上。
- LoRA论文中GPT-3上的$\Delta W$的前10-20个奇异值就可以保留90%以上的信息
- 由于$\Delta W$的秩很低,可以用A和B直接构造,不需要完整的SVD计算,更加高效
一个$512\times 512$的权重矩阵,全微调可能需要$512\times 512$的调整参数量,LoRA如果r=8,只需要$512\times 8$和$8\times 512$的参数变化。
- LoRA如何更新参数?
- 反向传播算法。具体来说是$W’=W+\Delta W=W+A\times B$。
- Step1:初始化
- $W$是预训练好的权重
- $A$通常用小的随机值初始化
- $B$初始可以设置为全0,这样$\Delta W$=0,不干扰原始模型
- Step2:计算损失
- 对于输入X,前向传播计算得到输出$Y_{pred}=(W+A\times B)\times X$。
- 根据任务定义损失函数$L=Loss(Y_{true},Y_{pred})$。
- Step3:反向传播更新
- 计算损失$L$对$A$和$B$的梯度
- 梯度下降更新
- Step4:迭代优化
- 重复Step2和Step3,直到损失收敛或者达到预定训练轮次
- 最终得到$A$和$B$
- 用在Transformer的哪个层?
- 注意力层中的$W_q$和$W_v$较多,其他的收益有限
- 前馈层的LoRA可能会用在较大模型上
- LoRA改进版本
- LoRA+:加速
- 靠近输出的权重B应该对梯度变化更敏感,需要更大调整。所以调整得B比A的学习率高
- DoRA:稳定高性能
- 把预训练权重矩阵分解为幅度和方向$W=m\times V$
- 微调的时候调整方向$V$,幅度单独训练
- 训练量增加,性能高
- rsLoRA:稳定
- 引入动态秩调整和稳定化因子优化训练
- $W’=W+\Delta W=W+(\frac{\alpha}{\sqrt{r}})A\times B$。
- 训练更稳定
- PiSSA:收敛快
- 优化初始化,把A和B矩阵初始化使用SVD分解
- GaLore:内存极低
- LoRA+:加速
- LoRA需要的超参数
以下是 LLaMA Factory 微调中最重要的超参数及其核心作用的总结表格。这些参数直接决定了微调的成功与否、效率以及资源消耗。
| 参数类别 | 参数名 | 核心作用 | 关键建议与说明 |
|---|---|---|---|
| 训练核心 | 学习率 | 控制模型参数更新的步长,是影响收敛速度和稳定性的最关键参数。 | LoRA/QLoRA:可稍大,常用 1e-4到 5e-4。 全量微调:需谨慎,常用 1e-5到 3e-5。 |
per_device_train_batch_size gradient_accumulation_steps |
共同决定有效批处理大小,影响训练稳定性和显存占用。 | 有效批大小 = 批大小 × 累积步数。建议将此值保持在 16 或以上以获得稳定训练。批大小受显存限制,多用累积步数来补偿。 | |
| LoRA核心 | lora_rank |
决定LoRA适配器的能力与参数数量。秩越高,拟合能力越强,但也更易过拟合。 | 通用任务从 8、16 或 32 开始尝试。复杂任务可尝试 64 或更高。 |
lora_alpha |
控制LoRA适配器输出的缩放因子,与 lora_rank配合调节更新强度。 |
一个稳定的经验法则是设置为 lora_rank的两倍(例如 rank=16, alpha=32)。 |
|
| 流程控制 | num_train_epochs |
控制整个数据集训练的遍数,直接影响是否过拟合。 | 指令微调通常 1-3 个 epoch 足够。务必监视验证集损失,考虑启用早停。 |
| 数据格式 | template |
指定数据格式模板,将数据转化为模型熟知的对话格式。选错会导致模型无法理解指令。 | 如果不确定,优先使用 default 或与预训练模型对应的模板(如 qwen, llama3)。这是最易忽略但致命的一环。 |
| 资源与长度 | cutoff_len |
设置单条训练数据的最大长度,直接影响显存占用。 | 在显存允许下,根据任务实际需要的上下文长度设置。过短会丢失信息,过长浪费资源。 |