vinqi.com

算法工程师面试题及答题要点

算法岗面试通常 3-5 轮:一到两轮技术面(基础+手撕代码)、一轮项目深挖、一轮主管或 HR 面。最容易挂的不是基础题,而是项目深挖环节——讲不清自己模型里每个设计的「为什么」,以及代码题写不出 bug-free 的实现。

专业基础

讲一下 L1 和 L2 正则化的区别,各自适合什么场景?

考察点:考察数学直觉是否扎实,能否把正则化和实际特征筛选联系起来。

答题要点:
  1. 先答核心:L1 是绝对值惩罚,倾向产生稀疏解,可做特征筛选;L2 是平方惩罚,让权重整体变小但不为 0。
  2. 再答场景:高维稀疏特征、想自动筛掉无用特征时用 L1;只想防过拟合、保留所有特征信息时用 L2。
  3. 可以补充一句:L1 在零点不可导,优化上需要特殊处理,这是工程上常被追问的点。
  4. 如果面试官追问,主动提到两者对离群特征和共线性特征的敏感度差异。

别踩:只背定义不联系场景,或者答不出 L1 为什么产生稀疏解(几何解释或导数解释)。

过拟合你一般怎么判断、怎么处理?

考察点:考察是否有真实训练经验,还是只跑过 notebook 里的 demo。

答题要点:
  1. 先讲判断:训练集和验证集指标差距明显拉大、验证指标先降后升,就是过拟合信号。
  2. 处理按优先级讲:先加数据或做数据增强,再调正则化、dropout、early stopping,最后才考虑换更简单的模型。
  3. 强调顺序体现工程思维:数据层面解决通常比模型层面更划算。
  4. 可以举一个自己项目里的具体例子,说明当时怎么发现、怎么处理的。

别踩:一口气罗列十种方法但没有优先级和取舍理由,显得没实际处理过。

AUC 是什么?为什么有些场景下不能只看 AUC?

考察点:考察评估指标的理解深度,能否结合业务场景选指标。

答题要点:
  1. 先准确说清:AUC 是随机取一正一负样本、正样本得分更高的概率,与阈值无关。
  2. 再讲局限:类别极不平衡时 AUC 可能虚高;业务关心的是固定预算下的精确率时,AUC 不直接反映。
  3. 结合场景举例:风控或推荐里,往往要看固定召回下的精确率、或 top-K 上的指标。
  4. 补一句:面试官常追问 AUC 和 PR 曲线的关系,提前准备好不平衡数据下两者差异的说明。

别踩:把 AUC 说成「准确率的一种」,或答不出它和阈值无关这个本质。

讲讲你知道的梯度下降变体,Adam 为什么常用?

考察点:考察优化基础,以及对常用工具的原理是否只是「会用」。

答题要点:
  1. 按脉络讲:从 SGD 到 momentum(动量加速),到 RMSProp(自适应学习率),再到 Adam(两者结合)。
  2. Adam 的优势:自适应每个参数的学习率,对超参不敏感,多数任务开箱即用效果好。
  3. 主动提局限:某些任务上 Adam 泛化不如 SGD,以及 warmup 等技巧。
  4. 如果面的是深度学习岗,准备好讲学习率调度策略,这是常见追问。

别踩:只说「Adam 效果好」却说不出它做了什么,暴露只会调包。

项目经历深挖

挑一个你最满意的项目,讲讲你做了什么。

考察点:考察表达结构、贡献真实性,以及能否分清团队成果和个人贡献。

答题要点:
  1. 用「背景—问题—方案—结果」四段式讲,全程控制在 2-3 分钟。
  2. 开头先量化背景:什么业务、指标基线是多少、你要提升什么。
  3. 讲方案时突出你的技术选型理由,而不是罗列用了什么工具。
  4. 结果必须带数字:指标提升多少、上线后带来什么变化,没有数字的项目说服力减半。

别踩:讲了五分钟还没说到自己做了什么,或把团队成果全说成自己的。

这个模型里你为什么用这个结构/这个损失函数?试过别的吗?

考察点:考察设计决策是深思熟虑还是照抄论文,以及实验对比意识。

答题要点:
  1. 老实讲对比过程:当时试过 A 和 B,各自指标如何,最终为什么选了现在这个。
  2. 如果确实没对比过,就讲当时的约束(时间、数据量)下的权衡,别硬编。
  3. 把「为什么」落到具体因素上:数据分布、样本量、线上推理耗时等。
  4. 准备好被追问「如果数据量翻十倍你会怎么改」,这是区分深度的问题。

别踩:答「论文里就是这么用的」或「大家都这么用」,直接暴露没有独立思考。

项目里遇到的最大困难是什么,怎么解决的?

考察点:考察解决真实问题的能力,以及排查问题方法论是否清晰。

答题要点:
  1. 选一个技术含量高、且你确实主导解决的问题,不要选「需求老变」这类。
  2. 讲清排查路径:现象是什么、你怎么定位、排除了哪些可能、最后根因是什么。
  3. 突出验证环节:怎么确认修复有效,有没有做对照实验。
  4. 结尾加一句沉淀:这个问题让你总结了什么方法,后来怎么避免再犯。

别踩:讲成流水账或把困难归咎于他人,缺少定位问题的过程。

这个模型上线之后效果怎么样?有没有持续迭代?

考察点:考察是否有线上视角,还是只做到离线实验就结束了。

答题要点:
  1. 区分离线和在线指标:离线 AUC 提升不代表线上有效,讲清楚你怎么验证的。
  2. 如果有 A/B 实验经验,讲实验设计、观察周期和置信度判断。
  3. 讲后续迭代:监控了什么、发现过什么问题、做了什么改进。
  4. 如果项目没上线,坦诚说明,并讲你了解的上线会遇到的工程问题(延迟、资源)。

别踩:只讲离线指标就结束,被追问线上效果时支支吾吾。

代码与算法手撕

手写一下逻辑回归的损失函数和梯度推导。

考察点:考察数学推导能力能否落到笔头,这是算法岗手撕的经典题。

答题要点:
  1. 先写 sigmoid,再写交叉熵损失,一步步推梯度,边写边讲思路。
  2. 推导完主动验证:梯度形式和线性回归的相似性,说明你理解本质。
  3. 注意书写规范:变量定义先写清楚,避免推导中途符号混乱。
  4. 如果时间允许,补一句怎么用向量化实现,体现工程素养。

别踩:背过结论但推导卡壳,或符号前后不一致被面试官当场指出。

现场写代码:实现一个简化版的 KMeans。

考察点:考察编码基本功和边写边沟通的习惯,而不只是算法知识。

答题要点:
  1. 动手前先确认输入输出和边界情况:空输入、K 大于样本数怎么办。
  2. 边写边讲你的思路,让面试官跟上你的节奏,卡住时也方便他给提示。
  3. 写完主动跑一个例子在脑内验证,检查初始化和收敛条件是否正确。
  4. 留出讨论空间:主动提 K 怎么选、局部最优怎么缓解,展示知识面。

别踩:闷头十分钟不说话,写完不检查,低级 bug(如索引越界)没发现。

这道题的时间复杂度能不能优化?

考察点:考察复杂度分析和优化思维,手撕题的常见追问。

答题要点:
  1. 先准确说出当前解法的复杂度,再分析瓶颈在哪一步。
  2. 按常见优化路径想:换数据结构(哈希、堆)、空间换时间、单调性剪枝。
  3. 想不出来时不要硬憋,说出你考虑过的方向和卡点,请面试官给个提示。
  4. 得到提示后快速响应,展示学习速度——这本身也是考察点。

别踩:复杂度说错,或者明明不会还长时间沉默不沟通。

情景应变与业务理解

如果线上模型效果突然掉了很多,你会怎么排查?

考察点:考察系统性排查思维,是否理解线上系统的全链路。

答题要点:
  1. 按链路排查:先确认数据(特征分布是否漂移、管道是否正常),再看服务(延迟、报错),最后看模型本身。
  2. 讲具体手段:对比近期和历史的特征分布、检查日志、看是否有上游变更。
  3. 提到回滚预案:先恢复服务再查根因,体现线上意识。
  4. 结尾讲预防:建立监控和告警,让问题下次能更早发现。

别踩:只从模型角度想(重新训练),忽略数据和工程层面的常见原因。

业务方说模型效果不好,但离线指标明明不错,怎么办?

考察点:考察沟通能力和对离线在线不一致问题的理解。

答题要点:
  1. 先对齐「效果不好」的具体定义:是哪个环节、什么指标、什么样本上不好。
  2. 排查常见原因:离线在线特征不一致、样本偏差、评估集和真实分布脱节。
  3. 提出验证方案:构造更贴近业务的评估集,或推动小流量在线实验。
  4. 沟通姿态要合作:把业务方当信息来源而不是对立面,一起定义问题。

别踩:直接反驳业务方「指标明明是好的」,显得没有协作意识。

给你三个月,从零做一个推荐模块,你会怎么规划?

考察点:考察端到端的项目规划能力和优先级判断。

答题要点:
  1. 先问清约束:数据有什么、目标是什么、延迟和资源限制是多少。
  2. 分阶段讲:前两周搭基线和数据管道,中间迭代模型,最后留时间做上线和监控。
  3. 强调先跑通再优化:简单基线先上线拿反馈,比憋大招更务实。
  4. 主动讲风险和取舍:哪些环节最可能延期,你会怎么保核心目标。

别踩:一上来就讲用多复杂的模型,没有数据管道、评估、上线这些工程环节。

行为面试与反问环节

为什么从上一家离开/为什么选我们这个岗位?

考察点:考察动机稳定性和对岗位的了解程度。

答题要点:
  1. 离职原因讲客观发展诉求:想接触更大规模的数据或更核心的业务,不贬低前东家。
  2. 选这家的理由要具体:提到你了解到的团队方向、业务场景和你技能的匹配点。
  3. 提前查过团队近期的技术分享或产品,能说出一个具体细节会明显加分。
  4. 整体传递的信息:你是奔着长期成长来的,不是随便投的。

别踩:抱怨前公司或领导,或者说不出对方团队具体做什么。

和同事在技术方案上有分歧,你怎么处理?

考察点:考察协作方式和解决冲突的成熟度。

答题要点:
  1. 讲一个真实例子,用「分歧点—怎么论证—怎么决定—结果如何」的结构。
  2. 核心姿态:用数据和实验说话,而不是靠职级或嗓门。
  3. 说明你尊重最终决定并全力执行,即使方案不是你提的。
  4. 如果事后证明你对了,也不要说「我早说过」,而是推动复盘。

别踩:把例子讲成「最后他们都听我的」,显得不会合作。

你有什么想问我们的吗?

考察点:考察你对机会的重视程度和思考深度,绝不是客套环节。

答题要点:
  1. 准备 2-3 个真问题:团队目前最大的技术挑战、新人前三个月的期望、模型迭代节奏。
  2. 可以问刚才技术面里没聊透的问题,展示真实兴趣。
  3. 避免一上来只问薪资加班,这些留给 HR 环节。
  4. 问题要基于你查过的信息,比如「我看到团队在做 X,目前卡在哪个环节」。

别踩:说「没什么想问的」,等于主动放弃展示动机的机会。

面试准备清单

什么时候要做什么
面试前 3 天把简历上每个项目按「背景—问题—方案—结果」重新过一遍,每个技术决策都准备好「为什么这么做、试过什么替代方案」。
面试前 3 天刷 5-10 道手撕题:逻辑回归推导、KMeans、二叉树遍历、top-K 问题,重点练边写边讲。
面试前 1 天查面试方的业务和团队公开信息(技术博客、产品、招聘 JD),准备 2-3 个反问问题。
面试前 1 天复习高频基础题:过拟合、正则化、评估指标、优化器、偏差方差,每题能 1 分钟讲清核心。
面试当天手撕环节前准备纸笔或确认 coding 环境;提前 10 分钟到场,手机静音。
面试当天技术面结束趁记忆新鲜,立刻记下被问倒的题,下一轮或下一家面试前补上。

常见问题

算法工程师面试一般有几轮?
通常 3-5 轮:1-2 轮技术面(基础+手撕代码)、1 轮项目或交叉面、1 轮主管面,最后 HR 面。大厂可能加笔试或机试,创业公司可能两轮就发 offer。
没有大项目经验,项目深挖环节怎么办?
把课程项目、竞赛或实习做深比做多重要:讲清每个设计决策的理由、踩过的坑和排查过程。面试官看重的是思考深度,项目规模本身不是决定因素。
手撕代码答不上来是不是就挂了?
不一定。手撕同时考察沟通和思路,写出正确但不是最优的解、或得到提示后快速完成,都可能通过。真正致命的是长时间沉默不沟通,或复杂度分析也说不清。
机器学习工程师和算法工程师面试内容一样吗?
高度重叠:基础、手撕、项目深挖都跑不掉。差异在侧重——偏工程的岗位多问部署、性能优化和工程协作;偏研究的岗位多问论文理解和模型创新点,看 JD 调整准备重点。

继续看这个岗位

相关岗位