算法工程师面试题及答题要点
算法岗面试通常 3-5 轮:一到两轮技术面(基础+手撕代码)、一轮项目深挖、一轮主管或 HR 面。最容易挂的不是基础题,而是项目深挖环节——讲不清自己模型里每个设计的「为什么」,以及代码题写不出 bug-free 的实现。
专业基础
讲一下 L1 和 L2 正则化的区别,各自适合什么场景?
考察点:考察数学直觉是否扎实,能否把正则化和实际特征筛选联系起来。
- 先答核心:L1 是绝对值惩罚,倾向产生稀疏解,可做特征筛选;L2 是平方惩罚,让权重整体变小但不为 0。
- 再答场景:高维稀疏特征、想自动筛掉无用特征时用 L1;只想防过拟合、保留所有特征信息时用 L2。
- 可以补充一句:L1 在零点不可导,优化上需要特殊处理,这是工程上常被追问的点。
- 如果面试官追问,主动提到两者对离群特征和共线性特征的敏感度差异。
别踩:只背定义不联系场景,或者答不出 L1 为什么产生稀疏解(几何解释或导数解释)。
过拟合你一般怎么判断、怎么处理?
考察点:考察是否有真实训练经验,还是只跑过 notebook 里的 demo。
- 先讲判断:训练集和验证集指标差距明显拉大、验证指标先降后升,就是过拟合信号。
- 处理按优先级讲:先加数据或做数据增强,再调正则化、dropout、early stopping,最后才考虑换更简单的模型。
- 强调顺序体现工程思维:数据层面解决通常比模型层面更划算。
- 可以举一个自己项目里的具体例子,说明当时怎么发现、怎么处理的。
别踩:一口气罗列十种方法但没有优先级和取舍理由,显得没实际处理过。
AUC 是什么?为什么有些场景下不能只看 AUC?
考察点:考察评估指标的理解深度,能否结合业务场景选指标。
- 先准确说清:AUC 是随机取一正一负样本、正样本得分更高的概率,与阈值无关。
- 再讲局限:类别极不平衡时 AUC 可能虚高;业务关心的是固定预算下的精确率时,AUC 不直接反映。
- 结合场景举例:风控或推荐里,往往要看固定召回下的精确率、或 top-K 上的指标。
- 补一句:面试官常追问 AUC 和 PR 曲线的关系,提前准备好不平衡数据下两者差异的说明。
别踩:把 AUC 说成「准确率的一种」,或答不出它和阈值无关这个本质。
讲讲你知道的梯度下降变体,Adam 为什么常用?
考察点:考察优化基础,以及对常用工具的原理是否只是「会用」。
- 按脉络讲:从 SGD 到 momentum(动量加速),到 RMSProp(自适应学习率),再到 Adam(两者结合)。
- Adam 的优势:自适应每个参数的学习率,对超参不敏感,多数任务开箱即用效果好。
- 主动提局限:某些任务上 Adam 泛化不如 SGD,以及 warmup 等技巧。
- 如果面的是深度学习岗,准备好讲学习率调度策略,这是常见追问。
别踩:只说「Adam 效果好」却说不出它做了什么,暴露只会调包。
项目经历深挖
挑一个你最满意的项目,讲讲你做了什么。
考察点:考察表达结构、贡献真实性,以及能否分清团队成果和个人贡献。
- 用「背景—问题—方案—结果」四段式讲,全程控制在 2-3 分钟。
- 开头先量化背景:什么业务、指标基线是多少、你要提升什么。
- 讲方案时突出你的技术选型理由,而不是罗列用了什么工具。
- 结果必须带数字:指标提升多少、上线后带来什么变化,没有数字的项目说服力减半。
别踩:讲了五分钟还没说到自己做了什么,或把团队成果全说成自己的。
这个模型里你为什么用这个结构/这个损失函数?试过别的吗?
考察点:考察设计决策是深思熟虑还是照抄论文,以及实验对比意识。
- 老实讲对比过程:当时试过 A 和 B,各自指标如何,最终为什么选了现在这个。
- 如果确实没对比过,就讲当时的约束(时间、数据量)下的权衡,别硬编。
- 把「为什么」落到具体因素上:数据分布、样本量、线上推理耗时等。
- 准备好被追问「如果数据量翻十倍你会怎么改」,这是区分深度的问题。
别踩:答「论文里就是这么用的」或「大家都这么用」,直接暴露没有独立思考。
项目里遇到的最大困难是什么,怎么解决的?
考察点:考察解决真实问题的能力,以及排查问题方法论是否清晰。
- 选一个技术含量高、且你确实主导解决的问题,不要选「需求老变」这类。
- 讲清排查路径:现象是什么、你怎么定位、排除了哪些可能、最后根因是什么。
- 突出验证环节:怎么确认修复有效,有没有做对照实验。
- 结尾加一句沉淀:这个问题让你总结了什么方法,后来怎么避免再犯。
别踩:讲成流水账或把困难归咎于他人,缺少定位问题的过程。
这个模型上线之后效果怎么样?有没有持续迭代?
考察点:考察是否有线上视角,还是只做到离线实验就结束了。
- 区分离线和在线指标:离线 AUC 提升不代表线上有效,讲清楚你怎么验证的。
- 如果有 A/B 实验经验,讲实验设计、观察周期和置信度判断。
- 讲后续迭代:监控了什么、发现过什么问题、做了什么改进。
- 如果项目没上线,坦诚说明,并讲你了解的上线会遇到的工程问题(延迟、资源)。
别踩:只讲离线指标就结束,被追问线上效果时支支吾吾。
代码与算法手撕
手写一下逻辑回归的损失函数和梯度推导。
考察点:考察数学推导能力能否落到笔头,这是算法岗手撕的经典题。
- 先写 sigmoid,再写交叉熵损失,一步步推梯度,边写边讲思路。
- 推导完主动验证:梯度形式和线性回归的相似性,说明你理解本质。
- 注意书写规范:变量定义先写清楚,避免推导中途符号混乱。
- 如果时间允许,补一句怎么用向量化实现,体现工程素养。
别踩:背过结论但推导卡壳,或符号前后不一致被面试官当场指出。
现场写代码:实现一个简化版的 KMeans。
考察点:考察编码基本功和边写边沟通的习惯,而不只是算法知识。
- 动手前先确认输入输出和边界情况:空输入、K 大于样本数怎么办。
- 边写边讲你的思路,让面试官跟上你的节奏,卡住时也方便他给提示。
- 写完主动跑一个例子在脑内验证,检查初始化和收敛条件是否正确。
- 留出讨论空间:主动提 K 怎么选、局部最优怎么缓解,展示知识面。
别踩:闷头十分钟不说话,写完不检查,低级 bug(如索引越界)没发现。
这道题的时间复杂度能不能优化?
考察点:考察复杂度分析和优化思维,手撕题的常见追问。
- 先准确说出当前解法的复杂度,再分析瓶颈在哪一步。
- 按常见优化路径想:换数据结构(哈希、堆)、空间换时间、单调性剪枝。
- 想不出来时不要硬憋,说出你考虑过的方向和卡点,请面试官给个提示。
- 得到提示后快速响应,展示学习速度——这本身也是考察点。
别踩:复杂度说错,或者明明不会还长时间沉默不沟通。
情景应变与业务理解
如果线上模型效果突然掉了很多,你会怎么排查?
考察点:考察系统性排查思维,是否理解线上系统的全链路。
- 按链路排查:先确认数据(特征分布是否漂移、管道是否正常),再看服务(延迟、报错),最后看模型本身。
- 讲具体手段:对比近期和历史的特征分布、检查日志、看是否有上游变更。
- 提到回滚预案:先恢复服务再查根因,体现线上意识。
- 结尾讲预防:建立监控和告警,让问题下次能更早发现。
别踩:只从模型角度想(重新训练),忽略数据和工程层面的常见原因。
业务方说模型效果不好,但离线指标明明不错,怎么办?
考察点:考察沟通能力和对离线在线不一致问题的理解。
- 先对齐「效果不好」的具体定义:是哪个环节、什么指标、什么样本上不好。
- 排查常见原因:离线在线特征不一致、样本偏差、评估集和真实分布脱节。
- 提出验证方案:构造更贴近业务的评估集,或推动小流量在线实验。
- 沟通姿态要合作:把业务方当信息来源而不是对立面,一起定义问题。
别踩:直接反驳业务方「指标明明是好的」,显得没有协作意识。
给你三个月,从零做一个推荐模块,你会怎么规划?
考察点:考察端到端的项目规划能力和优先级判断。
- 先问清约束:数据有什么、目标是什么、延迟和资源限制是多少。
- 分阶段讲:前两周搭基线和数据管道,中间迭代模型,最后留时间做上线和监控。
- 强调先跑通再优化:简单基线先上线拿反馈,比憋大招更务实。
- 主动讲风险和取舍:哪些环节最可能延期,你会怎么保核心目标。
别踩:一上来就讲用多复杂的模型,没有数据管道、评估、上线这些工程环节。
行为面试与反问环节
为什么从上一家离开/为什么选我们这个岗位?
考察点:考察动机稳定性和对岗位的了解程度。
- 离职原因讲客观发展诉求:想接触更大规模的数据或更核心的业务,不贬低前东家。
- 选这家的理由要具体:提到你了解到的团队方向、业务场景和你技能的匹配点。
- 提前查过团队近期的技术分享或产品,能说出一个具体细节会明显加分。
- 整体传递的信息:你是奔着长期成长来的,不是随便投的。
别踩:抱怨前公司或领导,或者说不出对方团队具体做什么。
和同事在技术方案上有分歧,你怎么处理?
考察点:考察协作方式和解决冲突的成熟度。
- 讲一个真实例子,用「分歧点—怎么论证—怎么决定—结果如何」的结构。
- 核心姿态:用数据和实验说话,而不是靠职级或嗓门。
- 说明你尊重最终决定并全力执行,即使方案不是你提的。
- 如果事后证明你对了,也不要说「我早说过」,而是推动复盘。
别踩:把例子讲成「最后他们都听我的」,显得不会合作。
你有什么想问我们的吗?
考察点:考察你对机会的重视程度和思考深度,绝不是客套环节。
- 准备 2-3 个真问题:团队目前最大的技术挑战、新人前三个月的期望、模型迭代节奏。
- 可以问刚才技术面里没聊透的问题,展示真实兴趣。
- 避免一上来只问薪资加班,这些留给 HR 环节。
- 问题要基于你查过的信息,比如「我看到团队在做 X,目前卡在哪个环节」。
别踩:说「没什么想问的」,等于主动放弃展示动机的机会。
面试准备清单
| 什么时候 | 要做什么 |
|---|---|
| 面试前 3 天 | 把简历上每个项目按「背景—问题—方案—结果」重新过一遍,每个技术决策都准备好「为什么这么做、试过什么替代方案」。 |
| 面试前 3 天 | 刷 5-10 道手撕题:逻辑回归推导、KMeans、二叉树遍历、top-K 问题,重点练边写边讲。 |
| 面试前 1 天 | 查面试方的业务和团队公开信息(技术博客、产品、招聘 JD),准备 2-3 个反问问题。 |
| 面试前 1 天 | 复习高频基础题:过拟合、正则化、评估指标、优化器、偏差方差,每题能 1 分钟讲清核心。 |
| 面试当天 | 手撕环节前准备纸笔或确认 coding 环境;提前 10 分钟到场,手机静音。 |
| 面试当天 | 技术面结束趁记忆新鲜,立刻记下被问倒的题,下一轮或下一家面试前补上。 |