外观
LLM 微调实战面试题
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
1. 全参数微调需要多少显存?
一般 N B(Billion)参数的模型,最低需要 16-20 × N GB 的显存(不开启 CPU Offload 的情况下)。
以 Vicuna-7B 为例,官方配置为 4×A100 40G,Global Batch Size 128、Max Length 2048 时可占满显存。实际训练中使用 FSDP、梯度累积、梯度检查点等技术可进一步降低显存需求。
2. SFT 后模型变差("变傻")的原因?
核心原因:SFT 的本质是激发大模型已有的能力,而非注入新知识。
- SFT 数据量通常在万级(如 Alpaca 的 52K),相比预训练数据量太少
- 如果抱着"灌注领域知识"而非"激发能力"的目的做 SFT,容易导致模型效果劣化
- 指令微调的真正作用是解锁大模型的能力,使其泛化到未见过任务
3. SFT 指令微调数据如何构建?
| 原则 | 说明 |
|---|---|
| 代表性 | 选择多个有代表性的任务 |
| 适量 | 每个任务实例数量不应太多(数百个),避免过拟合 |
| 平衡 | 平衡不同任务的数据量占比,限制总数据量(通常数千到数万) |
4. 领域 Continue PreTrain 的数据选取
技术标准文档和领域相关数据是 Continue PreTrain 的关键,因为这些数据相比网站和资讯具有更高的知识密度。书籍和论文类数据质量最高,领域知识密度最大。
5. 如何缓解领域训练后的通用能力遗忘?
在领域数据训练过程中混入通用数据集,比例建议:
- 当领域数据量较少时,领域数据 : 通用数据 ≈ 1:5 到 1:10
6. MIP:多任务指令预训练
在 Continue PreTrain 时同步加入 SFT 数据,即 Multi-Task Instruction PreTraining,让模型在预训练阶段就学习下游任务知识。
7. SFT 基座模型选 Chat 还是 Base?
| 数据量 | 推荐基座 |
|---|---|
| < 10K 数据 | Chat 模型(资源有限时更省力) |
| > 100K 数据 | Base 模型(资源充足时可更好拟合) |
在 Chat 模型上做 SFT 时,必须遵循原模型的系统指令和数据输入格式。
8. 微调指令格式要求
- Chat 模型 SFT 必须遵循原模型的 Prompt 模板格式
- 建议不采用全量参数训练,否则模型原始能力会遗忘较多
9. 领域评测集构建
建议准备两份评测集:
| 类型 | 用途 |
|---|---|
| 选择题形式 | 自动评测,方便模型初筛 |
| 开放形式 | 人工评测,用于精筛,任务形式更贴近真实场景 |
10. 领域词表扩增是否有必要?
词表扩增主要解决的是解码效率问题,对模型效果的提升有限。扩充中文词表后,可以增量模型对中文的理解能力。
11. 如何训练自己的大模型?
标准两阶段流程:
| 阶段 | 内容 |
|---|---|
| 第一阶段 | 扩充领域词表,在海量领域文档上二次预训练 LLaMA |
| 第二阶段 | 构造指令微调数据集,做 FT + LoRA SFT |
低成本方案:两阶段都使用 LoRA 训练。全参微调 7B 需要 8×A100,LoRA 仅需单卡 3090。
12. 训练中文大模型的经验(链家 BELLE 技术报告)
消融实验结论:
- 扩充中文词表后,模型中文理解能力增强
- 数据质量越高,模型效果越好
- 加入中文数据的语言分布后效果更优
- 数据规模越大且质量越高,效果提升最明显
13. 指令微调的好处
- 对齐人类意图:理解自然语言对话,更有人情味
- 效果提升显著:各应用准确度可从 83% 提升至 95%,错误率降低 50%;数学题正确率提高 2-4 倍
- 高效:在 175B 大模型上微调,无需从头训练
14. 预训练 vs 微调:知识注入的阶段
- 预训练阶段注入知识
- 微调是将通用知识与特定任务结合,使模型在特定任务上表现更好
两者从实现方式上并无本质差异,都是 Decoder-only 语言模型训练。如果样本集小且无大量篇章数据,仅微调也可注入知识。
15. 多轮对话任务如何微调?
以 ChatGLM-6B 为例,其采用简单方式:将上一轮对话直接放入下一轮的 Input 中。
python
>>> response, history = model.chat(tokenizer, "你好", history=[])
>>> response, history = model.chat(tokenizer, "再问一个问题", history=history)优点:实现简单
缺点:随轮数增加,History 存储的对话增多,Max Length 增大,可能出现爆显存。
优化方案:
- 对历史对话做文本摘要
- 将历史对话做成 Embedding
- 任务型对话:将用户意图和槽位作为上一轮信息传递
16. 灾难性遗忘
灾难性遗忘指模型学习新知识后几乎彻底遗忘之前习得的内容。
对于已完成 SFT-RLHF 的 Chat 模型(如 ChatGLM-6B),新增一类指令数据通常不会导致灾难性遗忘,因为:
- 微调数据量相对较少
- 微调任务类型单一
预防措施:微调初始学习率设置不宜过高(lr=2e-5 或更小),不应大于预训练时的学习率。
17. SFT 时模型在学什么?
SFT 的逻辑与预训练过程一致,但通过构造高质量问答语料,高效教会模型问答技巧。关键区别:
- 预训练:计算所有 Token 的损失(包括问句)
- SFT:只计算答句的损失,问句部分损失被 Mask 掉
18. Batch Size 设置
太小的问题
梯度更新方差大,主要是噪声,个别更新可能无效。
太大的问题
任何两组抽样数据几乎完全匹配真实梯度,增加 Batch Size 几乎不会改善性能,反而增加总 FLOPS。
最优设置
存在数据并行的临界点,找到该点可有效平衡训练效率和模型效果。
OpenAI 研究发现:
- 无论估计多准确,总存在最大步长
- Batch Size 越大,可用的优化步长越大(有上限)
- 使用更大 Batch Size 通常需要较少训练 Step,但当 Batch Size 超过临界值时,性能随 Batch Size 增加而降低
19. 模型结构建议
| 组件 | 推荐方案 |
|---|---|
| 模型结构 + 训练目标 | Causal Decoder + LM |
| Layer Normalization | Pre RMS Norm |
| 激活函数 | GeGLU 或 SwiGLU |
| Embedding 后 Layer Norm | 不添加,否则影响 LLM 性能 |
| 位置编码 | RoPE(应用更广泛)或 ALiBi |
| 偏置项 | 去除 Dense 层和 Layer Norm 的偏置项,提升稳定性 |
20. 训练配置建议
| 参数 | 推荐值 |
|---|---|
| Batch Size | 选用很大的 Batch Size,动态增加策略(GPT-3:32K → 3.2M tokens) |
| 学习率调度 | 先 Warmup 线性增长,再余弦衰减至 10%,最大值 5e-5 ~ 1e-4 |
| 梯度裁剪 | 1.0 |
| 优化器 | AdamW,权重衰减系数 0.1 |
| 混合精度 | bfloat16(非 float16) |
21. Loss 突刺(Loss Spike)
现象
在 100B 以上大模型预训练中出现 Loss 突然暴涨,可能导致模型需要很长时间恢复,甚至再也无法收敛。
原因
与 Adam 优化器特性有关:浅层网络参数突然进入长时间未更新的状态,与深层参数形成连锁反应,使模型进入非稳态。
解决方案
- 常规方案:找到 Loss Spike 前最近的 Checkpoint,更换后续训练样本
- 减小 Learning Rate(治标不治本)
- 减小 ε 值或重新定义 v_t=0 时的值
- 浅层梯度缩放(GLM-130B):将浅层梯度乘以缩放系数 α 减小更新值
- ε 和 α 衰减:随训练过程逐渐减小