Skip to content

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. 指令微调的好处

  1. 对齐人类意图:理解自然语言对话,更有人情味
  2. 效果提升显著:各应用准确度可从 83% 提升至 95%,错误率降低 50%;数学题正确率提高 2-4 倍
  3. 高效:在 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 NormalizationPre 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 优化器特性有关:浅层网络参数突然进入长时间未更新的状态,与深层参数形成连锁反应,使模型进入非稳态。

解决方案

  1. 常规方案:找到 Loss Spike 前最近的 Checkpoint,更换后续训练样本
  2. 减小 Learning Rate(治标不治本)
  3. 减小 ε 值或重新定义 v_t=0 时的值
  4. 浅层梯度缩放(GLM-130B):将浅层梯度乘以缩放系数 α 减小更新值
  5. ε 和 α 衰减:随训练过程逐渐减小