机器学习算法面经(腾讯阿里网易)| 掘金技术征文
从三月份开始投简历,到六月初拿到满意的 offer,这三个月里我密集地面了腾讯、阿里、网易三家,加上中间穿插的几个大厂和小厂,一共面了差不多二十轮。说实话,机器学习算法岗的面试跟我想象中不太一样——它在"考基础"这件事上比我预想的狠得多,而在"考论文"这件事上又没网上说的那么玄乎。这篇面经我尽量还原真实题目和真实场景,把每一轮问什么、怎么准备、哪些地方我栽过跟头都写清楚,给准备走算法岗的朋友一个参考。
先交代一下我的背景:211 硕士,研究方向是机器学习与数据挖掘,有两段实习经历,一篇 CCF-B 论文在投(面试时是 under review 状态),编程主要用 Python,C++ 能写但不熟。投递的岗位是算法工程师/机器学习工程师方向,base 深圳和杭州。这个背景放在今年这个行情里不算突出,能拿到面试机会主要靠项目经历和实习经历了。
1. 面试前的准备:简历、项目与刷题方向的取舍
在开始讲具体的面试题目之前,我想先说一个很多人忽略的事情——投递时间线和简历内容本身,很大程度上决定了你后面面试的难度。我三月初就开始准备,但真正大规模投递是三月中旬,这里面的区别在于:早投的批次,面试官问的问题明显更"常规",而到了四月底五月初的批次,同样是这些公司,面试官的问题会明显更偏、更细,这可能跟候选人池子的整体水平变化有关。
简历上我最终呈现的项目有四个:两个实习项目(一个推荐系统相关的,一个用户画像相关的),一个学校的科研项目(也是推荐方向的),还有一个 kaggle 比赛项目。这里有个很实用的经验:简历上写的每个项目,背后至少要能讲出三层东西。第一层是项目本身做了什么、你的角色是什么;第二层是技术选型为什么这么做、有没有对比过其他方案;第三层是这个项目里你认为最大的难点是什么、你怎么解决的、如果再让你做一次会怎么改进。这三层缺一层,面试官追问下去你就容易露馅,因为面试官深挖项目的速度远比你想的快。
刷题方面,我的策略是主攻 LeetCode 热题 HOT 100 加上剑指 offer 的经典题,重点放在数组、链表、二叉树、动态规划、字符串这几个大类。为什么没刷太多难题?因为从实际面试来看,算法岗手撕代码的难度并不像开发岗那么高,更侧重考察你对算法思想的理解和边界条件的考虑,而不是纯竞赛技巧。我面了三家加起来手撕了大概七八道题,没有一道是 hard 难度的偏题怪题,全是中等难度或者偏简单的中等题。这个后面会专门展开讲。
2. 腾讯系面试:从群面到技术二面的完整题目复盘
腾讯我投的是 CSIG 部门的算法岗位,一共面了四轮:群面、一面(技术初面)、二面(技术复面)、HR 面。整体感受是腾讯的面试流程最规范,每一轮边界清晰,但群面环节对算法岗来说确实有点折磨。
2.1 群面:一个算法岗也要参加的案例分析
腾讯的算法岗居然有群面环节,这是我没想到的。群面题目大概是这样的:给一个电商场景,需要设计一套用户增长方案,让一组人在 30 分钟内讨论出方案框架并推选一人总结。这个环节看起来是产品题,但算法背景的人在里面其实有自己的优势——你可以主动提出"通过用户分群、行为序列特征提取、流失预警模型"这类技术实现路径,在讨论中占据"技术可行性"的角色定位。
我在这轮里做的一件事是:当大家讨论得比较散的时候,主动站出来把方案拆成了"数据基础—特征—模型—策略—评估"五个模块,然后建议大家按这个框架分工。最后总结环节不是我做的,但讨论框架是我提的,这应该算加分的点。群面通过的很大概率是说话有条理、能推进讨论节奏的人,而不是声音最大的人。
2.2 腾讯一面:机器学习基础与简历深挖
腾讯的一面持续了大概 70 分钟,节奏非常紧凑。面试官上来先让我自我介绍,然后直接开始问项目。针对我的推荐系统实习项目,他问了几个我印象很深的问题:
第一个问题:你们用的 FM 模型是怎么做特征交叉的?为什么不用更高阶的组合?这个问题其实是在考察你是否理解特征交叉的代价——二阶交叉的参数量是 O(n²),三阶就变成 O(n³),在稀疏场景下高阶交叉的参数量太大而且容易过拟合。我当时答了 FM 通过隐向量内积来建模二阶交叉,把参数量从 n² 降到 nk(k 是隐向量维度),同时提到高阶交叉可以用 DeepFM 的深度部分去隐式学习,但显式的高阶交叉在工程上性价比不高。
第二个问题:你的模型线上效果提升了多少?这个提升是怎么评估的?要小心的是,面试官问这个不只是想知道数字,更想确认你的评估方法论。我当时回答了 AUC 提升了多少、GAUC 提升了多少,同时补充说明做了分层评估——按用户活跃度分层和按品类分层分别看了提升情况,发现对低活跃用户和长尾品类的提升更明显。面试官对"分层评估"这个点明显比较满意,因为这说明你不仅看了总体指标,还关注了模型在不同群体上的表现差异。
第三个问题是有一定难度的:如果线上特征分布发生漂移,你会怎么检测和处理?这个问题我当时其实答得不太够,只说了用 PSI 指标监控特征分布变化、定期重训模型。面试官追问"你提到的重训是全部重训还是增量训练?增量训练会不会有灾难性遗忘的问题?"这里就有点卡住了。后来复盘,这道题更完整的答法应该是:先用 PSI 分特征监控漂移程度,区分是季节性波动还是真实漂移;然后考虑是加规则兜底、做在线学习、还是定期用新数据微调;如果做增量学习,可以提一下用前面的样本做经验回放来缓解遗忘。这个点我后面在别家的面试里准备过,再遇到就答得顺多了。
腾讯一面的算法题是手写一个快排的变种——按奇偶性重排数组,奇数在前偶数在后,并且相对顺序保持不变。这就是典型的考察稳定性和空间复杂度的题目。最直接的解法是新建两个数组分别收集奇数和偶数再合并,时间复杂度 O(n),空间复杂度 O(n)。面试官问能不能做到 O(1) 空间?我想到的是类似插入排序的思路,从左往右找到第一个偶数,再往后找第一个奇数,然后把这个奇数依次交换到偶数前面。相对顺序不变,空间 O(1),但最坏时间复杂度是 O(n²)。跟面试官讨论了这个 trade-off,他说可以了。这一题给我的感觉是:面试官想看的不是你会不会背某个模板解法,而是你能不能分析不同解法的优劣,并且理解为什么某些场景下稳定比空间更重要。
2.3 腾讯二面:更高维度的方案设计与系统思考
腾讯二面面试官应该是部门 leader 级别的人,问题明显从"你会不会这个"变成了"你能不能用这些技术解决实际问题"。他直接给了我一个场景:微信里的视频号推荐,如果让你设计冷启动方案,你会怎么做?
这个问题很大、很开放,考察的是系统设计能力。我当时的回答分了几个层次:对于新发布的视频,先通过内容理解打标签(多模态:视觉、音频、文本);然后利用标签匹配到已有的内容池或用户兴趣簇;对小流量测试阶段设计探索与利用策略,比如 UCB 或汤普森采样;等累积到一定交互量后再切到常规的召回排序链路。面试官追问了"你怎么判断一个视频是否已经到了可以切换的充分交互量"——这个问题考的是工程指标设计。我回答按交互条数和置信区间来定,比如一个视频至少要有多少曝光和正的反馈量,用 Wilson 区间看 CTR 的下界是否已经超过某个阈值,再决定是否切换。这个回答面试官是认可的。
二面还有一道手撕代码,题目是:二叉树的层序遍历,但要求按之字形(zigzag)输出。这是剑指 offer 原题,两个栈或者双端队列都可以解决。我选了双端队列,写完后面试官追问了空间复杂度,我答 O(n),最坏情况下队列里会保存一整层的节点。这题答得比较快,感觉这轮的重点已经不在算法题上了,而是在方案设计上。
腾讯的 HR 面比较常规,主要问实习时间、毕业时间、薪资期望、能不能接受 base 深圳。整体感受:腾讯的算法岗面试非常看重候选人的项目深度和系统思考能力,光会跑模型是不够的,需要能讲清楚为什么、怎么评估、上线后出问题怎么处理。
3. 阿里系面试:指标推导与项目细节的极限追问
阿里我面的是淘系技术部的算法岗,一共面了三轮技术面加一轮 HR。阿里面试给我的整体印象是:问题密度极高,对指标的追问会追到底层公式,而且面试官非常喜欢从你的回答里找下一个问题,前面一个回答如果不严谨,后面往往会连环翻车。
3.1 阿里一面:从项目细节开始的连环追问
阿里的一面是我整个求职季里问题密度最大的一轮。面试官上来没有让我自我介绍,直接对着简历上的推荐项目开始问:你用了 DeepFM 对吧?好,DeepFM 的 FM 部分和深度部分是共享同一个 embedding 的吗?
这个问题我当时愣了一下——因为很多框架的实现里 FM 部分和深度部分是各自维护 embedding 的。我回答的是"在我们项目的实现里,两者共用了一套 embedding,也就是 one-hot 特征只有一个 embedding 向量,同时输入给 FM 部分和深度部分,这能控制参数量,也方便联合训练"。面试官点头,然后追问:如果共用 embedding,那 FM 部分和深度部分的梯度会对同一个 embedding 产生不同的更新方向,怎么处理?这里其实涉及到多任务学习里常见的冲突问题。我当时回答的是:在反向传播时两个分支的梯度会叠加,本质上是加性融合,一般不会出现严重冲突,但如果出现训练不稳定的情况,可以考虑分别用不同的 embedding,或者对 FM 分支设置更低的学习率。面试官没有再深追,但我隐约感觉他其实有更标准的答案——比如 FFM 或者 FwFM 里对 field 维度的显式建模。
然后面试官把问题切到了推荐系统的召回环节。他问:你们做召回的时候,双塔模型的内积用的是什么?为什么选内积而不是余弦相似度?这里有个细节:双塔模型如果用余弦相似度,相当于把向量归一化到单位球面上再内积,这会丢失向量的模长信息。模长在推荐场景中其实是有意义的——它可能反映了特征的"置信度"或者"强度",所以某些场景下不加归一化的内积效果更好。我当时把这个逻辑讲了一遍,面试官看似满意但紧接着问:好,那内积的值域很大,训练的时候你会不会对内积做温度缩放?我说会,温度系数的作用是调节 softmax 的平滑程度,低温让分布更尖锐、更利于区分正负样本,高温让分布更平滑、防止过拟合。面试官终于没有继续在这个问题上追了,但我也被问出了一身汗。
3.2 阿里二面:指标体系的 AB Test 深度推演
阿里二面是我整个面试季里印象最深的一轮,因为面试官把一个 AB Test 的问题问了整整二十多分钟。他给的场景是:一个推荐策略上线,曝光点击率涨了 3%,但人均停留时长降了 5%,这个实验你怎么判断能不能全量?
这题如果只是简单回答"看核心指标有没有显著提升"就太浅了。我当时花了很长的时间去拆解:
第一步,先确认这两个指标的置信区间和显著性。点击率涨 3% 可能是显著的,但停留时长降 5% 是不是噪声?要看 p 值和置信区间宽度。
第二步,分析指标之间的关联。曝光点击率涨了,可能是因为新的策略让用户更容易点到感兴趣的内容,但也有可能是因为标题党或者误导性封面吸引了误点击;如果是后者,用户的真实兴趣没有满足,停留时长就会下降,这属于典型的"点击率陷阱"。
第三步,分层拆解指标。把用户按活跃度分桶,看高活跃和低活跃用户分别的表现;把内容按类型拆,看是不是某一类内容贡献了点击率提升但拉低了停留时长。这里如果发现有明显的跷跷板效应,需要进一步分析是不是推荐多样性的问题。
第四步,结合业务目标判断北极星指标是什么。如果这个产品的核心目标是把用户时长做上去,那停留时长下降就是不能接受的;如果核心目标是提升点击转化、带动商业化收入,那点击率提升 3% 可能更重要。面试官在听到我说"北极星指标"这个词的时候明显有了兴趣,追问我怎么定义北极星指标。我回答的是:北极星指标要能反映产品给用户带来的核心价值,对内容平台来说通常是总消费时长或者活跃天数,而不是点击率这种过程指标,因为点击率是手段,消费和留存才是目的。
阿里二面最后也给了一道手撕代码,题目是判断一个字符串是否是另一个字符串的旋转字符串(比如 abcde 旋转后是 cdeab)。我用的解法是判断两个字符串长度相等且 s1+s1 是否包含 s2。这道题其实很简单,但面试官问了一个很刁的问题:如果字符串长度极大,s1+s1 的内存开销你考虑过吗?这就逼我要么换 KMP 避免拼接,要么说明拼接空间复杂度是 O(n) 但可以通过窗口比较避免。我现场选择了用 KMP 的方式实现了一遍,虽然代码写得比拼接麻烦很多,但面试官的意图我猜就是要看看你愿不愿意考虑极端场景下的内存问题。
3.3 阿里三面:业务理解与机器学习基础结合
阿里的三面(leader 面)反而没有前面那么大的压力,更多是业务理解层面的交流。面试官是 P8 级别的,问的问题偏宏观:你怎么看待当前电商推荐场景里"搜推一体"的趋势?你在实习时有没有了解过搜索链路和推荐链路的差异?
我当时的回答是:搜索和推荐本质上都是"用户意图匹配"的问题,区别在于搜索的意图是明确的、实时的,推荐的意图是隐式的、长周期的。搜推一体的核心是统一建模用户的实时意图和长期兴趣,共享特征和模型结构,但在训练目标和推理路径上仍然需要差异化——搜索更侧重相关性,推荐更侧重多样性探索。这个回答整体比较稳,leader 也没有再往深追,可能是到了这个层级,更看重候选人对行业趋势有没有自己的思考框架。
阿里整体三面下来,我的感觉是:阿里最看重的是细节的扎实程度,一个技术点喜欢从多个角度反复戳,戳到你说不出为止。所以在准备阿里的时候,建议把所有项目里用到的公式、参数量、loss 函数、优化器选择、embedding 维度这些细节全部过一遍,确保每一个点都能做 10 分钟以上的深挖。另外,阿里喜欢考察 AB Test 和指标评估体系,这几乎是必考的,可以提前准备好一套标准的分析框架。
4. 网易系面试:领域知识与代码落地能力并重
网易我面的是网易有道和网易云音乐两个部门的算法岗,最后拿到了其中一个的 offer。网易的整体面试风格跟腾讯、阿里都不太一样——没有群面、没有太强的压力感,但更侧重考察你对具体业务场景的理解,以及代码落地能力。
4.1 网易有道一面:教育场景的 NLP 与用户建模
网易有道的算法岗主要做教育相关的智能化产品,面试官先问了我的项目,然后给了一个场景题:如果一个学生用户在一道题上反复做错,系统该怎么调整对他的推荐策略?
这个问题很有趣,它既有 NLP 的成分(题目文本理解、知识点标签),又有推荐系统的成分(个性化推荐),还有一点点教育学的背景。我的回答是:首先,反复做错意味着当前题目的难度和该学生的能力不匹配,或者学生在这个知识点上有系统性漏洞。系统应该做两件事:一是把当前题目关联的知识点识别出来,然后下调和这个知识点相关题目的难度;二是给学生推荐该知识点的基础讲解内容(视频/文章),而不是继续推题。面试官追问:你怎么判断"反复"的阈值?我当时答的是用滑动窗口统计最近 N 次做题记录里的错误率,同时结合做题间隔时长——如果学生隔了几天又遇到同类题错,说明这不是偶发错误,是有知识漏洞。
网易有道的一面还考了一道 SQL 题,让我计算每个用户连续登录的天数。这道题在算法岗面试里出现频率很高,解法是用 row_number() 给每个用户按日期排序,然后用日期减去序号得到分组标志,相同分组内的记录就是连续的日期区间。我写完 PG 版 SQL 后面试官追问了思路的数学原理——为什么日期减序号就能分组?我解释:如果一个序列是连续的,那么日期递增 1,序号也递增 1,两者之差不变;一旦中间断档,差值就会变大。面试官点头。这道题很多人会背解法但说不清原理,建议理解而不是死记。
4.2 网易云音乐二面:音乐推荐场景的冷启动与多样性
网易云音乐的二面偏推荐系统,面试官给了两个场景题:
第一个场景是歌单冷启动:一首新歌上线,没有用户行为数据,怎么把它推给合适的用户?这个问题我前面在腾讯二面里已经练过一次,答得比较顺。内容理解(音频特征提取、歌词文本分类)、基于相似歌曲的迁移(找风格相近的老歌,把老歌的听众作为候选用户)、多臂老虎机探索,三件套全给出来了。
第二个场景很有网易云音乐特色:用户长期只听某一类音乐(比如只听民谣),你是会给他推更多民谣还是尝试拓宽他的口味?这题表面考推荐多样性,实际上考的是探索与利用的平衡,以及商业目标的理解。我回答:从用户体验角度,完全只推同一品类会让用户审美疲劳,也容易导致推荐系统进入信息茧房;但从短期指标角度,推用户熟悉的品类点击率更稳定。所以策略上应该是以利用为主(70-80% 的流量推相关品类)、探索为辅(20-30% 的流量在其他品类试水),同时探索的部分要设定兜底机制,如果用户对探索内容表现出强烈的负面反馈(比如连续划掉、删除),就降低这类内容的权重。面试官认可这个回答,并补充说网易云音乐的场景里还有歌单的"氛围感"因素——同样一首歌,在不同的歌单里推荐效果可能完全不同。这个补充其实是暗示推荐不只是 item-to-user,还要考虑 item-to-context,我当时也在笔记里记下来了。
网易的算法题考了两道,一道是二分查找的变种(在旋转有序数组里找目标值),一道是编辑距离的 DP 实现。第一道题我用了标准的二分加有序区间判断的解法,第二道题是经典的二维 DP,写起来不难,但面试官追问了"如果字符串长度是 10 万,你的 DP 会内存溢出,怎么优化"——这考的是滚动数组优化,把二维 DP 降到一维,时间复杂度不变,空间从 O(mn) 降到 O(n)。我现场写了滚动数组版本,面试官满意。网易的算法题整体难度跟腾讯相当,比阿里略简单,但更看重边界条件和复杂度优化。
4.3 网易 HR 面与 offer 沟通
网易的 HR 面比较轻松,主要问职业规划、对部门的了解程度、手里有没有其他 offer 以及期望薪资。这里有一个小建议:当 HR 问"你手里有其他 offer 吗"的时候,不要撒谎,但也不用太实诚地把所有 offer 都交代干净,可以说"有 1-2 家在流程中",给对方一个合理的紧迫感,又不至于让对方觉得你只是在拿这个 offer 当备胎。
5. 机器学习基础考点:五家面试中重复出现的那些题
除了各家特色问题,机器学习算法岗面试里有一批"约等于必考"的基础题。我把三家面试里反复出现的知识点整理了一下,这些内容几乎是算法岗面试的基本盘,如果没有完全掌握,建议先补齐再投简历。
5.1 模型原理类考点
逻辑回归是我被问得最多的一道题。问法通常有这些变种:逻辑回归的损失函数是什么、为什么用交叉熵不用均方误差、逻辑回归为什么能用于非线性分类、逻辑回归的决策边界是线性的还是非线性的。这几个问题里最有陷阱的是最后一个——逻辑回归本身是线性模型,决策边界是线性的,但通过特征工程(多项式特征、核函数)可以处理非线性问题。面试官特别爱看你能不能清楚地区分"模型本身"和"特征表达"这两个层面。
SVM 的考察频率也很高。常见问法包括:SVM 的损失函数是什么、什么是支持向量、软间隔里的 C 参数有什么作用、核函数怎么选、SVM 和逻辑回归的区别第。重点说一下 C 参数:C 越大,对误分类的惩罚越大,模型越倾向于减少训练集错误,但容易过拟合;C 越小,对误分类的容忍度越高,泛化能力可能更好。这个点如果只回答"C 是惩罚系数"是不够的,要把 C 对偏差方差的影响讲清楚。
GBDT 和 XGBoost 也是高频考点。GDBT 的基础问题是:GBDT 每一轮拟合的是什么?不是残差,是损失函数对当前模型预测值的负梯度(当损失是平方损失时,负梯度恰好等于残差)。XGBoost 相比 GBDT 的改进点要至少能说出三四个:二阶泰勒展开(用了一阶导和二阶导)、正则项的显式加入(叶子节点数和叶子权重的 L2)、特征列预排序和近似直方图算法(工程加速)、对缺失值的自动学习方向、支持列采样。此外,XGBoost 里叶子节点的最优权重有闭式解,推导就是让损失函数对叶子权重求导等于零,这个推导经常被要求现场推一遍。
5.2 工程与评估类考点
评估指标方面,准确率、精确率、召回率、F1、AUC、GAUC、NDCG,每一个都要理解到"能说公式+能说场景偏好"的程度。AUC 的物理含义要会解释——随机抽取一个正样本和一个负样本,正样本的预测分数大于负样本的概率。这个解释经常被当作追问的起点,比如"如果 A 模型的 AUC 高于 B 模型,但是 AB Test 的时候 A 模型效果反而更差,你怎么排查"——这里就涉及到 AUC 的局限性:AUC 对全体样本的排序质量做平均,但在用户维度上可能存在"用户分组内排序提升、组间不均衡导致整体 AUC 虚高"的情况,所以业界常用 GAUC,先按用户分组算 AUC 再按曝光加权平均。
类别不平衡问题也几乎必考。我的标准答法是:先分清楚是"绝对不平衡"还是"相对不平衡",然后从数据、模型、损失函数、评估四个层面给方案。数据层面可以过采样/欠采样,但要注意过采样可能导致过拟合,SMOTE 生成样本时也要小心噪声;模型层面可以选用对不平衡更鲁棒的模型,或者用集成学习;损失函数层面可以用 focal loss 或者给少数类样本加权;评估层面不要只看 accuracy,要看 PR 曲线或者 ROC 曲线。这里加分项是你能说出"为什么 accuracy 在不平衡场景下不可靠"——因为如果正样本只有 1%,模型全部预测负样本也有 99% 的准确率,但模型一点用都没有。
5.3 手推公式的准备方法
面试里"手推"的环节比很多人想象的多。我遇到过的现场推导包括:逻辑回归 loss 对参数的梯度推导、线性回归的闭式解推导、softmax 交叉熵的反向传播推导、SVM 的对偶问题转换、XGBoost 里分裂增益(gain)的公式推导。这些推导说实话不难,但不提前练几遍,面试现场真的容易卡住,因为你的手速、公式书写清晰度、变量命名的规范性都会影响面试官对你的判断。我的建议是:选几个核心模型的完整推导,每个都手写三遍以上,直到不用过脑子就能顺畅写出来的程度。目标不是"会推",是"肌肉记忆"。
6. 手撕代码环节的准备经验与具体题目
算法岗的手撕代码跟开发岗比确实温和一些,但有几类题目几乎是算法岗专属高频率,值得重点准备。
第一类是 DP(动态规划)题。编辑距离、最长公共子序列、最长递增子序列、背包问题,这四道我建议不仅会写二维版本,还要会写压缩到一维的优化版本、以及打印路径的版本。面试官很爱追问空间优化,这算是基本的"延伸题"。
第二类是树的遍历。层序遍历、之字形遍历、前序中序后序的非递归写法,二叉搜索树的第 K 大节点,树的最近公共祖先(LCA),这些都是最高频的考点。二叉树的题套路比较固定,核心是把递归版本的写法练到滚瓜烂熟,再理解非递归版本用栈模拟的过程。
第三类是双指针和滑动窗口。最长无重复子串、盛最多水的容器(双指针经典题)、三数之和、合并两个有序数组,这类题在算法岗面试里出现频率很高,因为代码量适中,而且容易考察边界条件。
第四类是概率题和随机数题。机器学习算法岗有时会考一些随机算法,比如用不均匀硬币产生均匀分布、带权随机采样(这个在推荐系统的负采样里也有实际应用)、蓄水池抽样(未知大小的数据流中等概率抽样)。蓄水池抽样我至少被问了两次,原理是:遍历到第 i 个元素时,以 1/i 的概率替换当前选中的元素。这个证明可以通过数学归纳法完成,建议理解并能现场证明。
第五类是海量数据处理。如果面试官想加压,可能会问"如果数据量非常大,内存放不下,怎么办"——经典方案包括分治 + 哈希取模(把大文件分成小文件)、位图法(记录数据是否出现过)、布隆过滤器(判断存在性,有误判率)、外部排序(归并)。这类题在算法岗面试里出现频率不高,但一旦出现就是拉差距的题。
7. 项目深挖是最容易翻车的环节:简历内容与讲述逻辑
我在面试中最大的体会是:项目经历被深挖的深度,直接决定了面试的上限。很多人的项目其实做得不错,但因为讲述逻辑不清晰或者细节准备不足,在面试官深挖两三轮之后就撑不住了。
项目讲述我后来总结出了一套比较顺的逻辑,这里分享给大家:现象 → 痛点 → 方案 → 验证 → 反思。
"现象"就是把业务场景用一两句话说清楚,比如"信息流广告的点击率随着时间推移在衰减"。"痛点"是这个业务问题背后技术上的难点在哪,比如"用户兴趣变化快导致模型时效性不足"。"方案"是你具体的技术选型和实现路径,这部分要讲清楚特征怎么设计的、模型结构是什么、训练数据怎么构建、上线流程怎么走。"验证"是你怎么证明方案有效——离线指标、在线 AB Test 结果、分层评估结果都要有。"反思"是最能拉开差距的环节——这个方案有什么不足、如果重新做你会怎么改进、你还考虑过哪些其他方案但最终没有采用、为什么。一个能讲清楚"反思"的候选人,在面试官眼里的评价通常比单纯讲"做了什么"的人高一个档次。
简历上还有一个容易翻车的细节:不要写一些你自己其实没有完全理解的"热词"。比如很多人喜欢在简历上写"用过 Transformer",面试官问一句"Transformer 里的 position encoding 为什么用正弦函数不用可学习参数"就卡住了,这会极大拉低面试官对你基础能力的评价。简历上的每个技术名词,都要以"能接住三连追问"为标准来写。
8. 复盘与心得:被拒的原因、改进的方向和一些实在的建议
面完所有公司的技术面之后,我做了比较完整的复盘。有几件事我觉得值得单独拎出来说:
第一,面试中"卡壳"不可怕,可怕的是卡壳之后的处理方式。我最初几轮面试里,遇到不会的问题会直接愣住,然后面试官印象就很差。后来我学会了"部分回答 + 换角度切入"的技巧:哪怕不知道完整答案,也可以先把你知道的那部分讲出来,然后说"这个方向我不太确定,但如果从另一个角度理解的话……",用这种话术给自己争取思考时间。大多数面试官其实愿意听你分析问题的过程,而不是只等你给一个完美答案。
第二,自我介绍的质量被很多人严重低估。算法岗的自我介绍不要从头到尾念一遍简历——面试官手里就有简历,不需要你来念。更好的方式是把自我介绍当成一次"重点预告":用两三分钟把你想让面试官重点关注的项目和技术方向讲清楚,引导接下来的提问方向。比如"我主要做推荐方向,对召回环节的多路召回和粗排环节的轻量模型有比较多的实践经验",面试官大概率会顺着你的方向去问,这比被动等他随机挑简历上的内容要可控得多。
第三,面试中的记录和复盘很重要。我每面完一轮,会立刻花十五分钟时间把能记住的题目全部整理进一个文档,包括当时我的回答、面试官的追问、我卡壳的点、以及事后查资料补充的完整答案。等到了下一家公司面试,我会把这些文档拿出来集中过一遍。这个方法看起来笨,但实际上效果出奇好——因为算法岗面试的题目范围就那么大,你整理过的题目几乎都会在后面的面试中再次遇到。到后期我面到第三家的时候,很多问题我已经能条件反射地回答了,这让我在面试中明显更放松。
第四,基础知识的学习资源。如果你是刚开始准备算法岗面试,我比较推荐按这个顺序来:先过完李航的《统计学习方法》前八章(感知机、KNN、朴素贝叶斯、决策树、逻辑回归、SVM 这些),然后搭配周志华老师的《机器学习》(西瓜书)作为补充理解,再刷完 LeetCode 热题 HOT 100 和剑指 offer,最后把一些重点模型的公式推导手写三轮。时间充足的情况下可以看深度学习相关的课程,但说实话面试的深度没那么夸张,以上几样扎实了,覆盖 80% 以上的基础考点没什么问题。
第五,也是最后想说的,面试是一个双向筛选的过程,不要只想着"被选择"。面到后面我发现,面试官问你问题的方式、追问的角度、以及你遇到不会的问题时对方的态度,其实能反映出这个团队的技术风格和合作氛围。阿里那种高压式的追问不适合每个人,网易那种偏业务讨论式的交流也会有人觉得很没挑战。找到适合自己的团队,比单纯追求"大厂 offer"重要得多。这也是为什么我觉得面经的意义不只是帮你过面试,更是帮你在还没入职之前就提前感受一下,接下来几年你可能会在什么样的环境里工作。
机器学习算法岗的面试其实没有想象中的那么"卷天卷地"。把基础打扎实、把项目讲透彻、把代码题练熟练,整个面试过程会顺畅很多。希望这篇面经能帮到正在准备的同学,祝大家都拿到满意的 offer。