【大模型面试突击】06_预训练与微调

2026大模型面试:预训练与微调必考28题(含答案)

精选自148道采集题目,保留最高频最核心的28题 | 难度:⭐基础 ⭐⭐进阶 ⭐⭐⭐深入

答案风格:一句话秒答 → 展开来说 → 面试加分


一、预训练基础与Scaling Laws(6题)

1. ⭐⭐ [高频] 预训练和微调哪个阶段注入知识?预训练学到了什么,SFT又学到了什么?

一句话秒答: 预训练灌知识,SFT教说话方式------前者是上大学,后者是学面试技巧。

展开来说:

你可以这样理解------预训练就是让模型拿着几万亿token的语料疯狂"阅读",通过next token prediction这个看似简单的目标,模型把语法、常识、世界知识、逻辑推理能力都内化了。这个阶段才是真正"长本事"的阶段。

SFT(有监督微调)本质上就是"学格式"。模型其实已经知道答案了,但它不知道你想让它用什么方式说出来。SFT就是教它:人类问了问题,你应该这样组织语言来回答。

举个特别直观的例子:一个读了很多书的天才少年,学识渊博但完全不会应试答题。SFT就是给他做几套真题,让他知道"简答题要分点作答"。Llama的论文里验证了这一点------几千条高质量SFT数据就够了,因为知识早就在预训练阶段搞定了。

面试加分: 如果面试官追问"那RLHF/DPO呢?",你可以说:预训练学知识、SFT学格式、RLHF学价值观------这三步是大模型训练的"三段式"标准流程。能说出这个框架,说明你对全链路有认知。


2. ⭐⭐ [字节/阿里/高频] 什么是Scaling Law?OpenAI的Scaling Law和Chinchilla Scaling Law核心结论各是什么?对训练实践有什么指导意义?

一句话秒答: Scaling Law揭示了"模型越大、数据越多、算力越强,Loss就越低"的幂律关系------但关键分歧在于钱该怎么花。

展开来说:

2020年Kaplan团队(OpenAI)发了第一版Scaling Law,结论很明确:模型性能(Loss)跟参数量N、数据量D、计算量C各自呈幂律关系。他们的建议是------算力预算有限的话,优先把模型做大,数据可以相对少一些。当时很多人照这个思路搞出了一堆"大而饿"的模型。

然后2022年DeepMind的Chinchilla论文直接打脸了------他们发现参数和数据应该同比例扩大,最优配比大约是 D≈20ND \approx 20ND≈20N,也就是1B参数对应20B tokens。这意味着之前GPT-3(175B参数,300B tokens)其实是严重"喂不饱"的。

这个结论的实际影响巨大------LLaMA系列就是按Chinchilla思路走的:用更小的模型吃更多数据,7B模型吃了1T tokens,性价比碾压同等算力下的大模型。

记住一个万能公式:C≈6NDC \approx 6NDC≈6ND(前向+反向的FLOPs近似),面试手算模型训练成本全靠它。

面试加分: 提一句最新进展------2024-2025年的研究开始关注"推理时Scaling Law"(inference-time scaling),发现在推理阶段投入更多计算(比如CoT、多次采样)也能提升效果,这是OpenAI o1/o3系列的理论基础。


3. ⭐⭐ [高频] 什么是大模型的"涌现能力"(Emergent Abilities)?涌现能力与Scaling Law之间有何关系?

一句话秒答: 涌现能力就是"小模型完全不会、大模型突然就会了"的相变现象------但它到底是真涌现还是度量伪象,学界还在吵。

展开来说:

涌现能力最早由Google在2022年的论文中系统梳理,指的是:当模型规模低于某个阈值时,某些能力表现接近随机猜测;一旦超过这个阈值,能力突然"跳"出来了。典型例子包括思维链推理(CoT)、多步算术、指令跟随、代码生成等。

它和Scaling Law的关系很有意思------Scaling Law预测的是一条平滑的幂律曲线(Loss越来越小),但涌现表现为断崖式的"相变"。这俩并不矛盾,核心在于:底层的Loss确实是平滑下降的,但当你用accuracy这种0/1指标去评估时,可能在某个点出现"全错→全对"的跳变。

2023年斯坦福有篇很出名的论文说:"换用连续指标(比如perplexity)之后,涌现现象就消失了。" 暗示涌现可能只是度量方式造成的伪象。这个观点引发了巨大争议,但也提醒我们------评估指标的选择本身就会影响我们对模型能力的判断。

面试加分: 工程层面的启示是------你不能用7B模型的实验结果线性外推70B模型的能力。很多capability在小模型上测不出来,必须实际scale up验证。这也是为什么大厂舍得烧钱训大模型------他们在赌涌现。


4. ⭐⭐ [字节/高频] 想让模型学习某个领域或行业的知识,是应该预训练还是应该微调?

一句话秒答: 两步走------增量预训练灌知识,SFT教任务格式。单靠SFT学不了新知识,单靠预训练不会说人话。

展开来说:

这个问题面试出现频率极高,答案取决于你的领域和通用语料的"距离"。

如果你做的是医疗、法律、金融这种和日常语言差异很大的垂直领域,那光SFT肯定不够------模型根本没见过那些领域知识,你不可能通过几千条问答对就把整本《内科学》灌进去。这时候需要增量预训练(Continue PreTrain),拿领域语料继续做next token prediction,让模型先"读完这些专业书"。

如果你的需求只是让模型换个说话风格、按特定格式输出,那SFT就完全搞定了。比如让通用模型输出JSON格式、写特定风格的文案------知识模型已经有了,只需要调格式。

推荐的标准流程是:通用预训练 → 领域增量预训练 → 领域SFT → (可选)DPO/RLHF对齐

有一个特别容易踩的坑:增量预训练时必须混入10%-30%的通用数据(如Wikipedia、书籍),否则会灾难性遗忘,模型学完了领域知识但忘了怎么说中文。

面试加分: 补充一个2025年的新趋势------很多团队开始用RAG替代增量预训练来注入领域知识,因为RAG不需要训练、知识可以实时更新。但对于需要深度理解和推理的场景(如医疗诊断),增量预训练+SFT仍然是不可替代的。


5. ⭐⭐ [高频] 预训练时混合精度训练(FP16/BF16/TF32)的原理是什么?为什么需要混合精度训练?

一句话秒答: 用半精度算前向/反向省显存加速度,用全精度存权重保精度------鱼和熊掌都要。

展开来说:

混合精度训练的核心思路特别朴素:计算用便宜的(16bit),存关键东西用贵的(32bit)。

几种精度你必须烂熟于心:

精度 位宽 指数位 尾数位 一句话特点
FP32 32bit 8 23 精度拉满,但慢且费显存
FP16 16bit 5 10 快且省,但动态范围小容易溢出
BF16 16bit 8 7 动态范围和FP32一样,精度差一些,大模型首选
TF32 19bit 8 10 A100+自动启用的折中方案

核心流程:FP32主权重 → 转成FP16/BF16做前向和反向计算 → 算出梯度后回到FP32更新权重。

为什么BF16是当前大模型的绝对主流?因为它的指数位和FP32一样(都是8位),意味着能表示的数值范围一样大,不会出现FP16那种动态范围不够导致的上溢/下溢问题。用FP16你还得搞loss scaling来防止梯度下溢,BF16直接免了这个麻烦。

面试加分: 如果你能随口说出"BF16是在A100之后才被广泛支持的,V100只支持FP16所以那个时代的论文都在讨论loss scaling问题"------面试官会觉得你确实训过模型,不是纸上谈兵。


6. ⭐⭐ [高频] 预训练中Gradient Checkpoint技术的原理是什么?如何在显存和计算之间做权衡?

一句话秒答: 用时间换空间------前向时扔掉中间激活,反向时重新算一遍,显存从 O(N)O(N)O(N) 降到 O(N)O(\sqrt{N})O(N ),代价是多花~30%时间。

展开来说:

正常训练时,前向传播要保存每一层的中间激活值(activations),因为反向传播算梯度需要用到它们。一个Transformer几十层,每层的激活值都存着,显存很快就爆了------尤其是batch size大、序列长的时候,激活值的显存占用甚至超过模型参数本身。

Gradient Checkpoint的策略很简单:我不全存了。只在每隔k层保存一个"检查点",其余层的激活全扔掉。反向传播算到某一层需要激活值时,从最近的检查点开始重新做一遍前向,把激活值算出来。

这是一个经典的时间-空间权衡:

  • k越大 → 存的越少 → 省显存越多 → 但重算越多 → 训练越慢
  • 实践中对Transformer一般每层或每2层设一个checkpoint,显存降到 O(N)O(\sqrt{N})O(N ),计算开销增加约30%

用法极其简单:PyTorch里一行 torch.utils.checkpoint.checkpoint() 搞定。几乎所有大模型训练都会开这个,它和混合精度训练并称"穷人两件套"。

面试加分: 还可以提一个进阶的------Selective Activation Recomputation(选择性重计算),只重算计算量小但显存占用大的部分(比如attention的softmax输出),计算量大但显存占用小的部分(比如线性层)正常存。Megatron-LM用了这个策略,比naive的gradient checkpoint更高效。


二、SFT有监督微调(5题)

7. ⭐⭐⭐ [字节/高频] 为什么SFT之后感觉LLM变傻了?可能的原因有哪些?

一句话秒答: SFT数据太烂或分布太窄,模型学会了"一本正经地说废话",同时忘了原来会的东西。

展开来说:

这个问题字节面试问了无数次了,因为它确实是工程实践中最让人头疼的问题之一。模型SFT完了一测试,某些能力反而变差了------你精心微调的模型还不如base model。原因通常有这几个:

第一,数据质量太差。 这是头号杀手。你的SFT数据里混入了错误答案、敷衍回复、或者GPT生成的"正确但空洞"的内容,模型就学会了这种"看起来像回答但实际没信息量"的模式。garbage in, garbage out。

第二,灾难性遗忘。 你的SFT数据覆盖的领域太窄------比如全是客服对话------模型拼命适配这个分布,结果把预训练时学的数学能力、代码能力、常识推理全忘了。

第三,对齐税(Alignment Tax)。 为了安全对齐,模型被训练成了"什么都拒绝"的模式。用户问什么都回"作为一个AI我不能..."。安全过头就是能力退化。

第四,能力假象。 有时候base model其实有能力,只是输出格式不对看起来像不会。SFT后格式对了但某些底层能力确实被覆盖了------看起来像"变傻了"。

面试加分: 解决方案的优先级是:提高SFT数据质量(第一优先级)> 混入通用数据(防遗忘)> 用LoRA代替全参数微调(从结构上减少对原始参数的改动)> 减少epoch数(防过拟合)。能按优先级排出来,说明你踩过坑。


8. ⭐⭐ [高频] SFT数据的质量和数量哪个更重要?为什么?

一句话秒答: 质量碾压数量,1000条好数据吊打10万条垃圾------因为SFT本质是学格式不是学知识。

展开来说:

LIMA那篇论文名字就叫"Less Is More for Alignment",用区区1000条精心标注的数据做SFT,效果就非常好了。为什么?因为SFT的本质不是让模型学新知识(知识在预训练阶段已经搞定了),而是教模型用人类期望的格式来表达已有知识。这件事不需要海量数据。

数据质量的维度包括:指令清晰不含糊、答案正确无事实错误、多样性好(覆盖不同任务类型)、难度适中(太简单学不到东西)、格式一致(别一会儿markdown一会儿纯文本)。

低质量数据的危害是直接的------错误答案会直接"教坏"模型(模型不会鉴别对错,你喂什么它学什么);同质化数据导致过拟合和多样性崩塌(模型对什么问题都给相似的回答)。

面试加分: 实践中的建议是:先花80%的精力精标1k-10k高质量数据跑baseline,看看效果到什么水平。效果不够再有针对性地扩量------哪个能力弱就补哪类数据,而不是无脑加量。可以用GPT-4o等强模型辅助生成+人工审核的方式来控质保量。


9. ⭐⭐ [高频] 多轮对话任务如何微调模型?history字段如何拼接处理?

一句话秒答: 把整个对话历史拼成一条序列,只对assistant的回复计算loss,其余部分全部mask掉。

展开来说:

多轮对话微调的核心就三步:拼接、mask、截断。

拼接: 按模型对应的chat template格式把多轮对话组装起来------[System] + [User1] + [Assistant1] + [User2] + [Assistant2] + ... 这样首尾相连。不同模型的模板格式不一样,ChatML用<|im_start|><|im_end|>,Llama2用[INST][/INST],千万不能搞混。

Mask Loss: 这是关键------只对每轮Assistant的输出token计算loss,System提示和User输入的label全部设为-100(PyTorch的ignore_index)。为什么?因为我们要教模型"怎么回答",而不是教它"怎么提问"。

截断: 多轮对话拼起来很容易超过max_length。策略是从前面截断(扔掉最早的几轮对话,保留最近的),因为最近的上下文通常更重要。也有人用sliding window的方式。

面试加分: 一个容易被忽略的细节------推理时必须严格使用和训练时一模一样的chat template,包括每一个特殊token和换行符。模板不匹配是线上效果和离线评测差距大的头号原因之一。很多同学debug半天发现是模板拼错了。


10. ⭐⭐ [高频] 全参数Finetune与参数高效微调(LoRA、P-Tuning等)各适用于什么场景?

一句话秒答: 有钱有卡有大数据用全参数,其他情况一律LoRA------工业界95%的微调需求LoRA都能搞定。

展开来说:

维度 全参数微调 LoRA/PEFT
显存 极高(参数+梯度+优化器状态全存) 低(只更新1%-5%参数)
效果上限 最高 接近全参数(95%+水平)
适用场景 数据充足、任务差异大、追求极致效果 数据较少、资源有限、快速迭代
多任务部署 每个任务一份完整模型副本 同一个基座挂多个adapter,热切换

全参数微调的核心优势是表达力没有天花板------所有参数都在动,能彻底改变模型行为。但代价也大:7B模型全参数微调就需要112GB+显存(后面第11题会详细算),而且每个下游任务都得存一份完整模型。

LoRA的核心优势是性价比------训练快、省显存、adapter小(通常只有几十MB)、推理时可以把低秩矩阵合并回原权重所以零额外推理开销。在数据量不大的场景下甚至有类似正则化的效果,泛化可能更好。

面试加分: 说一个真实的工程决策------某些场景你需要同时服务20个不同客户的定制化模型,全参数微调意味着20份完整权重,LoRA意味着1份基座+20个小adapter。从部署成本和运维复杂度看,LoRA完胜。


11. ⭐⭐⭐ [高频] 如果想要在某个模型基础上做全参数微调,究竟需要多少显存?如何计算?

一句话秒答: Adam优化器下,全参数微调显存约等于参数量乘以16-20字节------7B模型至少要112GB。

展开来说:

这道题是硬核计算题,面试官想看你对训练显存构成有没有清晰认知。以FP16/BF16混合精度 + Adam优化器为例,设参数量为N:

  • 模型参数(FP16): 2N2N2N 字节 ------ 前向/反向计算用的那份
  • FP32主权重副本: 4N4N4N 字节 ------ Adam更新时用的精确副本
  • Adam的m状态(一阶矩): 4N4N4N 字节 ------ FP32存储
  • Adam的v状态(二阶矩): 4N4N4N 字节 ------ FP32存储
  • 梯度(FP16): 2N2N2N 字节
  • 总计 = 16N16N16N 字节(不含激活值!)

然后激活值(中间计算结果)另算,这块取决于batch size和序列长度,经常是大头。开了gradient checkpoint可以大幅降低激活值占用。

来算个具体的:7B模型 → 7×109×16=1127 \times 10^9 \times 16 = 1127×109×16=112 GB。A100-80G一张装不下,至少要2张。加上激活值就更多了。

换成LoRA的话,假设只训练1%的参数(70M),优化器状态和梯度只需要存这70M参数的------显存直接降到单张24G消费级GPU可训。

面试加分: 如果面试官追问"那用DeepSpeed ZeRO能怎么优化?"------ZeRO-1切分优化器状态,ZeRO-2再切梯度,ZeRO-3连参数都切。8张A100用ZeRO-3可以训70B模型。能接住这个追问,说明你做过分布式训练。


三、LoRA与QLoRA(6题)

12. ⭐⭐ [高频] LoRA的核心思想和技术原理是什么?为什么权重矩阵在微调后具有很低的本征秩?

一句话秒答: 微调时权重的变化量 ΔW\Delta WΔW 是低秩的,所以用两个小矩阵 B×AB \times AB×A 来近似它------参数量压缩100倍+。

展开来说:

LoRA的直觉特别优美:预训练模型已经很好了,微调只需要在参数空间里做一点"微调整",而这个调整量 ΔW\Delta WΔW 的有效秩(intrinsic rank)非常低。既然如此,为什么要用一个 d×dd \times dd×d 的满秩矩阵来存储它?直接用低秩分解 ΔW=BA\Delta W = BAΔW=BA 就行了。

具体做法:原始权重 W0W_0W0 完全冻结不动,旁边挂一个旁路------B∈Rd×rB \in \mathbb{R}^{d \times r}B∈Rd×r 和 A∈Rr×dA \in \mathbb{R}^{r \times d}A∈Rr×d,其中 rrr 远小于 ddd(比如 d=4096,r=16d=4096, r=16d=4096,r=16)。前向计算变成:

h=W0x+αrBAxh = W_0 x + \frac{\alpha}{r} BAxh=W0x+rαBAx

那 ΔW\Delta WΔW 为什么是低秩的?因为预训练已经把模型推到了一个很好的解空间,微调只需要在这个解空间的一个低维子空间里做小幅度移动。打个比方:你已经站在山顶附近了,调整方向只需要在一个小平面上挪动,不需要在整个三维空间里搜索。

参数量对比算一下就知道多猛:d=4096,r=16d=4096, r=16d=4096,r=16 时,ΔW\Delta WΔW 有 40962=16.8M4096^2 = 16.8M40962=16.8M 参数,LoRA只需要 (4096×16)×2=131K(4096 \times 16) \times 2 = 131K(4096×16)×2=131K 参数,压缩了128倍。

面试加分: 提一个LoRA的隐藏优势------推理时可以直接把 BABABA 加回 W0W_0W0,得到 W′=W0+BAW' = W_0 + BAW′=W0+BA。合并后的模型和原始模型架构完全一样,推理没有任何额外开销。这是LoRA比Adapter等方法的重要优势。


13. ⭐⭐ [高频] LoRA中两个新增矩阵的权重如何初始化?为什么A用高斯初始化、B用零初始化?

一句话秒答: B零初始化+A随机初始化,保证训练开始时 BA=0BA=0BA=0------从预训练权重的"黄金起点"出发,而不是加一堆随机噪声。

展开来说:

这个设计背后的思想很简单但很关键:训练开始的第一步,模型的输出应该和原始预训练模型完全一致。

如果 B=0B=0B=0,那不管 AAA 是什么,BA=0BA = 0BA=0,模型的输出就是 W0x+0=W0xW_0 x + 0 = W_0 xW0x+0=W0x------完美保留预训练的起点。然后在训练过程中,BBB 从零开始慢慢学,ΔW\Delta WΔW 从零开始慢慢长大。

如果你把两个矩阵都随机初始化会怎样?BABABA 一上来就是一个随机噪声矩阵,直接加在 W0W_0W0 上,模型第一步的输出就被污染了。预训练花那么大代价学到的好权重,一开局就被你搞废了------后面要多花很多步才能"恢复"到一个合理的状态。

至于为什么是B=0而不是A=0?数学上完全对称,两个都可以。惯例是B零初始化、A用高斯或Kaiming初始化,没有本质区别,关键是乘积为零就行。

还有个重要的配件------缩放因子 α/r\alpha / rα/r,用来控制LoRA更新的幅度。常见设置是 α=2r\alpha = 2rα=2r 或固定 α=32\alpha = 32α=32。α\alphaα 越大,LoRA的影响越大;rrr 越大,相当于每个方向的影响被"稀释"了,所以要除以 rrr。

面试加分: 最新的DoRA(2024)把权重分解成方向和大小两个部分分别更新,比标准LoRA在很多任务上效果更好。如果你知道这个变体并能说清楚motivation,说明你跟进了PEFT领域的最新进展。


14. ⭐⭐ [字节/高频] LoRA应用于Transformer的哪些权重矩阵?同时调整Wq和Wv效果是否最佳?

一句话秒答: 原论文说Wq+Wv最佳,但2024年的实践共识是------对所有线性层都加LoRA,效果更好。

展开来说:

一个标准的Transformer层有这些线性层可以挂LoRA:

  • 注意力层:Wq,Wk,Wv,WoW_q, W_k, W_v, W_oWq,Wk,Wv,Wo(4个)
  • FFN层:Wup,Wgate,WdownW_{up}, W_{gate}, W_{down}Wup,Wgate,Wdown(3个,LLaMA架构)

2021年LoRA原论文的实验结论是:在相同参数预算下,同时对 WqW_qWq 和 WvW_vWv 加LoRA效果最佳------比单独加一个或者加 WkW_kWk 都好。但这个结论是在GPT-2/3上做的,参数预算也比较小。

后来QLoRA论文和大量实践(尤其是LLaMA系列模型)发现了一个更好的策略:把LoRA加到所有线性层上,然后适当降低r值来控制总参数量。比如原来只加Wq+Wv用r=32,现在7个线性层都加但r用8------总参数量差不多,但效果更好。

道理也好理解:与其把表达能力集中在两个矩阵上,不如分散到所有层,让每个层都有一点调整空间。

面试加分: 工程上用LLaMA-Factory的话,target_modules 直接设成 all(所有线性层),这是2024-2025年的默认最佳实践。如果面试官问"你平时怎么设的?"你说"all linear, r=16, alpha=32",这就是标准答案。


15. ⭐⭐ [高频] LoRA中秩r一般如何选择?增加r是否一定能提升效果?

一句话秒答: r一般4到64,r=16是万能默认值------增加r有收益递减,超过本征秩之后就是纯噪声。

展开来说:

LoRA原论文做了一个非常漂亮的消融实验:r从1到64,效果在r=4的时候就已经非常好了,r=64和r=4的差距微乎其微。这说明微调时的权重变化确实是极低秩的。

选择指南:

  • 简单任务/数据少(<5k条): r=8~16,再大就过拟合了
  • 中等任务/数据适中(5k-50k条): r=16~32
  • 复杂任务/数据充足(50k+): r=32~64
  • 万能默认值: r=16,别想太多先跑起来

为什么不是越大越好?因为 ΔW\Delta WΔW 的本征秩就那么大(可能就是个位数到十几),r超过本征秩后,多出来的那些维度学到的都是噪声------不但不帮忙,还可能引入过拟合。

还有个成本角度:r翻倍 → LoRA参数量翻倍 → 训练显存和时间增加。虽然推理时合并回原权重后没有额外开销(W′=W0+BAW' = W_0 + BAW′=W0+BA 和原来维度一样),但训练成本是实打实的。

面试加分: 一个高级技巧是AdaLoRA------自适应地给不同层分配不同的秩,重要的层分高秩,不重要的层分低秩。但实践中大家发现统一r=16然后加到所有层,效果和AdaLoRA差不多,而且简单得多。工程中"简单有效"永远是第一优先级。


16. ⭐⭐⭐ [高频] QLoRA的三项关键技术是什么?(4bit NormalFloat、双量化、分页优化器)

一句话秒答: QLoRA = 4bit量化存模型 + LoRA做微调------三板斧是NF4量化、双量化、分页优化器,让65B模型在单张48G卡上跑起来。

展开来说:

QLoRA是2023年的里程碑工作,彻底降低了大模型微调的门槛。它的核心思想很直接:基座模型用4bit量化来存储(极致省显存),在量化后的模型上做LoRA微调。三项关键技术分别解决三个问题:

第一,4-bit NormalFloat(NF4): 这是QLoRA最有创意的部分。作者观察到预训练后的权重分布接近正态分布,于是设计了一种"信息论最优"的4bit量化格式:把4bit的16个量化级别按正态分布的分位点来分配。比INT4和FP4的量化误差更小,因为它是专门为神经网络权重分布"定制"的。

第二,双量化(Double Quantization): 量化时每64个参数共享一个FP32的scale factor------这些scale factor本身也占显存。双量化就是对这些scale factor再做一次量化(FP32 → 8bit),每个参数额外节省约0.37bit。看起来不多,但65B模型下省出来的就是好几GB。

第三,分页优化器(Paged Optimizer): 利用NVIDIA的统一内存管理(Unified Memory),当GPU显存不够时,优化器状态自动卸载到CPU内存。这样即使GPU塞不下全部的优化器状态也不会OOM,只是偶尔跑慢一点。

效果:QLoRA在Guanaco 65B上达到ChatGPT的99.3%水平,仅用单张48G GPU。

面试加分: QLoRA的反向传播有个巧妙之处------前向时把4bit权重反量化成BF16来计算,算出梯度后只更新LoRA参数(正常精度),基座的4bit权重从头到尾不动。所以量化误差不会在梯度更新中累积。


17. ⭐⭐ [高频] LoRA和全参数微调如何选择?LoRA的优点和劣势分别是什么?

一句话秒答: 默认选LoRA,只有数据100万条以上且追求极致效果时才考虑全参数微调。

展开来说:

先把LoRA的优点摊开来看:

  1. 省显存: 约全参数的1/4到1/8,7B模型单张24G卡就能跑
  2. Adapter热插拔: 一个基座挂N个adapter,按需切换------做多租户服务的时候简直是救命的
  3. 零推理开销: 训完把BA合并回W,推理时和原模型一模一样,没有任何额外计算
  4. 小数据友好: 低秩约束天然起到正则化作用,数据少的时候反而比全参数泛化更好

再看劣势:

  1. 效果上限有天花板: 大数据量+复杂任务时,低秩约束会限制表达能力
  2. 大幅改变行为困难: 如果你要让英文模型变成流畅的中文模型,LoRA那点参数可能不够
  3. 需要调参: r和target_modules的选择有时候会影响效果

决策的经验法则特别简单:

  • 数据 < 10万条 → 无脑LoRA
  • 数据10万-100万条 → LoRA先跑baseline,效果不够再考虑全参数
  • 数据 > 100万条且算力充足 → 全参数微调可能更好

面试加分: 实际工业场景中还有一个选LoRA的"隐藏理由"------可追溯性和可回滚。全参数微调后模型是个黑箱,出了问题你不知道是哪里变了。LoRA的adapter可以随时摘掉回到base model,也可以对比不同adapter的效果。在生产环境中这种可控性非常重要。


四、其他PEFT方法与综合对比(4题)

18. ⭐⭐ [高频] Prefix Tuning的工作原理是什么?针对自回归和编码器-解码器架构分别如何构造Prefix?

一句话秒答: 在每层Transformer的K和V前面拼接一段可学习的虚拟token,冻结原模型全部参数------相当于给模型每一层都戴了一副"有色眼镜"。

展开来说:

Prefix Tuning的核心思路:与其去动模型的参数,不如在每一层注意力机制的输入上做手脚。具体来说,在每一层的Key和Value矩阵前面拼接一段可学习的向量 PK,PV∈Rl×dP_K, P_V \in \mathbb{R}^{l \times d}PK,PV∈Rl×d(lll 是prefix长度,通常10-100),原模型的所有参数完全冻结。

模型做注意力计算时会"看到"这些虚拟前缀,等于在每一层都有一个"软性的任务提示"在引导注意力的分配。

不同架构的处理方式:

  • 自回归模型(GPT系列): 只在decoder的每一层前面加prefix
  • 编码器-解码器(T5/BART): encoder和decoder的每一层都加prefix

实现细节:prefix向量不是直接优化的,而是通过一个小MLP生成(reparameterization trick)。这样训练更稳定。训练完成后MLP可以扔掉,只保留最终的prefix向量。

面试加分: Prefix Tuning和Prompt Tuning的区别是高频追问------Prefix Tuning在每一层 都加前缀,表达力强但参数多;Prompt Tuning只在输入embedding层加,参数少但小模型上效果差。可以这样记:Prefix是"深度插入",Prompt Tuning是"浅层插入"。


19. ⭐⭐⭐ [高频] 请比较Prompt Tuning、P-Tuning、Prefix Tuning、P-Tuning v2的异同。这些方法中,哪些只在输入层加prompt,哪些在每层都加?

一句话秒答: 核心分界线就一条------只在输入层加的(Prompt Tuning、P-Tuning)vs 每层都加的(Prefix Tuning、P-Tuning v2),后者效果更好。

展开来说:

这四个方法名字容易搞混,但用一张表就清楚了:

方法 插入位置 怎么生成prompt向量 关键特点
Prompt Tuning 仅输入embedding层 直接作为参数优化 最简单,10B+模型才好使
P-Tuning 仅输入embedding层 LSTM/MLP编码器生成 比直接优化稳定,适配NLU
Prefix Tuning 每层的K,V前 MLP reparameterize 表达力最强,适合生成任务
P-Tuning v2 每层都加 类似Prefix Tuning P-Tuning的升级版,中小模型也行

核心规律:每层都加(深度插入)的效果 > 仅输入层(浅层插入)。原因很直觉------只在输入层加prompt,经过几十层Transformer之后信号早就被稀释了;每层都加等于持续施加影响。

Prompt Tuning有个有趣的发现:模型越大,仅在输入层加prompt的效果越接近全参数微调。原因可能是大模型本身的表达能力足够强,浅层的提示就够用了。但对于7B以下的模型,你必须用每层都加的方案。

面试加分: 在2024-2025年的工业实践中,上述四种方法基本都被LoRA取代了。但面试还是经常问------因为面试官想看你对PEFT方法全景的理解。你的回答应该是:先把四种方法说清楚,最后补一句"但目前工业界主流都用LoRA,上述方法更多是学术价值"。


20. ⭐ [高频] 参数高效微调方法可以分为哪几大类?每类的代表方法有哪些?

一句话秒答: 三大类------加东西的(Adapter/Prefix)、选参数的(BitFit)、重参数化的(LoRA)------LoRA一统天下。

展开来说:

PEFT方法的分类体系很清晰:

第一类:加法类(Additive) ------ 在模型里新增可训练参数

  • Adapter系列: 在Transformer层之间插入小瓶颈模块(Houlsby Adapter、AdapterFusion),down-project再up-project
  • Soft Prompt系列: Prompt Tuning、Prefix Tuning、P-Tuning,都是加可学习的虚拟token

第二类:选择类(Selective) ------ 从现有参数里选一部分来微调

  • BitFit: 只微调所有的bias项,其余全冻结。参数量极少但效果surprisingly decent
  • 选择性层微调: 只训练最后几层,或者只训练某些特定层

第三类:重参数化类(Reparameterization) ------ 用低秩分解等方式重新参数化权重更新

  • LoRA、QLoRA: 低秩分解权重更新矩阵
  • AdaLoRA: 自适应分配秩
  • DoRA: 分解成方向和大小分别更新

2024-2025年的现状:重参数化类(LoRA家族)占据了绝对主导地位。Adapter系列因为推理有额外开销被淘汰,Soft Prompt系列效果不稳定也很少用了。

面试加分: 如果被问到"为什么LoRA赢了?"------两个关键原因:(1) 推理时可合并回原权重,零额外开销;(2) 和现有训练框架完全兼容,不需要改模型结构。工程友好性是技术落地的第一要素。


21. ⭐⭐⭐ [高频] 高效微调技术的最佳实践有哪些?在实际项目中如何选择合适的微调方法?

一句话秒答: 先看卡、再看任务、最后看数据------90%的情况答案都是"用LoRA,r=16,所有线性层"。

展开来说:

实际项目中选微调方案,按这三步走:

第一步看资源:

  • 单张消费级GPU(16G-24G)→ QLoRA,别犹豫
  • 多卡A100/H100 → LoRA或全参数微调都行
  • 只有CPU → 别训了,用RAG或者In-Context Learning

第二步看任务:

  • 通用对话/指令跟随 → LoRA足够了
  • 注入深度领域知识(医疗/法律/金融)→ 先做增量预训练,再LoRA微调
  • 根本性地改变模型行为(如语言迁移)→ 全参数微调

第三步看数据:

  • < 1k条 → 别训了,用few-shot In-Context Learning
  • 1k - 100k条 → LoRA,r=16~32
  • 100k条 → 全参数微调或高r的LoRA都值得试

最佳实践清单(直接抄去用):

  • 默认配置:target_modules=all linear, r=16, alpha=32
  • 学习率:比预训练低1-2个数量级,SFT常用2e-5到1e-4
  • Epoch:3-5轮,用验证集监控,看到loss不降了就停
  • 数据质量的时间投入 > 调参时间 ------ 这是血泪教训

面试加分: 补一个高级实践------很多团队现在用"LoRA + 数据配比实验"的模式来迭代:先用LoRA快速跑几个版本(每个版本不同的数据配比),找到最优配比后再决定要不要上全参数微调。LoRA的训练速度优势让你可以做更多实验,这比闷头训一个大全参数模型更高效。


五、数据工程与Tokenizer(4题)

22. ⭐⭐ [高频] BPE、WordPiece、SentencePiece三种分词方法各有什么优缺点?如何选择?

一句话秒答: BPE是当前LLM分词的事实标准,SentencePiece是它的"语言无关"实现框架------面试只需要搞清楚这俩就够了。

展开来说:

先理清一个容易混淆的概念:BPE和WordPiece是分词算法 ,SentencePiece是工具框架(支持BPE和Unigram两种算法)。

方法 怎么合并 谁在用 核心特点
BPE 反复合并出现频率最高的字符对 GPT系列、LLaMA 贪心频率合并,简单暴力有效
WordPiece 合并能让语言模型似然最大的字符对 BERT 比BPE更"聪明"但计算更贵
Unigram LM 从大词表开始删,删掉损失增加最小的token T5、ALBERT 概率建模,支持多种分词结果

BPE的过程特别直观:从单字符开始,统计所有相邻字符对的出现频率,把最高频的合并成一个新token。反复做直到词表达到目标大小。比如 "l o w" 和 "l o w e r" 里 "l o" 出现最多,就合并成 "lo"。

SentencePiece的核心价值:直接在原始文本(raw text)上训练,不需要先做空格分词(pre-tokenization)。这对中文、日文这些没有空格的语言特别重要。所以中英文大模型基本都用 SentencePiece + BPE/Unigram。

面试加分: 如果被问到GPT-4用什么分词------它用的是tiktoken,基于BPE但做了大量工程优化(比如用正则预分割、扩大词表到100k+来提高多语言的编码效率)。能说出tiktoken这个名字就行。


23. ⭐⭐ [高频] 领域模型词表扩增是不是有必要的?什么场景下需要扩充词表?

一句话秒答: 不一定需要------只有领域文本被分得又碎又长的时候才值得折腾,否则弊大于利。

展开来说:

判断要不要扩词表,就看一个核心指标:编码效率(tokens per character ratio)。拿你的领域文本跑一下现有tokenizer,如果一段专业文本被切得稀碎(比如一个化学分子式被拆成10个token),那确实需要考虑扩词表了。

需要扩词表的场景:

  • 目标语言在原词表中覆盖极差------典型例子是早期LLaMA的tokenizer对中文极不友好,一个汉字被拆成3-4个byte token,同样的中文内容消耗的token数是英文的3倍,浪费算力和上下文窗口
  • 领域有大量专业术语被过度分割------化学(分子式)、法律(专业术语)、生物(基因序列)
  • 编码效率低导致序列过长,context window不够用

不需要扩词表的场景:

  • 领域术语被合理分割(2-3个token),且训练数据充足------模型能从上下文理解这些分割后的token组合

扩词表的代价不小:

  • 需要重新训练embedding层(新token没有embedding,必须初始化+增量预训练来学习)
  • 新词embedding的初始化是个技术难题------常用方案是用语义相近的已有token的均值来初始化

面试加分: 扩词表后一般需要做增量预训练来学习新token的embedding,训练量不能太少否则新token的表示学不好。Chinese-LLaMA就是扩词表的经典案例------在LLaMA基础上扩充了2万中文token,显著提升了中文编码效率和生成质量。


24. ⭐⭐⭐ [高频] 预训练数据的配比问题:不同来源数据(网页、书籍、代码、对话)如何配比?

一句话秒答: 没有银弹配比,但有个经验公式------网页60-70%、书籍10-15%、代码5-10%、其余杂粮搭配------然后质量比配比重要10倍。

展开来说:

预训练数据配比直接决定了模型的"能力分布"------你喂什么它就擅长什么。但这不是一个有标准答案的问题,各家的配比都不一样,只有一些被验证过的经验规律。

典型配比参考(LLaMA/GPT风格):

  • 网页(CommonCrawl清洗后):60-70% ------ 量最大,覆盖面最广
  • 书籍/学术论文:10-15% ------ 长文本理解、深度知识
  • 代码(GitHub):5-10% ------ 这个很关键,往下看
  • 百科/问答(Wikipedia、StackOverflow):3-5% ------ 高质量结构化知识
  • 对话数据:2-5% ------ 学习对话模式

几个被反复验证的经验规律:

  1. 代码数据能提升推理能力------即使你的模型不打算做代码任务,混入5-10%的代码数据也能显著提升逻辑推理和数学能力。原因可能是代码天然具有严密的逻辑结构。

  2. 高质量数据可以适度oversampling------好数据重复2-4次不会明显退化(LLaMA2就这么干的),但重复太多次会过拟合。

  3. 数据退火(Data Annealing)------训练后期增加高质量数据的比例,类似于"考前重点复习"。MiniCPM等模型用了这个策略并报告了显著收益。

面试加分: 一句话总结------"数据清洗比配比更重要"。去重(MinHash去重、exact dedup)、去低质(perplexity过滤、分类器过滤)、去有害内容------这三板斧是数据工程的基本功。很多团队花80%的时间在清洗上,只花20%在调配比。


25. ⭐⭐ [高频] 多轮对话数据如何处理成训练格式?ChatML模板是什么?

一句话秒答: ChatML用 <|im_start|><|im_end|> 标记每条消息的角色和边界------训练时按模板拼接,只对assistant部分算loss。

展开来说:

ChatML(Chat Markup Language)是OpenAI提出的一种多轮对话标准格式,现在已经被很多模型采用(Qwen系列就用ChatML)。长这样:

复制代码
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好<|im_end|>
<|im_start|>assistant
你好!有什么可以帮你的?<|im_end|>

几个关键设计:

  • <|im_start|><|im_end|>特殊token(不是普通文本),在tokenizer中有专门的ID
  • 每条消息的格式:<|im_start|>角色\n内容<|im_end|>\n
  • 支持system、user、assistant三种角色

训练时的处理流程:

  1. 按ChatML模板拼接所有轮次的对话
  2. Tokenize成token ID序列
  3. 构建labels:只对assistant部分的token设置label,其余(system、user、特殊token)全部设为-100
  4. 送入模型计算cross-entropy loss

其他常见模板:

  • Llama2格式: [INST] 用户消息 [/INST] 助手回复
  • Alpaca格式: ### Instruction:\n...\n### Response:\n...
  • Llama3格式: 用了新的special token <|begin_of_text|>

面试加分: 生产环境中一个极其常见的bug------训练时用了ChatML模板,推理时用了Llama格式(或者反过来),结果模型输出一坨乱码或无限重复。模板不匹配是部署后效果骤降的头号原因。永远记住:推理模板必须和训练模板严格一致。


六、训练稳定性与灾难性遗忘(3题)

26. ⭐⭐⭐ [高频] 大模型训练中Loss Spike(loss突然飙升)的原因有哪些?如何处理?

一句话秒答: Loss Spike通常是坏数据或梯度爆炸惹的祸------梯度裁剪是第一道防线,回滚checkpoint是最后一招。

展开来说:

大模型训练动辄几周甚至几个月,Loss Spike是最让人心态爆炸的事情之一------你看着loss曲线稳稳地下降,突然某个时刻spike一下飙上去了。严重的话模型就此发散训废了。

常见原因:

  1. 数据异常: 某个batch里混入了超长文本、乱码、重复数据、或者极端分布的样本。这是最常见的原因------数据清洗不干净迟早会在训练中暴雷。

  2. 梯度爆炸: 某些层的梯度突然变得很大,参数一步更新太猛。特别是在模型很深或者attention分布很尖锐的时候。

  3. 学习率问题: warmup阶段不够长就上了大学习率,或者lr schedule设置不当导致某个阶段lr过高。

  4. 数值溢出: FP16的动态范围就那么大,loss值或中间计算超出表示范围就直接NaN了。

处理方法(按优先级):

  1. 梯度裁剪(Gradient Clipping):max_norm=1.0,限制梯度的总范数不超过阈值。这是标准配置,几乎所有大模型训练都会开。

  2. 跳过异常batch: 实时监控每个batch的loss,发现异常大的直接skip不更新参数。

  3. 回滚重训: 从spike前的最近checkpoint恢复,跳过引发问题的数据继续训。这是最稳妥但也最浪费时间的方案。

  4. 降低学习率: 如果频繁spike,说明lr太激进了,整体降一个档位。

面试加分: GPT-3的论文里专门提到他们遇到了Loss Spike,用的策略是从spike前的checkpoint回滚,跳过那段数据继续训。Meta训LLaMA也遇到过类似的问题。这说明即使是顶级团队,Loss Spike也是训练中的常态------关键是有完善的监控和checkpoint机制来应对。


27. ⭐⭐ [高频] 微调后的模型出现能力劣化,灾难性遗忘(Catastrophic Forgetting)是怎么回事?如何缓解?

一句话秒答: 新任务的梯度把旧知识对应的参数覆盖了------缓解方法就是"边学新的边复习旧的"。

展开来说:

灾难性遗忘是神经网络的一个根本性问题:参数是共享的,学新东西的时候,新梯度会把之前学到的参数模式覆盖掉。这不是大模型特有的问题,从最早的多任务学习时代就有了。

在大模型语境下,最常见的表现是:你用法律数据微调了一个模型,法律问答能力飞速提升,但你一测通用能力------数学题不会做了、代码不会写了、中文也变得磕磕绊绊了。

缓解方法(按实用程度排序):

  1. 混合训练数据: 最简单也最有效------在微调数据中混入10%-30%的通用数据(如Wikipedia、书籍、通用对话),让模型"一边学新一边复习旧"。

  2. LoRA等PEFT方法: 从结构上釜底抽薪------原模型参数完全不动,所有改变都在旁路adapter里。这是最彻底的防遗忘方案。

  3. 降低学习率: 学习率越小,每步更新对原参数的改动越小,遗忘越轻。微调的lr通常是预训练lr的1/10到1/100。

  4. EWC(弹性权重巩固): 给"重要参数"(对旧任务贡献大的参数)加正则化,限制其更新幅度。理论优美但工程实现复杂,实际用的不多。

  5. 渐进式训练: 先用通用数据warmup几步,再逐渐增加领域数据的比例,给模型一个平滑过渡。

面试加分: 实践中最简单有效的组合是"LoRA + 数据混合"。LoRA本身就不动原参数(结构性防遗忘),再在SFT数据里混一些通用数据(数据性防遗忘),双保险。如果还遗忘------那说明你的任务确实需要全参数微调+大量混合数据了。


28. ⭐⭐ [高频] 为什么要增量预训练(Continue PreTrain)?与从零预训练有何区别?领域模型Continue PreTrain的数据如何选取?

一句话秒答: 站在巨人肩膀上训------用领域数据在通用基座上继续预训练,成本是从零训的1/100,但效果不差。

展开来说:

增量预训练的动机很朴素:从零训一个大模型需要万亿token级别的数据和天文数字的算力(GPT-3训一次花了几百万美元)。但如果你只是想让模型懂法律/医疗/金融,完全没必要从零开始------拿一个训好的通用基座,继续用领域数据做next token prediction就行了。

与从零预训练的核心区别:

维度 从零预训练 增量预训练
数据量 万亿token级 十亿-百亿token级
算力 数千张GPU训几个月 几十张GPU训几天-几周
目标 获得通用语言能力 在通用能力基础上注入领域知识
学习率 较高(如1e-4) 较低(1e-5~5e-5)

数据选取原则:

  • 领域数据为主(60%-80%): 行业文档、论文、法规、案例、代码------越高质量越好
  • 通用数据为辅(20%-40%): Wikipedia、书籍、通用对话------这是防止灾难性遗忘的关键!
  • 质量要求: 严格去重、清洗、去低质内容。领域数据的噪声问题通常比通用数据更严重

训练策略:

  • 学习率比初始预训练低一个数量级------因为模型已经在一个好的解空间了,学习率太大会把它推出去
  • 使用cosine decay lr schedule + 充分的warmup
  • 持续监控通用benchmark------如果通用能力掉得太狠,就增加通用数据的混合比例

面试加分: 一个进阶话题------2024-2025年出现了"continued pretraining vs RAG"的路线之争。RAG的优势是不用训练、知识可以实时更新;增量预训练的优势是知识被内化到参数里、推理更快更自然。目前的共识是二者互补:增量预训练搞定"基础领域认知",RAG负责"实时知识检索"。如果你能讲清楚这两条路线的trade-off,面试官会非常满意。


写在最后: 预训练与微调是大模型工程的两根支柱。面试中这28题覆盖了从Scaling Law到LoRA到数据工程的全链路核心知识。建议按"一句话秒答→展开来说→面试加分"三层来组织你的口头回答------先给结论让面试官知道你懂,再展开细节证明你真懂,最后抛出加分点让面试官觉得"这人有东西"。祝各位面试顺利,offer拿到手软。

相关推荐
SuperEugene2 小时前
前端模块化与 import/export入门:从「乱成一团」到「清晰可维护」
前端·javascript·面试·vue
indexsunny2 小时前
互联网大厂Java面试实录:Spring Boot与微服务在电商场景中的应用
java·jvm·spring boot·微服务·面试·mybatis·电商
SuperEugene2 小时前
Day.js API 不包含插件API的速查表
前端·javascript·面试
zheshiyangyang2 小时前
前端面试基础知识整理【Day-9】
前端·面试·职场和发展
Coder_Boy_2 小时前
Java高级_资深_架构岗 核心知识点全解析(通俗透彻+理论+实践+最佳实践)
java·spring boot·分布式·面试·架构
石去皿3 小时前
人工智能向量检索常见面试篇
面试·职场和发展
杰克·Pyo3 小时前
EWM 设计缺陷
职场和发展
努力学算法的蒟蒻3 小时前
day91(2.20)——leetcode面试经典150
面试·职场和发展
hqyjzsb12 小时前
企业AI人才库的搭建体系与长效运营管理方案
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·改行学it