
每年到这个节点都会有不少准备投大厂算法岗的同学来问我网易的笔试到底怎么准备。说实话比起那些上来就甩五道竞赛题、让人全程自闭的硬核笔试网易深度学习算法工程师这套题算是“讲武德”的它不追求把你考倒而是想在有限时间里看清楚你的基础扎不扎实、工程直觉好不好、遇到陌生问题敢不敢下手。但我见过太多人挂在同一个地方——以为考深度学习就只复习深度学习结果被浮点数精度、KMP的next数组、拉普拉斯算子这类“看着眼熟却写不对”的题打了个措手不及。这篇东西我就结合自己备考和带人的经验把网易2023校招深度学习算法工程师提前批笔试的考点拆开揉碎讲一遍。文章不会去贴具体原题毕竟有保密协议但题型分布、高频考点、底层原理和实战推演都会给到最后附一份我亲测有效的备考路线。不论你是还剩三个月还是只剩一周按这个思路走至少不会在考场上出现“这题我见过但就是想不起来”的窒息时刻。1. 网易这套笔试的题风不考偏题怪题专考基本功先说整体的试卷框架。网易深度学习算法工程师的校招笔试题型一般分三块客观选择题、手撕编程题、问答/推导题。时间大概两个小时题量在30到40道之间。选择题是重头戏覆盖面广但不深重点集中在机器学习基础、深度学习理论、数学功底线代和概率、数据结构以及一小部分操作系统和计网常识。编程题通常是两道到三道难度梯度拉得很明显第一道基本是LeetCode简单到中等水平用来保底后面一二道是中等偏上考的是你写代码的熟练度和边界处理能力。问答/推导题就很有网易风格了出的都是“你觉得这两个模块怎么选”“这个loss为什么收敛慢”“这个网络结构为什么有效”这类实战向问题考的是你有没有真正用深度学习解决过问题而不只是会调包。从热搜词里也能看出一些风向“深度学习模型部署必知:fp32、fp16、bf16、tf32浮点数格式详解与实战选型”能上热榜说明近两年大厂笔试和面试越来越看重模型部署和精度调优的细节而“粒子群算法原理”“KMP算法”“堆排序算法”“贪心算法”“Dijkstra算法”这些传统算法热词高频出现说明再怎么说自己是算法工程师数据结构和算法基本功永远是第一道门槛。有个很容易被忽略的点这套题的选择题里多选题的权重不低。网易特别喜欢在多选题里埋“看似都对但只有一个细节错了”的干扰项比如把BatchNorm在推理阶段使用的统计量写成“当前batch的均值和方差”实际用的是训练阶段滑动平均得到的全局统计量或者把感受野的计算公式漏掉一层。这种题单看每个选项都对放在一起就能筛掉一大片基础不牢的人。再说说时间分配。两个小时听起来充裕但如果选择题每题磨两分钟编程题一道卡半小时基本就废了。我的建议是选择题控制在50分钟内遇到拿不准的先标记跳过编程题每道最多分配20到25分钟最后留10分钟检查。这个时间策略看起来简单但每年都有很多人因为在一道多选题上纠结太久导致后面编程题没时间写非常可惜。2. 深度学习基础理论CNN、池化、优化器、正则化一个都不能漏这一板块是笔试的绝对核心选择题和问答题都会大量涉及。先说CNN相关几乎必考的是卷积层参数量计算和感受野计算。参数量公式是你在草稿纸上需要条件反射的(输入通道数 × 卷积核高度 × 卷积核宽度 1) × 输出通道数那个“1”是偏置项。感受野计算则是从最后一层往前逐层递推RF(l) RF(l-1) (kernel_size(l) - 1) × stride_accumulated其中stride_accumulated是后面所有层stride的乘积。这类题没什么技巧就是多练几道算到“一看到卷积层参数就知道感受野大概多大”的程度。池化是另一个高频考点热搜词里“深度学习的池化”能上榜一点不意外。笔试喜欢考的是最大池化和平均池化各自在什么场景下更合适。最大池化保留的是区域内的最强响应对纹理、边缘这类特征更敏感而且天然带有一定的平移不变性平均池化保留的是整体分布信息更平滑但对强特征不敏感。有一个容易被忽略的细节最大池化在反向传播时梯度只会回传到前向传播时被选中的那个位置其余位置的梯度为0平均池化则是把梯度平均分配到所有位置。这个细节选择题经常考很多人只记住了前向传播忘了反向传播的差异。优化器也是必考项。SGDMomentum、Adam、AdamW三者的区别要用“说人话”的方式理解SGDMomentum像是一个有惯性的球参数更新方向是当前梯度与历史动量方向的加权和收敛稳定但调参需要经验Adam相当于给每个参数单独适配学习率训练前期收敛很快但后期容易在最优解附近震荡AdamW就是在Adam基础上把权重衰减L2正则从梯度里拆出来单独做有效缓解了AdamL2正则互相干扰的问题。笔试如果考“为什么大模型预训练偏爱AdamW而不是Adam”答案核心就是这一条——权重衰减的处理方式不同导致泛化性能有差别。BatchNorm的细节一定要记牢问答题和选择题都爱在这做文章。训练阶段BatchNorm用当前mini-batch的均值和方差做归一化并同步更新全局统计量滑动平均推理阶段用的是训练阶段累加的全局统计量而不是当前batch的。它的作用可以从两个角度理解一是缓解内部协变量偏移让各层输入分布更稳定二是对每个mini-batch引入轻微的随机扰动有一定的正则化效果。理解了这两个角度就明白为什么BatchNorm能允许你用更大的学习率、更快地收敛。正则化这一块L1和L2的区别是送分题但也是送命题。L1正则化会让一部分权重变成精确的0相当于在做特征选择L2正则化只会让权重趋近于0但不会等于0作用是限制权重范数、防止过拟合。从梯度更新角度看L1的梯度是常数不随权重大小变化L2的梯度是权重的线性函数权重越大惩罚越大。Dropout也是常客要记住它只在训练阶段随机丢弃神经元推理阶段要乘以保留概率或者用inverted dropout推理阶段不做任何操作前者是原版后者是现在框架里的默认实现。还有一点容易被问到的Dropout为什么能防止过拟合因为它迫使网络不能过度依赖某些特定神经元相当于训练了多个共享参数的子网络是一种隐式的模型集成。3. 传统算法与数据结构深度学习岗也要手撕快排和KMP我知道很多同学看到“深度学习算法工程师笔试考KMP”会觉得离谱但这是事实。原因很简单作为算法工程师写代码的能力是硬门槛哪怕你深度学习理论背得滚瓜烂熟编程题写不出来照样过不了。网易的编程题风格偏向“代码量不大但逻辑要清晰”不会出那种需要几百行的大模拟但很爱在细节上做文章。先说说排序这是数据结构考查的重头戏。“堆排序算法”“排序算法”“数据结构排序算法”这些热搜词扎堆出现不是偶然。笔试考排序不会只考时间复杂度而是考你在不同场景下的选型和手写能力。快速排序是必须能手撕的平均O(n log n)、最坏O(n²)、不稳定归并排序稳定但需要O(n)额外空间堆排序O(n log n)且原地排序但不稳定。需要注意三个容易出错的点快排的partition函数怎么写才不会在全是重复元素时退化成O(n²)归并排序的merge过程如何正确处理好两个有序数组的边界堆排序的siftDown和建堆buildHeap的循环方向。这些细节只要手写一遍跑几个用例就能发现但很多人面试时一紧张就写错。KMP是选择题和简答题的常客。热搜词里专门有一条“在kmp算法中对于模式串p‘abacaba’其next数组next[i]定义为...”说明这是一个很典型的考查方式。我在这里把next数组的计算完整推一遍你照着走一遍就能理解整个逻辑。约定next[i]表示模式串前i个字符组成的子串中最长相等前后缀的长度。对于“abacaba”i1子串“a”没有真前后缀next[1]0。i2子串“ab”前缀“a”后缀“b”不相等next[2]0。i3子串“aba”前缀“a”“ab”后缀“ba”“a”最长相等前后缀是“a”长度1next[3]1。i4子串“abac”前缀“a”“ab”“aba”后缀“bac”“ac”“c”没有相等前后缀next[4]0。i5子串“abaca”后缀“a”和前缀“a”相等且再长一点的都不等next[5]1。i6子串“abacab”注意这时候最长相等前后缀是“ab”前缀“ab”等于后缀“ab”长度2next[6]2。i7子串“abacaba”前缀“aba”等于后缀“aba”长度3next[7]3。所以“abacaba”的next数组是[0,0,1,0,1,2,3]。考场上容易错的地方在i6这步很多人看到“ab”和“ab”相等却没接着往前看或者不理解next数组定义的是“前i个字符的相等前后缀长度”而不是“第i个字符之前的最长匹配长度”。把这两者搞混整个数组就全错了。建议你自己在草稿纸上多推两个模式串比如“aaaaab”和“abcabcabc”把递推过程吃透。贪心和动态规划也是编程题的重灾区。一个简单的判断口诀每一步做出当前看起来最优的选择且这个选择不会影响后续决策一般就是贪心如果子问题之间有重叠而且你明显感觉到需要把前一步的结果存下来复用那就是动态规划。网易笔试的DP题不会太难常见的背包问题、最长递增子序列、编辑距离是重点。状态定义一定要先想清楚dp[i][j]表示什么转移方程是什么初始化和边界条件是什么。这四步想清楚再写代码比想到哪写到哪靠谱得多。图论方面Dijkstra、并查集、拓扑排序都是高频考点。Dijkstra要记住它只能处理边权非负的图优先队列优化的版本复杂度是O(E log V)。二分图相关的HK算法热搜词里也有在竞赛里比较常见但校招笔试如果考一般是选择题考察概念比如什么是交替路、什么是增广路、匹配数和覆盖数之间的关系手写实现的可能性不大但原理要知道。4. 模型部署与浮点数选型FP32、FP16、BF16、TF32到底怎么选说实话前几年校招笔试题很少考浮点数格式这种东西但近两年深度学习推理和部署变得极其重要“FP32、FP16、BF16、TF32精度怎么选”已经从面试题蔓延到笔试题了。这项内容也出现在热搜词里说明很多人都在搜但真能说出个一二三的没几个。我把这四种格式的核心差异总结成一张表这是笔试选择题和简答题都适用的内容格式符号位指数位尾数位数值范围约相对精度典型用途FP321823±3.4×10^38高训练默认、推理兜底FP161510±65504低推理加速、混合精度训练BF16187同FP32低于FP16大模型训练、混合精度TF321810同FP32低于FP32Ampere架构TensorCore加速逐一说重点。FP32是单精度浮点数1位符号位、8位指数位、23位尾数位能表示的数值范围很广精度也够用是深度学习训练的默认格式。它的缺点是占用显存大、计算速度相对慢尤其在batch size大的时候显存很容易成为瓶颈。FP16把指数位压缩到5位、尾数位压缩到10位好处是显存占用减半、计算吞吐翻倍前提是硬件支持FP16加速但问题在于数值范围只有±65504很容易溢出。怎么理解这个范围深度学习训练时如果梯度里有几个特别大的值FP16直接变成Infloss瞬间变成NaN训练就崩了。这就是为什么混合精度训练需要做梯度缩放loss scaling在反向传播前把loss放大若干倍梯度也同步放大避免小于FP16最小精度大约6×10^-8的小梯度被置零更新参数前再把梯度缩小回去。这类细节是笔试选择题的最爱它考察的是你是否真的用混合精度训过模型而不只是听过这个词。BF16是Google为深度学习设计的格式指数位和FP32一样都是8位所以数值范围和FP32一致不会出现FP16那样的溢出问题。代价是尾数位只有7位精度比FP16还低训练时通常要和FP32参数副本配合使用。为什么现在大模型预训练普遍用BF16核心就是它的动态范围大不容易溢出省去了loss scaling的麻烦。理解“动态范围大但精度低”这个特点就能明白为什么BF16适合训练、不适合做高精度科学计算。TF32是NVIDIA Ampere架构引入的格式你可以在CUDA代码里用tf32true之类的方式开启。它的指数位和FP32一样是8位尾数位压缩到10位相当于截断了FP32的精度但保留了动态范围。TF32的主要用处是在TensorCore上做矩阵乘法加速输入数据先用TF32格式存储内部计算时精度略有损失但对深度学习训练和推理的影响通常很小训练收敛曲线几乎不受影响速度却能提升不少。笔试可能会给你一个实际场景让你选格式。我的经验是推理阶段显存很紧张选FP16或INT8量化大模型预训练选BF16混合精度需要用TensorCore加速又没有BF16硬件支持时选TF32拿不准就选FP32虽然慢但不会出错。最后再补一个容易混淆的概念混合精度训练Mixed Precision不是把整个模型都改成FP16而是让权重保持FP32把前向传播和梯度计算放在FP16下进行梯度更新回到FP32。这样既省显存又不损失精度。面试里如果考“混合精度是怎么实现的”你能答出“FP32权重主副本 FP16计算副本 梯度缩放”这三件套就基本满分了。5. 经典笔试题目实战推演从KMP到拉普拉斯算子光讲理论不给实战读者肯定觉得不过瘾。这里我挑几个热搜词里反复出现、笔试也极大概率会碰到的经典题目每一道都按“题目描述 → 思路分析 → 关键步骤 → 易错点”的顺序给你拆一遍你在草稿纸上跟着推效果会好得多。先看KMP那道。题目通常是这样问的对于模式串p“abacaba”求它的next数组。很多人的第一反应是上网搜next数组的定义但不同教材定义有细微差别有的把next[i]定义为“前i个字符的最长相等前后缀长度”有的定义为“失配时应该跳转到的下标”。笔试的题目里如果明确写了“next[i]定义为...”就一定要严格按题目的定义来算。如果题目没写默认按《数据结构C语言版》里的约定next[1]0next[i]表示模式串前i个字符中最大相等前后缀的长度。按这个定义上面已经推过“abacaba”的next数组是[0,0,1,0,1,2,3]。易错点在第6位和第7位第7位很容易算成2因为“aba”的前缀被前面出现过干扰实际上最长相等前后缀是“aba”本身长度应该是3。我在自己推第二遍的时候也犯过这个错所以特别提醒你。另一道高频题是图像锐化的拉普拉斯算子。热搜词“图像锐化的拉普拉斯算法”能上榜说明这题在深度学习方向的笔试里出现得很频繁。它考察的不只是你会不会算子模板而是你能不能把卷积运算的细节写对。拉普拉斯算子的离散形式是L(x,y) f(x1,y) f(x-1,y) f(x,y1) f(x,y-1) - 4f(x,y)。对应到卷积核就是[[0,1,0],[1,-4,1],[0,1,0]]。但这里有个坑图像锐化不是直接用拉普拉斯结果替换原图而是把它加到原图上即g(x,y) f(x,y) - k·∇²f(x,y)如果中心系数是负数那就用减号如果中心系数是正数就用加号k是锐化强度系数。这个“加还是减”的细节十个人里至少有五个人会搞反。你只需要记住一件事拉普拉斯算子是二阶微分在图像边缘处会产生“由负变正”的过零响应锐化的时候让这个响应去增强边缘——中心系数为负时f - ∇²f就等效于中心系数加1的卷积核[[0,-1,0],[-1,5,-1],[0,-1,0]]。写成这种形式笔试如果让你写锐化核你直接答后者比答前者更专业。再点到为止一下“粒子群算法原理”。如果笔试问答题出了这个它想考察的其实是两个点一是你是否知道粒子群算法PSO是一种基于群体智能的随机搜索算法模拟鸟群觅食行为二是你是否能写出粒子速度和位置更新的标准公式。公式是v_i(t1) w·v_i(t) c1·r1·(pbest_i - x_i(t)) c2·r2·(gbest - x_i(t))x_i(t1) x_i(t) v_i(t1)。其中w是惯性权重控制粒子对自身历史速度的继承程度c1和c2是学习因子c1项让粒子朝自己的历史最优位置靠拢个体认知c2项让粒子朝全局最优位置靠拢社会认知r1和r2是[0,1]之间的随机数保证搜索的随机性。笔试如果考概念你只需要答出“每个粒子维护位置和速度、根据个体最优和全局最优更新”这几句就足够了如果考推导就要注意w大时全局搜索能力强、w小时局部搜索能力强这个权衡这也是为什么很多改进PSO算法都是让w随迭代轮数递减。再补一个动态规划的典型例题这类题在编程题里出现概率最高。比如“求最长递增子序列的长度”。用dp[i]表示以第i个元素结尾的最长递增子序列长度初始dp[i]1每个元素自身长度为1的递增子序列。对于每个i遍历所有ji如果nums[j] nums[i]dp[i] max(dp[i], dp[j] 1)。最后答案是所有dp[i]中的最大值。代码很简单但笔试的时候一定要考虑两种边界情况数组长度是0时返回值是0而不是1整个数组严格递减时答案应该是1而不是0。贪心二分可以把复杂度优化到O(n log n)核心是维护一个tails数组让tails[i]表示长度为i1的递增子序列的最小末尾元素。如果笔试时间充裕建议稳定地写出O(n²)版本再花时间补一个O(n log n)版本展示给人看的代码水平完全不同。6. 备考路线图三个月和两周分别怎么打很多同学问我备考时间怎么安排我给出一个通用的阶梯方案如果还有三个月按“打基础 → 刷真题 → 查漏补缺”三个阶段走如果只剩两周直接进入“真题驱动 错题复盘”模式因为两周时间系统的过理论已经来不及了。三个月路线图的第一阶段第1到第6周是打基础深度学习理论以李航《统计学习方法》的感知机、决策树、SVM等经典模型起步再配合花书《深度学习》的CNN、RNN、优化、正则化章节。算法刷题每天至少两题先从LeetCode热题100开始按数组、链表、树、图、DP、贪心的专题顺序刷。第二阶段第7到第10周是真题演练去牛客网搜各家公司的算法岗真题尤其是网易、字节、腾讯这些大厂的每两天掐时间做一套完整的笔试卷子。做完之后把错题整理成错题本重点记录“错因”而不是“答案”。这里有一个很多人忽略的策略编程题一定要在真正的OJ环境里手写完整代码并跑通所有用例千万不要只在IDE里面写个大概就翻篇。第三阶段最后两周是查漏补缺把错题本从头过一遍把所有背过的公式和算子模板在草稿纸上默写一遍重点看模型部署相关的内容浮点数格式、量化、剪枝以及KMP、快排partition这些容易手抖的经典代码。只有两周的同学我的建议是第一周白天做两套完整真题晚上针对错题涉及的知识点看对应的讲义或博客第二周白天做一套真题加一套LeetCode随机题晚上集中默写所有公式卷积参数量、感受野、梯度更新、LSTM门控公式、BN推理公式天天背到条件反射为止。编程题的重点放到数组和DP这两类上图论的题能做出来就做做不出来不要死磕。选择题里的深度学习理论靠临时记忆能补一部分但不要指望两周看完一本统计学习方法性价比太低了。资料方面我实际用下来最推荐的是算法刷题用LeetCode 牛客网真题LeetCode按专题刷牛客网按公司刷深度学习理论看《深度学习》花书第6到9章再加CS231n的课程笔记网上有中文翻译版这两份材料对CNN、反向传播、可视化讲得非常清楚模型部署相关看英伟达官方博客里关于Mixed Precision Training的说明以及TensorFlow和PyTorch的自动混合精度文档把FP32/FP16/BF16/TF32的对比记熟概率和线代不需要单独啃书遇到不会的题目时针对性查效率更高。最后再分享一个实用的应试技巧网易的笔试系统一般是牛客网编程题支持多种语言。选自己最熟的语言不要因为Java或C看起来“更工程”就临时切换。代码提交前一定要自己构造两个用例测试一个是最小规模的用例比如空数组、空字符串另一个是极端规模的用例比如全是相同元素、单个元素这两个用例能过滤掉大部分边界bug。选择题拿不准时先排除明显错误的选项再根据“技术选型常识”做选择——比如某个选项如果声称可以“完全消除过拟合”这个选项100%是错的因为正则化只能缓解过拟合不可能完全消除。从我带过的人和我自己备考的经历来看网易深度学习算法工程师这套笔试真正想筛选的不是“谁背得更多”而是“谁在压力下还能保持逻辑清晰”。深度学习理论考的是你懂不懂原理算法题考的是你写代码顺不顺模型部署的细节考的是你有没有工程经验。这三块都不需要天赋靠的是老老实实的积累和反复练习。把上面这些知识点逐个吃透笔试题再变化你也能摸到解题的门道。