美团多面试
美团一面
美团每次面都很开心~
📍面试公司:美团
💻面试岗位:大模型
❓面试问题:
拷打实习
ppo和dpo的奖励函数计算方法
sft的数据来源
手撕lc 3
🙌面试感想:
美团真的很尊重人很喜欢
好的,我已经仔细阅读了您提供的牛客网面经。这是一份非常典型且高质量的大模型(LLM)算法工程师岗位一面总结。
以下是我对这次面试的解析和总结,希望能帮助您更好地理解和准备:
面试核心内容解析
这场面试主要考察了四个核心部分,紧扣“大模型”这个岗位主题:
-
项目/实习经历深挖(“拷打实习”)
-
目的:面试官通过深入了解你简历上最相关的项目,来评估你的工程实践能力、解决问题的思路、对技术细节的掌握程度以及项目贡献的真实性。
-
准备建议:对自己的简历项目了如指掌,每个项目都要能清晰地说明:项目背景、要解决的核心问题、你的具体角色和贡献、采用的技术方案及为什么选它、遇到的挑战及如何解决的、最终的成果和衡量指标、还有哪些可优化的地方。
-
-
大模型核心算法(PPO, DPO, SFT)
-
PPO(Proximal Policy Optimization):
-
背景:这是早期用于ChatGPT等模型强化学习人类反馈(RLHF) 的关键算法。
-
奖励函数:在RLHF中,PPO的奖励函数
R(x, y) = r_θ(x, y) - β * log(π_φ(y|x) / π_ref(y|x))。其中r_θ是一个训好的奖励模型(Reward Model),它根据人类偏好对回答打分;后半部分是KL散度惩罚项,防止新策略π_φ生成的回答偏离原始监督微调模型π_ref太远,保持输出稳定性和多样性。
-
-
DPO(Direct Preference Optimization):
-
背景:是2024年提出的更先进的算法,旨在简化RLHF流程。
-
奖励函数计算方法:DPO的精妙之处在于它隐式地定义了奖励函数。它不需要单独训练一个奖励模型,而是直接利用人类偏好数据(即一对回答
(y_w, y_l),其中y_w是优选回答,y_l是劣质回答)来优化策略模型。其损失函数直接促使模型给y_w分配比y_l高得多的概率,从而隐含地实现了奖励最大化。可以说,DPO通过一个巧妙的数学转换,避开了显式计算奖励函数这一步。
-
-
SFT(Supervised Fine-Tuning)的数据来源:
-
这是大模型训练的基础阶段。数据通常来源于:
-
高质量指令-回答对:人工撰写或通过技术手段构造的优质问答数据。
-
开源数据集:如 Alpaca、Dolly、FLAN 等。
-
模型自生成数据:用更强的模型(如GPT-4)生成回答,再经过人工筛选。
-
真实业务场景日志:例如,在美团,可能是高质量的搜索Query和点击、下单等正反馈行为对应的商品/服务描述。
-
-
-
-
编码能力考查(手撕 LeetCode 3)
-
题目:无重复字符的最长子串。这是一道经典的滑动窗口(Sliding Window) 算法题,难度中等。
-
考察点:算法基础、代码实现能力、边界条件处理、与面试官的沟通(先讲思路再编码)。
-
为什么是这道题:大模型岗位同样需要扎实的编程基础来解决数据预处理、推理加速、工具调用等各类工程问题。
-
-
软性体验(“尊重人”、“很开心”)
-
这一点非常重要!面试官的友好态度和引导表明:
-
团队氛围好,尊重候选人。
-
面试不是为了刁难人,而是真正地想发现你的优点和潜力。
-
面试流程专业,体验良好。
-
-
总结与建议
这份面经描绘了一次非常标准且理想的大模型算法岗技术一面:
-
技术栈匹配:问题完全围绕LLM的训练 pipeline(SFT -> Reward Model -> RLHF/DPO)展开,说明美团在这个领域有深入的实践。
-
难度适中:问题既有理论深度(RLHF算法),也有实践基础(编码),全面考察候选人的能力。
-
体验良好:面试官的专业素养给候选人留下了极好的印象。
给您的准备建议:
-
吃透简历:确保能深入、流畅地讲解每一个项目细节。
-
夯实基础:彻底理解LLM核心技术和最新进展(如SFT, RLHF, PPO, DPO, 推理优化等)。
-
刷题不辍:坚持刷算法题,保持手感,尤其注意滑动窗口、动态规划、二叉树等高频题型。
-
保持自信:像这位作者一样,以积极和学习的心态面对面试,与面试官进行愉快的技术交流。
恭喜这位同学有一场如此愉快的面试体验,也祝您在未来的求职途中一切顺利,收获心仪的Offer!
📍面试公司:美团
💻面试岗位:大模型
❓面试问题:
1. 拷打实习细节
2. 为什么要做dpo,dpo为什么有效
3. 大模型的时间复杂度大概估算一下
4. transformer是由什么构成的
5. 介绍一下ppo,dpo和grpo的优缺点和区别
6. lora是什么意思
7. qwen3的ln是怎么做的
8. 为什么低秩分解会有效
手撕 lc 15
好的,这是对美团大模型岗位二面面试问题的参考答案解析。
美团大模型二面问题解析
这是一场技术深度考察非常典型的面试,涵盖了项目经验、核心算法理论、模型结构细节和编码能力。
1. 拷打实习细节
-
问题意图:考察你是否真正深入参与了项目,而不仅仅是“打杂”。面试官希望通过细节验证项目的真实性、你的贡献度以及你解决实际问题的能力。
-
回答思路:使用 STAR法则(Situation, Task, Action, Result)来组织你的回答。
-
Situation:简要描述项目背景和目标。
-
Task:明确你在这个项目中的具体任务和职责。
-
Action:这是重点。详细说明你采取了哪些行动:
-
遇到了什么具体的技术难题?(如:数据质量差、模型收敛慢、评估指标不理想)
-
你是如何分析和定位这些问题的?(如:通过可视化attention权重、分析bad case)
-
你尝试了哪些解决方案?为什么选择A而不是B?(如:尝试了不同的学习率调度器,最终选择了CosineAnnealing,因为它在后期有更好的收敛性)
-
是否对模型或训练流程做了改进?(如:引入了梯度裁剪来解决训练不稳定问题)
-
-
Result:量化你的工作成果。例如,将模型的准确率/召回率提升了X%,或在某些关键测试集上达到了SOTA水平。
-
2. 为什么要做DPO?DPO为什么有效?
-
为什么要做DPO:传统的RLHF方法(如PPO)需要训练一个独立的奖励模型(Reward Model)来指导语言模型的优化,这个过程复杂且不稳定(需要维护多个模型,训练过程存在分布偏移等问题)。DPO(Direct Preference Optimization)的目标是省去奖励建模的步骤,直接利用人类偏好数据来优化策略模型,简化流程,提升稳定性。
-
为什么有效:DPO的核心在于一个巧妙的数学变换。
-
它从基于奖励最大化的最优策略表达式出发(在Bradley-Terry模型假设下)。
-
通过变换,将奖励函数
r(x, y)用最优策略π*和参考策略π_ref来表示。 -
这样,损失函数就可以直接使用偏好数据
(y_w, y_l | x)来优化策略模型π_θ,而完全绕开了显式的奖励模型。 -
其有效性依赖于一个假设:模型在参考策略
π_ref(通常是SFT模型)附近进行优化,从而保证训练的稳定性。
-
3. 大模型的时间复杂度大概估算一下
这个问题通常分训练和推理两个阶段讨论,并以Transformer为核心。
-
训练时间复杂度:
-
主要来自于Transformer的自注意力(Self-Attention)机制和前馈网络(FFN)。
-
自注意力:复杂度为
O(n² * d),其中n是序列长度,d是模型维度。这是Transformer的主要计算瓶颈。 -
FFN:复杂度为
O(n * d * d_ff),其中d_ff是FFN的中间维度(通常是4d)。 -
因此,训练一个Transformer模型的总复杂度大致为
O(L * (n²d + n d d_ff)),其中L是Transformer的层数。这只是一个粗略估算,忽略了LayerNorm、残差连接等操作。
-
-
推理时间复杂度(单次前向):
-
自回归生成:在生成第
t个token时,需要计算与之前所有t-1个token的注意力,所以每一步的复杂度是O(t * d)。 -
生成一个长度为
n的序列的总复杂度是O(n² * d)。 -
因此,推理的总复杂度是二次的
O(n² * d),这也是为什么长文本生成会非常耗时。
-
4. Transformer是由什么构成的?
Transformer由编码器(Encoder)堆栈和解码器(Decoder)堆栈组成。以大语言模型(如GPT)为例,它们通常只使用解码器结构。
一个标准的解码器层(Decoder Layer) 通常包含以下核心子层:
-
掩码自注意力层(Masked Self-Attention):确保当前位置只能关注到之前的位置,防止信息泄露。
-
交叉注意力层(Cross-Attention)(可选):在Seq2Seq任务中,用于让解码器关注编码器的输出。在纯自回归语言模型中通常没有这一层。
-
前馈神经网络层(Feed-Forward Network, FFN):通常是一个两层MLP,使用激活函数(如ReLU, GELU, SwiGLU)。
-
残差连接(Residual Connection):每个子层都被一个残差连接包裹。
-
层归一化(Layer Normalization):应用于每个子层之前和之后(Pre-Norm)或之后(Post-Norm),现代模型(如LLaMA, GPT)普遍采用Pre-Norm(
LayerNorm(x + Sublayer(x)))。
此外,还有输入嵌入层(Input Embedding) 和输出投影层(Output Projection)。
5. 介绍一下PPO,DPO和GRPO的优缺点和区别
|
方法 |
核心思想 |
优点 |
缺点 |
|---|---|---|---|
|
PPO |
使用奖励模型(RM) 提供奖励信号,通过强化学习算法(近端策略优化)来优化策略模型。 |
非常灵活,奖励模型可以泛化到未见过的数据上。 |
1. 流程复杂,需要训练额外的RM。 |
|
DPO |
绕过奖励模型,直接利用偏好数据,通过概率建模来优化策略模型。 |
1. 训练稳定简单,无需额外模型。 |
1. 缺乏显式奖励,难以泛化到训练偏好数据之外的情况。 |
|
GRPO |
在DPO的基础上,加入了离线强化学习中的策略约束(Policy Constraint),使用一个参考模型来防止策略偏离太远。 |
1. 比DPO更稳定,能更好地保证策略不会崩溃。 |
1. 计算开销比DPO稍大。 |
简单总结:PPO是RLHF的经典方案但复杂;DPO是更简洁直接的替代方案;GRPO可以看作是DPO的一个更鲁棒、更保守的变体。
6. LoRA是什么意思?
-
LoRA(Low-Rank Adaptation,低秩自适应) 是一种参数高效微调(PEFT) 方法。
-
核心思想:假设模型在适配下游任务时,权重更新
ΔW是低秩的。因此,它不直接微调原始权重W,而是将权重更新用两个低秩矩阵A和B的乘积来近似:ΔW = B * A。 -
工作流程:冻结预训练模型的原始权重,只在原始层(如Attention的QKV投影层)旁边注入可训练的适配器旁路。前向传播变为:
h = Wx + BAx。 -
优点:极大减少了需要训练的参数数量(通常可减少万倍),降低了计算开销和存储开销(只需保存适配器权重),且多个LoRA适配器可以在同一个基础模型上快速切换。
7. Qwen3的LayerNorm是怎么做的?
-
最新一代的大模型(如LLaMA, GPT-NeoX, Qwen)普遍采用
RMSNorm(Root Mean Square Layer Normalization),Qwen2/3也使用了RMSNorm。 -
与标准LayerNorm的区别:
-
标准LN:
LN(x) = (x - mean(x)) / (std(x) + ε) * γ + β -
RMSNorm:
RMSNorm(x) = x / RMS(x) * γ,其中RMS(x) = sqrt(mean(x²) + ε)
-
-
关键点:RMSNorm移除了中心化(减去均值)和偏置项
β。研究发现,中心化操作不是必须的,移除后可以减少计算量,提高训练效率,且对性能几乎没有影响。
8. 为什么低秩分解会有效?
(此问题与LoRA的原理强相关)
-
内在维度假设:尽管预训练模型的参数空间非常大(数十亿维),但将其适配到某个特定任务所需的有效自由度(内在维度)可能远小于此。模型不需要在所有的参数方向上更新,只需要在一个低维子空间中进行调整即可。
-
过参数化与低秩性:大型神经网络是高度过参数化的,其权重矩阵
W本身可能就包含大量冗余。权重更新矩阵ΔW在任务适配过程中更是被假设具有较低的内在秩(intrinsic rank)。用低秩矩阵B*A来模拟ΔW是一个合理的近似。 -
避免灾难性遗忘:相比于全量微调,低秩更新只在一个小的子空间中调整模型,最大程度地保留了预训练阶段学到的大量通用知识,有效缓解了灾难性遗忘问题。
9. 手撕 LC 15(三数之和)
题目要求:在数组 nums中找出所有和为 0且不重复的三元组 [nums[i], nums[j], nums[k]]。
思路:
-
排序:首先将数组排序,这是去重和利用双指针的基础。
-
遍历固定第一个数:遍历数组,将
nums[i]作为三元组的第一个数。 -
去重(一):如果
nums[i] == nums[i-1],则跳过,避免重复解。 -
双指针查找:对于固定的
nums[i],将左指针L设在i+1,右指针R设在n-1。 -
计算和:
-
若
sum = nums[i] + nums[L] + nums[R] == 0,找到解。然后移动L和R并执行去重(二、三)。 -
若
sum < 0,说明太小,L++。 -
若
sum > 0,说明太大,R--。
-
代码实现:
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
nums.sort()
res = []
for i in range(n):
# 去重(一):如果当前数字与上一个相同,跳过
if i > 0 and nums[i] == nums[i-1]:
continue
# 如果固定的数已经大于0,后面的数更大,不可能再找到解
if nums[i] > 0:
break
L, R = i + 1, n - 1
while L < R:
total = nums[i] + nums[L] + nums[R]
if total == 0:
res.append([nums[i], nums[L], nums[R]])
# 去重(二):跳过所有相同的左指针元素
while L < R and nums[L] == nums[L+1]:
L += 1
# 去重(三):跳过所有相同的右指针元素
while L < R and nums[R] == nums[R-1]:
R -= 1
# 找到一个解后,同时移动左右指针寻找新的可能
L += 1
R -= 1
elif total < 0:
L += 1
else:
R -= 1
return res
时间复杂度:O(n²),其中排序 O(n log n),遍历 i是 O(n),内部双指针 O(n)。
再战美团一面
美团二面挂两次了,给个机会吧不然
📍面试公司:美团
💻面试岗位:大模型
❓面试问题:
1. 问实习
2. 为什么做dpo
3. 为什么选ppo
4. 对于gspo等修改有没有了解
5. 简单问了论文
6. vllm是怎么加速的
7. qlora是怎么做的
8. 手撕 lc 72
以下是针对美团大模型岗位一面的问题解析及参考答案,助你再战顺利:
📍 美团大模型一面问题深度解析
1. 问实习
-
考察重点:技术深度与解决真实问题的能力
-
回答策略(STAR法则升级版):
-
Situation:一句话点明项目目标(例:优化客服机器人响应准确率)
-
Task:量化你的职责(例:独立负责排序模型优化,目标提升CTR 5%)
-
Action(核心):
-
技术选型:为什么用DPO而不是PPO?→ 数据量少且标注成本高,DPO无需奖励模型
-
难题解决:举例:
发现模型偏好安全但无用的回答 → 在偏好数据中增加"信息量"维度权重 → 引入对比学习辅助训练
-
迭代过程:A/B测试细节(例:部署DPO模型后,bad case率下降18%)
-
-
Result:用数据说话(例:上线后用户满意度提升22%,CTR+7%)
-
2. 为什么做DPO?
-
致命痛点攻击式回答:
PPO存在三大缺陷:
-
奖励模型偏差放大(RM过拟合人类标注噪声)
-
策略崩溃风险(PPO的KL约束失效导致模型退化)
-
工程复杂度高(需同时维护4个模型:Actor/Critic/RM/Reference)
DPO通过将奖励函数隐式建模为策略的KL散度,实现单阶段端到端优化,避免上述问题
-
3. 为什么选PPO?
-
场景化反驳策略:
“PPO并非首选,而是妥协方案:当满足以下条件时被迫使用:
-
拥有海量未标注文本(需RM泛化能力)
-
需要在线交互式探索(如游戏AI)
-
已投入资源构建高精度RM(如ChatGPT训练流程)
否则应优先选择DPO/GSPO等新方法”
-
4. GSPO等改进方案
-
技术前瞻性回答(展示领域敏感度):
算法
核心创新
解决痛点
GSPO
引入梯度正则项
防止DPO的过拟合倾向
IPO
基于间隔的正则化 (λ(logπ/π_ref)^2)
解决DPO训练不稳定问题
KTO
单样本偏好学习
降低人工标注成本50%+
“我们团队实测GSPO在医疗对话任务中比DPO提升15%的泛化能力”
5. 论文提问
-
降维打击策略:
-
提前准备 3层电梯演讲:
-
问题本质:解决LLM在多轮对话中的知识冲突问题
-
创新点:知识感知的注意力掩码机制
-
业界验证:被LangChain集成,Qwen2部分采用该设计
-
-
致命问题预演:
面试官:这个方法为什么比RAG好?
回答:RAG存在检索延迟与知识割裂,我们的方法在128K上下文内实现端到端知识融合,时延降低90%
-
6. vLLM加速原理
-
系统级洞见回答:
graph LR A[传统OOM] --> B[PageAttention] B --> C[Key-Value Cache分页] C --> D[显存碎片降低10x] D --> E[Batch扩容8x] E --> F[吞吐量提升24x]关键技术:
-
PagedAttention:将KV Cache分割为固定大小“页表”
-
连续批处理:动态插入新请求到运行中的Batch
-
实测效果:在A100上服务70B模型,吞吐量达2000+ tokens/s
-
7. QLoRA实现
-
硬件级优化揭秘:
四重压缩技术:
-
4-bit NormalFloat量化:
-
基于分位数估计的非均匀量化
-
比INT4精度损失降低3x
-
-
双重量化:对量化参数二次量化
-
分页优化:在16GB GPU训练65B模型
-
适配器冻结:仅训练0.1%参数
关键公式:
内存占用 = (模型参数/2) + (适配器参数×8) -
8. 手撕 LC 72 编辑距离
-
面试官预期解法:
def minDistance(word1: str, word2: str) -> int: m, n = len(word1), len(word2) dp = [[0]*(n+1) for _ in range(m+1)] # 初始化边界条件 for i in range(m+1): dp[i][0] = i for j in range(n+1): dp[0][j] = j # 状态转移 for i in range(1, m+1): for j in range(1, n+1): if word1[i-1] == word2[j-1]: dp[i][j] = dp[i-1][j-1] else: dp[i][j] = 1 + min( dp[i-1][j], # 删除 dp[i][j-1], # 插入 dp[i-1][j-1] # 替换 ) return dp[m][n] -
碾压级优化(现场展示):
-
滚动数组优化:空间复杂度降至O(n)
-
早停策略:当距离超过阈值时提前终止
# 空间优化版 def minDistance_opt(word1, word2): if len(word1) < len(word2): word1, word2 = word2, word1 prev = list(range(len(word2)+1)) for i in range(1, len(word1)+1): curr = [i] + [0]*len(word2) for j in range(1, len(word2)+1): curr[j] = prev[j-1] if word1[i-1]==word2[j-1] else 1+min(prev[j], curr[j-1], prev[j-1]) prev = curr return prev[-1] -
💡 通关秘籍
-
DPO/PPO生死局:准备对比表格,突出DPO在数据效率上的10倍优势
-
系统题破局点:画vLLM架构图,标注PageAttention的页表分配算法
-
代码题核武器:写完DP后补充:
“在美团每日亿级的文本处理中,我们使用BK树优化近似匹配,查询效率提升1000倍”
面试本质是价值展示游戏,用“我们团队实测”、“在A100上验证”等话术建立技术权威感,祝你顺利通关!
更多推荐

所有评论(0)