大模型算法工程师一面面经
完整信息
本篇目录
1. 请做一下自我介绍
2. SFT 数据和偏好数据应该如何构建?怎样控制数据污染与分布偏移?
答案:
SFT 数据通常由 instruction、input、response 组成,目标是让模型学习任务格式、领域知识和回答方式。数据来源可以包括人工编写、业务历史数据、知识库改写和强模型蒸馏,但不能直接混合后训练。需要依次做规则清洗、语义去重、质量打分、难度分层、安全过滤和人工抽检。
偏好数据一般表示为 (prompt, chosen, rejected)。chosen 和 rejected 最好只在少数关键属性上存在差异,例如事实正确性、推理完整性或指令遵循,否则模型很难学到稳定的偏好边界。负样本不能全部来自明显错误的弱模型回答,还应加入事实基本正确但推理不完整、格式正确但没有解决问题等难负样本。
数据污染控制不能只做字符串去重。应同时使用规范化文本哈希、MinHash、向量召回和答案级匹配,检查训练集与验证集、测试集之间的近似重复。对于代码和数学题,还要检测变量改名、题面改写和答案模板复用。
分布偏移可以通过分桶统计发现,包括领域、长度、语言、难度、拒答比例和答案风格。训练采样比例不应简单等于原始数据比例,而应根据目标线上流量和能力短板进行重加权。
from dataclasses import dataclass
import hashlib
import re
@dataclass
class Sample:
prompt: str
response: str
domain: str
score: float
def normalize(text: str) -> str:
text = text.lower().strip()
text = re.sub(r"\s+", " ", text)
text = re.sub(r"[^\w\u4e00-\u9fff ]", "", text)
return text
def fingerprint(sample: Sample) -> str:
content = normalize(sample.prompt) + "\n" + normalize(sample.response)
return hashlib.sha256(content.encode("utf-8")).hexdigest()
def filter_samples(samples):
seen = set()
result = []
for sample in samples:
key = fingerprint(sample)
if key in seen or sample.score < 0.75:
continue
seen.add(key)
result.append(sample)
return result
3. 为什么 Decoder-only 模型的 KV Cache 缓存 K 和 V,而通常不缓存 Q?
答案:
自回归解码的第 (t) 步只会产生当前 token 的查询向量 (Q_t),它用于查询从第 1 个 token 到第 (t) 个 token 的键和值。历史 token 的 (Q) 不会再次参与后续 token 的注意力计算,因此缓存历史 (Q) 没有复用价值。
历史 (K) 和 (V) 会在每个后续解码步骤中被重复访问,所以需要缓存。若不使用 KV Cache,第 (t) 步必须重新计算前面所有 token 的 K、V,整个生成过程会产生大量重复计算。
单层 KV Cache 的元素数量近似为:
其中 2 表示 K 和 V,B 是批大小,L)是序列长度,Hkv 是 KV Head 数量,D 是 Head Dimension。显存占用还要乘以层数和数据类型字节数。
MQA 和 GQA 能降低 KV Cache,是因为多个 Query Head 共享一个或一组 KV Head。它们减少的是 KV Head 数,而不是 Query Head 数。代价是 KV 表达能力下降,尤其在长上下文和复杂检索任务上可能影响效果。
4. DPO 的目标函数是如何从 KL 约束的强化学习目标推导出来的?
答案:
DPO 不需要显式训练奖励模型,也不需要在线采样和 PPO 的价值网络,但它仍然依赖偏好数据质量和参考模型。β 较大时,会放大策略模型相对参考模型的隐式奖励差异;实际训练中,它也决定了偏好优化强度及策略偏离参考模型的程度。
import torch
import torch.nn.functional as F
def dpo_loss(
policy_chosen_logp,
policy_rejected_logp,
ref_chosen_logp,
ref_rejected_logp,
beta=0.1,
):
policy_ratio = policy_chosen_logp - policy_rejected_logp
ref_ratio = ref_chosen_logp - ref_rejected_logp
logits = beta * (policy_ratio - ref_ratio)
loss = -F.logsigmoid(logits).mean()
chosen_reward = beta * (
policy_chosen_logp - ref_chosen_logp
).detach()
rejected_reward = beta * (
policy_rejected_logp - ref_rejected_logp
).detach()
return loss, chosen_reward, rejected_reward
5. 如果训练过程完全正常,但离线评测结果突然下降,怎样定位是哪一个环节出现了问题?
答案:
首先冻结现场,不要立即重新训练。需要保存当前 checkpoint、配置文件、代码提交、数据版本、评测镜像和原始预测结果,然后与最近一次正常实验做单变量对比。
定位顺序通常是:
检查评测集版本、Prompt 模板、Tokenizer、停止词、解码参数和后处理逻辑。
使用同一个 checkpoint 分别运行新旧评测代码,判断问题属于模型还是评测链路。
使用新旧 checkpoint 运行同一套固定评测,确认能力下降从哪个训练阶段开始。
对比训练数据的数量、长度、领域占比、重复率、截断率和拒答比例。
检查是否加载了错误的 LoRA、EMA 权重、Tokenizer 或基础模型。
抽取能力下降最严重的样本,比较 token 级概率、输出长度、终止原因和格式解析结果。
对关键变量做消融复现,避免根据单次指标波动直接归因。
尤其要警惕“模型回答正确,但评测器判错”。例如输出模板变化、答案末尾多出解释、浮点误差或 Judge 模型版本变化,都可能导致结果下降。最终应使用金丝雀样本和固定环境回放,把训练、导出、部署、评测四段链路分别验证。
6. FlashAttention 为什么既能减少显存,又可能提升运行速度?它是否改变了注意力结果?
答案:
标准注意力会显式物化 N×N 的注意力分数矩阵,并在 HBM 与片上 SRAM 之间多次读写。FlashAttention 将 Q、K、V 分块加载到 SRAM,在块内完成矩阵乘法、mask、softmax 和与 V 的乘法,从而减少对高带宽显存的读写。
它的关键不是少做了注意力计算,计算复杂度仍然近似为O(N2d),而是降低了 IO 复杂度。现代 GPU 上注意力常受显存带宽限制,因此减少 HBM 访问后,速度反而更快。
为了避免保存完整分数矩阵,FlashAttention 使用 online softmax。对每一行持续维护当前最大值 m 和归一化因子 l,读取新块后对旧结果重新缩放:
理论上它计算的是精确注意力,不是稀疏近似。但由于浮点运算顺序、混合精度和 kernel 实现不同,结果可能存在很小的数值误差。Dropout 场景还需要可复现的随机数映射,否则反向重计算时无法恢复相同的 mask。
7. 在工业故障诊断大模型项目中,如何证明模型提升来自训练策略,而不是测试集污染或 Judge 偏差?
答案:
项目中的核心风险是维修工单和设备日志存在模板化内容,同一故障可能跨时间重复出现。如果随机切分数据,模型可能在训练集中见过高度相似的设备、错误码和维修结论。
因此数据应按照设备族、故障事件和时间窗口分组切分,保证同一事件链不会跨集合。随后使用文本指纹、MinHash 和向量召回检查近似重复,并单独建立一个发布时间晚于训练数据截止时间的时间外测试集。
评测不能只依赖单个 LLM Judge。故障分类、错误码识别等任务使用确定性指标;诊断解释由多个 Judge 交叉评分,并抽取分歧样本人工复核。Judge 输入中的模型名称和答案顺序需要隐藏,还要交换 A/B 答案位置,检测位置偏差。
训练策略的收益通过严格消融验证:固定基础模型、数据、训练步数、随机种子集合和解码参数,只替换一个训练变量。至少运行多个随机种子并报告均值、方差和置信区间。若某项策略只提升 Judge 分数,却没有提升人工评测、确定性任务或时间外测试集,则不能认为它带来了可靠收益。
8. MoE 的负载均衡损失为什么可能导致专家路由塌缩?如何设计更稳定的路由机制?
答案:
MoE 通常由 Router 为每个 token 计算专家分数,并选择 Top-K 专家。理想情况下,不同专家承担不同模式,同时负载相对均衡。问题是 Router 和专家共同训练,早期稍强的专家会获得更多 token,更多梯度又会让它继续变强,形成正反馈,最终导致路由塌缩。
常见辅助损失会同时约束专家接收 token 的比例和 Router 概率质量,例如:
其中 fi是分配给专家i的 token 比例,fi是平均路由概率。但辅助损失权重过大会干扰主任务,强迫本来就不均匀的数据分布均匀路由;权重过小又无法抑制塌缩。
更稳定的方案包括 Router z-loss、路由噪声、专家容量限制、丢弃或重路由
本篇目录
- 01
请做一下自我介绍
- 02
SFT 数据和偏好数据应该如何构建?怎样控制数据污染与分布偏移?
- 03
为什么 Decoder-only 模型的 KV Cache 缓存 K 和 V,而通常不缓存 Q?
- 04
DPO 的目标函数是如何从 KL 约束的强化学习目标推导出来的?
- 05
如果训练过程完全正常,但离线评测结果突然下降,怎样定位是哪一个环节出现了问题?
- 06
FlashAttention 为什么既能减少显存,又可能提升运行速度?它是否改变了注意力结果?
- 07
在工业故障诊断大模型项目中,如何证明模型提升来自训练策略,而不是测试集污染或 Judge 偏差?
- 08
MoE 的负载均衡损失为什么可能导致专家路由塌缩?如何设计更稳定的路由机制?