面灵AI→

华为大模型算法岗面经:LoRA、PPO 与 Transformer

时间
2026-09
来源
牛客网

《面试题目》

面经 01(面试时间 2026 年 9 月 17 日)

  1. 大模型数据如何清洗,数据集如何构建?
  2. LoRA 微调的原理是什么?
  3. 深度学习的前向传播、反向传播和参数更新如何工作?
  4. PPO、GRPO 和 DPO 的原理与区别是什么?
  5. 请介绍多模态模型和智驾多模态模型。
  6. VLA 和 ViT 的原理是什么?
  7. Transformer 和 Attention 的原理是什么?
  8. 算法:给定整数数组和整数 k,返回和为 k 的子数组最大长度;不存在时返回 0。
  9. 介绍实习和项目经历。
  10. 请做一下自我介绍。

原帖为连载合集,面经 02 的正文在牛客服务端即被截断,此处只保留已发布的部分。

《参考解析》

LoRA 微调的原理

LoRA 的假设是微调带来的权重变化是低秩的,因此不直接更新原权重 W,而是在旁边学一个低秩分解 ΔW = B·A,其中 A ∈ R^{r×d_in}、B ∈ R^{d_out×r},前向变成 h = Wx + (α/r)·B(Ax)。初始化上 A 用高斯、B 用全零,保证训练起点与原模型完全等价。可训练参数量从 d_out·d_in 降到 r(d_in+d_out),r 常取 864、α 常取 2r,target_modules 至少包含 q_proj 和 v_proj,想效果更好再加 k_proj、o_proj 和 FFN 的 gate/up/down。两个实践要点:LoRA 的学习率要比全量微调高一个量级(1e-43e-4);训练完可以把 α/r·BA 合并回原权重,推理零额外延迟,也可以不合并而用 vLLM 的多 LoRA 服务同时挂多个 adapter。

数据清洗与数据集构建

清洗分四类动作:去重(精确哈希 + MinHash/SimHash 近似去重 + 语义去重,重复语料会让模型记忆化)、质量过滤(长度、特殊符号比例、重复 n-gram 比例、困惑度等规则,加上 fastText 或教育性打分分类器)、安全与隐私(有害内容过滤,手机号/身份证/邮箱正则 + 命名实体脱敏)、格式规整(HTML 标签、乱码、编码统一)。配比上按通用 / 领域 / 指令分层,并对每类数据做消融看边际收益。数据集构建的原则是「先定评测再定数据」:先写 100~300 条评测样本,再针对模型暴露的弱项定向补数据。切分要按来源或时间去重后再切,防止同源样本泄漏;SFT 数据要控制模板多样性(同一任务的多种问法),并留一份完全同分布的 holdout 做回归。

前向传播、反向传播与参数更新

前向传播是逐层做线性变换加非线性激活,缓存每层的中间结果(激活值);反向传播用链式法则从损失往回算每层参数的梯度,复用前向缓存避免重算;参数更新由优化器执行,SGD 是 θ ← θ - lr·g,Adam 额外维护梯度的一阶动量 m 和二阶动量 v,做偏差校正后按 θ ← θ - lr·m̂/(√v̂ + ε) 更新,所以它要为每个参数存两份状态,显存开销是参数量的两倍(混合精度下还要存 fp32 主权重)。工程上要注意梯度累积与梯度裁剪(clip_grad_norm_ 常设 1.0)、学习率 warmup 加余弦衰减、以及梯度检查点用时间换显存。

PPO、GRPO 与 DPO 的区别

PPO 是 on-policy 的 actor-critic:用奖励模型给整条回复打分,用价值模型估计基线算优势,靠 clip 限制新旧策略的概率比(ε 常取 0.2)做近端更新,再加 KL 惩罚防止偏离参考模型太远;代价是要同时载 actor、critic、reward、reference 四张模型,显存和调参成本最高。GRPO 去掉了 critic:对同一个 prompt 采样一组(G 条)回复,用组内得分的均值(或标准化后的相对值)作为优势基线,省掉一张与策略同规模的模型,DeepSeek 系列用的就是它。DPO 更进一步,直接跳过奖励模型和 RL 循环:用偏好对 (chosen, rejected) 构造闭式损失,把隐式奖励表达成策略与参考策略的 log-ratio 之差,等价于在 KL 约束下优化 Bradley-Terry 偏好模型,只需要 policy 和 reference 两张模型,训练稳定且便宜,但依赖高质量偏好数据,也无法像在线 RL 那样用可验证奖励持续探索。选型上:有大量偏好对、求稳求省 → DPO;有可验证奖励(数学、代码)要在线探索 → GRPO;PPO 现在更多作为经典基线。

Transformer 与 Attention

每个 token 的表示投影出 Q、K、V,用 softmax(QKᵀ/√d_k) 得到权重后加权聚合 V,多个头并行再拼接、过输出投影,这就是多头自注意力;位置信息靠位置编码(正弦编码或 RoPE),每层是 attention 加 FFN(两个线性层夹一个激活,中间维度通常 4d),外面套残差和 LayerNorm(pre-norm 更容易训)。计算量 O(L²d) 是长上下文的瓶颈,改进方向有 FlashAttention(IO 感知分块,省显存但不改变数学结果)、滑动窗口或稀疏注意力、以及 GQA/MQA 减小 KV Cache。Decoder-only 结构用因果掩码保证只能看左侧,训练时 teacher forcing 一次并行算所有位置,推理时逐 token 自回归。

ViT 与 VLA

ViT 把图像切成 16×16 的 patch,每个 patch 线性嵌入(数学上等价于一个大 stride 的卷积)后加位置编码,再补一个类别 token,直接送进标准 Transformer 编码器;它缺少 CNN 的局部性和平移不变性归纳偏置,所以小数据上不如 CNN,通常靠 MAE 或 CLIP 式预训练补上。VLA(Vision-Language-Action)是把视觉和语言作为输入、直接输出动作序列的模型:视觉编码器(ViT / SigLIP)提取观测表征,语言骨干(LLM)做多模态推理,动作头把输出解码成动作——要么把动作离散化成 token 自回归生成,要么用 flow matching / diffusion 输出连续动作块。训练分两阶段:大规模机器人轨迹加图文数据做预训练,再针对具体本体和任务微调;评测看真实任务成功率和泛化(新物体、新指令、新环境),不能只看离线 loss。智驾多模态则额外强调时序(BEV 时序融合)、3D 空间感知和车端实时性约束。

和为 k 的最长子数组

数组里可能有负数,所以不能用滑动窗口(窗口和不再随右移单调)。正解是「前缀和 + 哈希」:令 prefix[i] 表示前 i 个元素之和,要找 prefix[j] - prefix[i] == k 且 j - i 最大。从左往右遍历 j,查询哈希表里是否存过 prefix[j] - k;哈希表里只记录每个前缀和第一次出现的下标,这样算出来的长度才最大;初始化为 {0: 0} 表示空前缀。时间 O(n)、空间 O(n)。几个口试要点:如果有零元素不影响正确性(下标记录的是首次出现);题目说「不存在返回 0」,要注意长度为 1 也是合法答案,别把返回值 0 和下标 0 搞混;如果改成「求子数组个数」就变成计数问题,哈希表要改成记录出现次数。