最近不少读者私信我聊校招笔试的事,尤其深度学习算法岗,大家都觉得“题海战术”不好使,刷了一堆 LeetCode 却不知道重点在哪。这让我想起自己当年参加网易 2018 实习生招聘笔试的场景——那次笔试给我留下的印象特别深,不是因为它难,而是因为它把“算法基本功”和“深度学习理论基础”结合得非常紧密,很多题乍一看是工程题,实际上在考你有没有真正理解模型背后的原理。这篇文章我就以那次笔试为蓝本,把深度学习算法实习生岗位最常考的几类题目、背后涉及的算法原理和复习方法一次性拆透,希望能给准备大厂算法岗的同学一个清晰的方向。
无论你是刚入门深度学习、还在啃 CNN 和反向传播,还是已经有项目经验但担心笔试翻车,这篇复盘都值得你花十几分钟看完。我会用“题目类型 + 核心知识点 + 避坑经验”的方式展开,重点讲清楚为什么这样出题、应该怎么答、平时怎么练,内容完全是干货向的。
1. 笔试整体思路与考察范围解析
1.1 为什么这样出题:算法岗要的不是“调包侠”
先聊聊大厂的招聘逻辑。深度学习算法实习生,招进去之后要做模型训练、调优、上线,但这些工作的前提是你得具备两种能力:一是扎实的数学和算法基础,二是对深度学习模型原理的真正理解。如果只会调用框架的 API,那和“调包侠”没区别,遇到新问题就抓瞎。
网易 2018 实习生的这套笔试,很多人以为会出大量神经网络结构题,结果拿到卷子发现,数据结构、算法设计、数学基础占了很大比重,深度学习相关的题目反而更偏向“理解判断题”和“计算推导题”。这是很典型的大厂算法岗风格——因为实习生要接触真实业务场景,模型需要改结构、调损失函数、处理数据不平衡,这些都需要底层原理支撑,不是会跑个开源代码就能解决的。
1.2 四类高频模块的分值排布
根据我当时的回忆和周围同学的反馈,这套笔试基本可以分成四个大模块:
- 机器学习与深度学习理论基础:占 30% 左右。考的是 LR、SVM、CNN、RNN 的核心概念,以及过拟合、激活函数、梯度消失等基础问题的理解。
- 数学基础:占 20% 左右。概率论、线性代数、最优化方法,尤其是与梯度下降相关的推导。
- 数据结构与算法:占 35% 左右。排序、KMP、动态规划、贪心、二叉树等经典题。
- 编程题与综合题:占 15% 左右。给一个场景,要求设计解决方案,考察工程思维。
这个分值结构告诉我们一个非常重要的信号:深度学习和数据结构算法是两条腿,缺一条都走不稳。很多人只盯着神经网络皮毛,却忽视了“算法”这两个字在岗位名称里的分量。
1.3 按岗位定制复习方向
如果你是冲着“深度学习算法实习生”这个岗位去复习,我建议你把时间这样分配:
- 第一优先级:数据结构与算法刷题(LeetCode 中等难度为主,Hot 100 够用),每天 2-3 道,保持手感和思路。
- 第二优先级:深度学习基础理论,尤其是 CNN、反向传播和激活函数,做到能手推、能解释。
- 第三优先级:机器学习经典模型,LR、SVM、决策树、随机森林、GBDT,重点理解损失函数和适用场景。
- 第四优先级:数学基础,概率论里的贝叶斯、线性代数里的特征值、最优化里的梯度下降变体。
这样安排的原因是,笔试的淘汰率主要靠算法题拉开的,而深度学习题大多只要理解到位就能答对,拉分效果不如算法题明显。所以你要用“算法题保底,理论题拉分”的思路来备考,不要本末倒置。
2. 深度学习核心考点拆解
2.1 卷积神经网络:不仅是“知道”还要“会算”
CNN 是深度学习算法岗笔试的绝对重点。网易的笔试不会直接问你“什么是卷积”,而是给你一个具体输入尺寸和卷积核参数,让你算输出尺寸、参数量、感受野。这要求你不仅要理解卷积的“滑动窗口”直觉,还要把公式记住并且熟练运用。
我当时遇到的题目是:输入 32×32×3 的图像,经过一个 5×5×3 卷积核、步长 1、填充 2 的卷积层,输出尺寸是多少?这时候用公式:
输出尺寸 = (输入尺寸 + 2×填充 - 卷积核尺寸) / 步长 + 1
代入可得:(32 + 2×2 - 5) / 1 + 1 = 32。这类题就是送分题,但如果你只看懂了卷积的示意图,没动手算过,考场上很容易蒙圈。我给的建议是:把卷积、池化、全连接的输出尺寸计算、参数量计算列成一个速查表,考前反复默写三遍,做到看到参数直接出答案的程度。
2.2 池化层:为什么它能减少计算量又不伤特征
池化层在笔试中出现频率也不低。考察点主要分散在三个方向:一是最大池化和平均池化的区别;二是池化的作用,包括降低计算量、增强平移不变性、防止过拟合;三是池化层的梯度传播规则。
这里容易出错的是梯度传播。最大池化在前向传播时记录最大值位置,反向传播时把梯度传给那个位置,其他位置梯度为 0;平均池化则是把梯度平均分配到每个位置。很多同学在面试或笔试时能说出前三点,但一问梯度传播就卡壳,这就是基础不扎实的表现。
我当时的经验是,把每个层的反向传播规则都用小例子手推一遍,比如一个 2×2 的最大池化,输入 [[1, 3], [2, 4]],最大值是 4,反向时梯度就全给 4 这个位置。推过一遍之后,这类题就再也难不倒你了。
2.3 激活函数与梯度消失:老生常谈但要说到点子上
激活函数是笔试必考题,但大多数人的回答都停留在“ReLU 比 sigmoid 好”。网易的笔试题会把梯度消失问题、梯度爆炸问题、ReLU 死亡问题放在一个综合题里考,要求你解释原因,并给出解决方案。
梯度消失的本质是链式法则连乘导致的。如果用 sigmoid,它的导数最大值只有 0.25,多层反向传播时,梯度每层至少乘以 0.25,十几层之后梯度就趋近于 0,导致浅层参数几乎不更新。解决办法有几个方向:
- 改用 ReLU 这类导数恒为 1(正区间)的激活函数;
- 添加 Batch Normalization,把每层输入分布拉回合适区间;
- 使用残差连接(ResNet),让梯度有一条“高速公路”直接传给浅层;
- 合理初始化权重,比如 He 初始化,避免一开始就进入饱和区。
笔试答题时,如果问“ReLU 有哪些缺点”,你不能只说“神经元死亡”,要补充说明原因——当输入为负数时,梯度为 0,如果某个神经元的所有输入都落在负区间,它的权重就永远不会更新了。解决方案可以用 Leaky ReLU 或 PReLU。把因果链条讲清楚,得分率会明显高一个档次。
2.4 反向传播与链式法则:必须会手推
反向传播是深度学习最底层的原理。网易的笔试有时候不给神经网络结构,而是直接给一个简单计算图,让你求梯度。这类题说难也不难,关键是熟练。我的建议是,考前把 BP 的推导过程完整写三遍,从最简单的两层网络开始。
我当时遇到的是一个带 Sigmoid 激活的两层全连接网络,输入 x 是一维标量,隐藏层一个神经元,输出一个标量,均方误差作为损失函数。这种题没有捷径,就是按照链式法则一层一层求偏导:
第 1 步,前向传播,求出每一层的输出值;
第 2 步,从损失函数开始,对输出层激活函数的输入求导;
第 3 步,把梯度向后传播到隐藏层,再传播到权重参数;
第 4 步,整理成权重更新的表达式。
如果你能做到不看资料,独立推导这个计算过程,笔试里的 BP 题基本就稳了。深度学习岗不会写代码还能理解,但不会反向传播,那就完全说不过去了。
3. 机器学习与数学基础必考题型
3.1 经典模型对比:LR、SVM、决策树的本质区别
虽然岗位是深度学习方向,但机器学习基础一样会考。网易笔试常出现“比较逻辑回归和支持向量机”这种开放题,这时候你不能只罗列“一个用交叉熵,一个用合页损失”,而是要有层次感。
我的回答思路是:先讲两者都是监督学习的分类模型;再从决策边界的角度说,LR 是一种线性分类器,输出是概率,天然适合排序场景;SVM 则通过最大化间隔寻找最优超平面,在样本量小、维度高时更有效,配合核技巧可以处理非线性问题。最关键的差异在于损失函数和优化目标——LR 优化的是对数似然,SVM 优化的是几何间隔,这决定了它们对离群点的敏感度不同。
3.2 损失函数与评价指标:不能只背公式
算法岗笔试对损失函数的考察往往和实际场景结合。你得能说出什么时候用交叉熵,什么时候用均方误差,什么时候要加正则化项。交叉熵更适合分类,因为它对概率分布的差异敏感,梯度更新也更稳定;均方误差适合回归,但如果和 Sigmoid 一起用在分类任务里,会导致梯度更新缓慢。
评价指标也一样。有一个经典问题:在正负样本极不平衡的数据集里,准确率是否有意义?答案是没有意义——假设 99% 是负样本,模型全预测负样本也有 99% 的准确率。这时应该用精确率、召回率、F1 或者 AUC。这种思维题考察的是你能否在真实业务里发现“看似正确实则错误”的评估方式,非常能体现候选人的水平。
3.3 概率与统计:一个容易被忽视的提分点
数学基础里,概率论是考试重头戏。网易这类大厂笔试很喜欢考贝叶斯公式、期望方差、最大似然估计。复习时不需要把概率论整本书啃下来,但有几个点一定要掌握:
- 条件概率和贝叶斯公式,尤其是“先验概率 + 似然 → 后验概率”的理解;
- 高斯分布的参数估计,本质就是求最大似然的过程;
- 大数定律和中心极限定理的直觉。
我当时遇到贝叶斯相关的题时,很快联想到朴素贝叶斯模型,因为面试官问我“为什么朴素贝叶斯要假设特征独立”,答案是为了简化计算,但现实中特征往往不完全独立,所以它本质上是一个简化模型。这种“算法原理 + 数学基础”结合的复习方式效率很高,一举两得。
4. 数据结构与算法笔试高频题解析
4.1 排序算法:复杂度对比表是你必须背下来的东西
我现在都记得,网易笔试有一道关于排序的题目要求选择不稳定的排序算法,然后针对快排在最坏情况下的时间复杂度进行分析。这种题看起来常识,但非常检验基础能力。你至少需要心里有一张清晰的排序算法复杂度表:
| 排序算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 |
我更建议你深入理解为什么排序算法是稳定的,或者为什么不稳定。比如快排为什么不稳定?因为交换操作可能跨越多个位置,把相同元素的相对顺序打乱。堆排序同理,堆的调整过程无法保证相同元素的相对位置。搞清楚原因后,即使笔试换个角度问,你也能应对自如。
4.2 KMP 算法:next 数组推导是高频考点
KMP 算法在笔试里的高频程度,超出了很多人的预期。它典型的出题方法是:给定模式串,让你求 next 数组,并说明 KMP 和朴素模式匹配的复杂度对比。
比如给定 p = "abacaba",你需要亲手推导它的 next 数组。下面我完整演示一遍推导过程,方便你理解里面的规律:
- 手动失配时,我们把 next[i] 定义为“模式串前 i 个字符组成的子串中,最长的相同前后缀长度”。
- i = 0,定义 next[0] = -1;
- i = 1,子串 "a",没有真前后缀,next[1] = 0;
- i = 2,子串 "ab",前缀 a 与后缀 b 不同,next[2] = 0;
- i = 3,子串 "aba",最长相同前后缀是 a,next[3] = 1;
- i = 4,子串 "abac",最长相同前后缀是空,next[4] = 0;
- i = 5,子串 "abaca",最长相同前后缀是 a,next[5] = 1;
- i = 6,子串 "abacab",最长相同前后缀是 ab,next[6] = 2;
- i = 7,子串 "abacaba",最长相同前后缀是 aba,next[7] = 3。
所以 next 数组依次是 [-1, 0, 0, 1, 0, 1, 2, 3]。
我在笔试前专门用一天时间把 KMP、BM、Sunday 三种字符串匹配算法的 next 数组推导都练了一遍,这类题在考场上基本就是送分题。如果你时间有限,至少要保证 KMP 的 next 数组能手工推导,因为出题成本低、区分度又高。
4.3 动态规划与贪心:核心是“推导状态转移”
动态规划是笔试压轴题的常客,网易特别喜欢出这一类题,因为 DP 题能直接反映逻辑思维和代码实现能力。
我在那次笔试中印象最深的一道题类似于爬楼梯费用问题:给定一个数组 cost,每当你爬上一个台阶就要花费对应的体力值,然后你可以选择迈一步或者两步,求到达楼层顶部的最低花费。思路是维护一个一维 dp 数组:dp[i] 表示到达第 i 级台阶所需的最小花费,状态转移方程就是 dp[i] = min(dp[i-1], dp[i-2]) + cost[i]。
如果你能把 dp 数组的含义和转移方程讲清楚,即使代码有些小 bug,面试官也会认为你具备基本算法素养。笔试时,DP 题最关键的不是“想出一个办法”,而是“想办法证明你的办法是对的”,也就是最优子结构。
5. 大模型时代的新增考点:浮点数格式与模型部署
5.1 FP32、FP16、BF16、TF32 的格式区别
深度学习算法岗位笔试里,浮点数格式的题在线下笔试中出现得不多,但近两年大模型相关的笔试和面试非常爱考,尤其是当岗位涉及模型训练、推理性能优化时。2018 年那会儿其实还没有这么普及,但以现在的视角复盘,如果你打算走这条路线,这个考点值得提前了解。
我们可以这样类比:训练好的模型是一个庞大的实数集合,这些数字精度越高,占用的内存和计算资源就越大。FP32 是单精度浮点数,用 1 位符号位、8 位指数位、23 位尾数位,可以表示很大范围的数,精度较高,但训练大模型时显存占用很高。FP16 用 1 位符号位、5 位指数位、10 位尾数位,优点是省显存、计算快,缺点是表示范围有限,容易出现溢出和精度丢失。BF16 是用 1 位符号位、8 位指数位、7 位尾数位,动态范围与 FP32 几乎一致,只是精度变低,非常适用于大模型训练时的梯度缩放。TF32 则是 NVIDIA 专门针对 Ampere 架构设计的格式,它用 8 位指数,但只截断 10 位尾数,结合了 FP32 的动态范围和接近 FP16 的运算速度。
5.2 笔试和面试中如何回答这类问题
如果在笔试题里遇到“FP16 训练为什么需要 loss scaling”,你仅仅回答“防止梯度下溢”还不够,要补充为什么梯度会下溢——FP16 的指数范围只有 5 位,可以表示的最小正数约为 2^-24,而正常训练过程中梯度数值往往小于这个范围,导致梯度变成 0,权重没法更新。所以我们需要把损失值放大若干倍,梯度相应放大,更新完成后再缩回去。
还有一个高频问题是“量化会导致精度下降,为什么大家都在用”。答案也很有层次:一是模型参数和激活值分布往往集中在一个小范围内,用低精度表示时损失有限;二是推理阶段,量化可以显著降低内存带宽和计算量,吞吐量提升明显;三是对大多数业务场景而言,少量精度损失换来的速度提升是值得的。
对这个知识点,我的复习建议是:不要只看格式,要理解“动态范围 vs 精度”的取舍关系,学会画出一个浮点数格式的字段分布图,然后把常见的数值溢出和精度问题都过一遍,这样无论题目从哪个角度切入,你都答得出来。
6. 常见问题与排查技巧实录
6.1 笔试时间分配:最常见的翻车原因
深度学习和算法岗的笔试,题量通常不小,尤其是选择题部分,看起来每道题都很简单,但做起来会占用大量时间。我见过太多同学在选择题上花太多时间,导致最后的编程题没时间写,而这恰恰是整张卷子分值最重的一部分。
我的习惯是先花 3 到 5 分钟快速浏览整张试卷,标记出编程题的难度,然后用 1 小时左右解决选择题和填空题,再留出至少 1 小时专攻编程题或综合设计题。如果你在做题时卡了一道题超过 5 分钟,先跳过,把能拿的分拿完再说——这种策略对任何笔试都适用。
6.2 失分点复盘:这些问题一定要提前规避
根据我的复盘,笔试失分点集中在以下几个地方:
- 手推公式时的计算错误:尤其是 BP 推导和浮点数计算时,符号和下标特别容易错。建议平时训练时,每写一步都回看一眼,用值代入法检查,比如假设输入为 1,看损失是否为 0。
- 对“稳定性”理解不清晰:很多人在排序问题上只记住结论,不理解定义。笔试时他会把定义换一种方式表达,你就容易乱。解决方法是记定义,而不只是记结论。
- 答题没有条理,逻辑混乱:主观题不是只写公式就够,要让面试官看出你的推导过程。推荐用“已知 → 解 → 结论”的格式写解答,尽量呈现思考过程。
- 忽略边界条件:代码题目中,一般需要注意数组为空、长度为 1、输入为负数这些边界情况。我在考场上吃过亏,所以特别提醒:写代码时一定多检查边界。
6.3 结合深度学习的独特避坑技巧
深度学习算法岗笔试,有一个独特的坑:它经常会问一些“看起来是编程、实际是理论技巧”的题。比如实现 Dropout,很多考生直接写“随机将神经元置 0”,但忽略了“训练时进行缩放、测试时保持不变”这个关键细节。
所以,在复习深度学习算法岗位时,一定要比普通算法岗多一个步骤:把每个经典模型的实现细节和推理阶段的差异过一遍。包括 Batch Normalization 在训练和测试时的不同行为、Dropout 在训练和测试时的不同行为、数据增强在训练和测试时的处理方式。这些细节都是笔试出题人非常爱放的地方。
我个人的方法是:看完一节论文或者模型后,给自己出一道“如果我是面试官,我会怎么问”,然后尝试回答,这样才会在一个模型里挖出更多层次,比自己只看别人的总结要有效得多。笔试不是为了刷题而刷题,而是在复习中不断加深对模型原理的理解,把知识和工程实现真正串起来。
7. 总结与给后来者的实用建议
7.1 一套完整的复习路线图
如果你现在还是大一、大二,时间充裕,那最好的路线是:先学数据结构与算法,推荐《算法导论》相关章节配合 LeetCode;然后学机器学习基础,至少把吴恩达的课程过一遍;再学深度学习,把《深度学习》(花书)里 CNN、RNN、优化算法、正则化这几个核心章节读透;最后多看大厂技术博客,了解他们在真实业务中遇到的问题和解决方案。
如果你是临近笔试才开始复习,那就抓大放小。首选高频考点:排序和 KMP 这类算法题一定要熟练,CNN 的前向传播和反向传播要做到能推能算。深度学习的开放性题目要会列点回答,不要求深度多高,但要有条理。掌握“先保底再拉分”的节奏,远比花大量时间啃冷门知识点有效。
7.2 资料推荐与使用方式
最后推荐一些我一直觉得不错的资料组合:
- 算法刷题:LeetCode Hot 100 和剑指 Offer,按“数组 → 链表 → 树 → DP → 字符串”顺序推进。
- 机器学习理论:李航《统计学习方法》第一版即可,重点看感知机、LR、SVM、决策树、AdaBoost 这几章。
- 深度学习基础:花书 + 李沐的《动手学深度学习》,一边看理论一边跑代码,效果最好。
- 神经网络架构:CS231n 的课程笔记,尤其是卷积神经网络和反向传播的部分。
- 浮点数与部署优化:NVIDIA 官方文档和 Hugging Face/OneFlow 等技术社区的部署实践,理解大模型训练为什么需要混合精度。
7.3 笔试之外,别忘了准备这些
笔试只是第一步,过了笔试还有面试。网易这类公司的面试非常看重项目经历和思考深度。如果你没有相关项目经验,强烈建议自己找一个小的开源数据集,从零训练一个简单的模型,完整记录整个过程中的踩坑经历。面试官真正想听的,不是“我用 PyTorch 跑通了 ResNet”,而是“我在训练时遇到了 loss 不下降的问题,通过排查发现是学习率太大导致震荡,调整后 loss 正常下降”。
这份真实经历比十篇高深的技术博客都有说服力。哪怕项目很小,只要你能把来龙去脉讲清楚,就已经跑赢了大多数候选人。
根据我个人实际体验,深度学习算法岗的笔试是一个“筛选器”,它把那些只懂得调用框架、却不明白底层原理的人挡在门外。把基础打牢,把推导练熟,把经验沉淀成自己的话术,你会发现笔试并没有想象中那么可怕。希望这篇复盘能帮你把复习路线理清楚,少走一些我当年走过的弯路。