网易2018校招深度学习算法岗笔试复盘与备考指南 网易2018校招的深度学习算法工程师笔试是我秋招时印象最深的一套卷子。题量大、覆盖广从数学基础一路考到工程问题不光是背几个深度学习概念就能应付的。这篇文章我根据自己的回忆和当时面试后的复盘整理成一套可参考的备考笔记希望能帮你理解这类大厂算法岗笔试到底在考什么以及怎么准备更有针对性。当时这套卷子给我最大的挫败感不是题目本身有多难而是我明明复习了很多却仍然在不少基础题上栽了跟头。后来我带过不少实习生也参与过校招笔试出题才逐渐明白这类笔试卷真正想筛选的不是谁背的面试题多而是谁的基本功扎实、谁能从原理层面分析问题、谁能用代码把想法落地。下面我按板块拆开来聊。1. 网易2018校招深度学习算法工程师笔试卷它到底在考什么1.1 笔试在招聘流程里的定位绝大多数互联网公司的校招算法岗都要先过笔试这一关。笔试的目的不是期待你把所有题都做对而是在大量简历里快速筛出“值得进入面试”的人。网易2018校招深度学习算法工程师笔试卷也是这样它更像一次压力测试考生需要在有限时间里展示自己的知识边界、思维速度和代码基本功。我印象里这套卷子不是单纯刷题能解决的它考的很杂。数学、机器学习、深度学习、编程语言、数据结构、算法设计甚至一些工程经验问题都会出现。很多同学喜欢把精力放在“深度学习八股文”上比如背几个经典网络的准确率、背几种注意力机制的定义但笔试里更常见的是给你一个具体场景让你判断某个操作会带来什么影响或者让你手推一个公式这类题背答案是没用的。1.2 试卷模块与分数结构虽然我没有拿到官方评分细则但根据当时考完后的回忆和同行讨论这套卷子大致可以分成四个模块模块考察方向常见题型数学基础概率论、线性代数、最优化选择、填空机器学习与深度学习基础模型原理、损失函数、优化器、网络结构选择、简答编程与数据结构算法代码实现、复杂度分析、经典算法编程题综合设计模型方案设计、问题排查简答、问答四块内容并不是完全独立的。有的选择题会结合概率和深度学习一起考比如给你一个Batch Normalization的公式让你判断在训练和推理阶段分别使用哪个统计量有的编程题看起来是写IoU计算实际上还要考虑浮点数精度和边界条件。这种交叉出题方式恰恰是校招笔试和平时课程考试最大的区别。1.3 考察的能力模型我个人把这类笔试卷考察的能力总结成三层底层是数学和编程基本功中间层是深度学习模型的理解能力最上层是工程化的思维方式。底层基本功决定了你能不能读懂题目。比如看到“梯度下降中的学习率”你需要知道偏导数、链式法则、学习率与收敛性的关系如果这些概念模糊很多题会无从下手。中间层是你能不能准确描述一个模型为什么有效、它的参数怎么更新、它的损失函数怎么设计。最上层的工程思维则是看你能不能把理论落地到真实场景里比如数据不均衡怎么办、训练loss不下降怎么排查、模型部署时怎么压缩参数量。网易这套卷子在我印象里对这三层都有覆盖而且越到后面的简答和设计题越看重上层思维。2. 核心考点解析深度学习基础与算法原理2.1 反向传播与梯度消失反向传播几乎是所有深度学习算法岗笔试绕不开的点。网易2018这套卷子里直接或间接考反向传播的题目不少。比如给你一个两层的全连接网络让你写出某一层的梯度公式或者让你解释为什么深层网络会出现梯度消失。这里需要说清楚的是反向传播的核心是链式法则。假设网络输出是损失函数L某个权重是W我们要算的是dL/dW。因为L并不直接依赖于W而是通过一系列中间变量传递过去的所以需要用链式法则一步步往前传。笔试时经常让考生手推一个简单的计算图这就是在检查你对链式法则的理解是否到位。梯度消失和梯度爆炸也是高频考点。sigmoid函数在输入绝对值较大时导数趋近于0多层叠加之后梯度会指数级衰减导致浅层参数几乎无法更新。这就是梯度消失。ReLU在正区间导数恒为1能有效缓解这个问题但它的负区间会直接“杀死”神经元所以后来又有了Leaky ReLU、ELU这些变体。笔试里经常给你一个激活函数让你判断它会不会导致梯度消失或者让你比较ReLU和sigmoid在深层网络中的表现。2.2 卷积神经网络与参数计算CNN相关的题目在2018年那会儿几乎是必考。网易的卷子里我记得有一道题是给一个输入尺寸、卷积核大小、步长和padding让你算输出特征图尺寸和参数量。这类题只要你记住公式其实不难但很多人会在padding和stride的细节上出错。输出尺寸公式是output_size (input_size - kernel_size 2 * padding) / stride 1需要注意这个公式在stride大于1时能不能整除如果不能整除不同的框架处理方式不一样比如TensorFlow的SAME和VALID模式下结果就不同。笔试如果没特别说明一般默认向下取整。参数量则要算上卷积核本身的权重和偏置一个卷积层的参数量是 kernel_size * kernel_size * in_channels * out_channels out_channels。除了尺寸计算感受野也是高频考点。感受野指的是输出特征图上一个像素对应输入图像上的区域大小。计算感受野时要从最后一层往前推公式是RF (RF - 1) * stride kernel_size很多同学容易把感受野和有效感受野搞混。有效感受野指的是实际影响某个输出点的输入区域它并不等于理论感受野因为高斯分布的权重会让边缘贡献很小。这类题如果能在笔试里说出来面试官会觉得你理解得比较深。2.3 损失函数与评价指标损失函数是深度学习模型训练的目标笔试里经常给你几个损失函数让你说说区别。L1 loss和L2 loss是最基础的L2 loss对离群点更敏感因为误差被平方了L1 loss对离群点更鲁棒但在零点不可导。后来常见的还有Smooth L1 loss它结合了两者的优点在目标检测里用得很多。分类任务里交叉熵损失几乎是必考的。softmax 交叉熵的公式要能熟练写出来。交叉熵的公式是Loss -sum(y_i * log(p_i))其中p_i是模型预测的概率y_i是真实标签的one-hot向量。有一点笔试常考为什么分类任务用交叉熵而不是均方误差因为交叉熵配合softmax在梯度更新上更稳定MSE在softmax输出上容易导致梯度饱和训练速度更慢。评价指标也需要掌握。准确率、精确率、召回率、F1、AUC、IOU都是常客。网易这套卷子里我记得有一道选择题给了混淆矩阵让你算精确率和召回率。这类题不难但需要仔细不要混淆分母。后来考目标检测的话还会考mAP的计算逻辑包括IoU阈值、PR曲线、AP的计算方式。2.4 优化器与学习率策略深度学习笔试里优化器也是重点。SGD、Momentum、RMSProp、Adam这几个最常见的优化器至少要能说清楚它们的更新公式和区别。SGD每次用当前梯度直接更新简单但容易震荡Momentum在SGD基础上加了动量项可以加速收敛并抑制震荡RMSProp对每个参数自适应调整学习率Adam则是Momentum和RMSProp的结合体还加了偏差修正。面试和笔试里经常问的是Adam真的总是比SGD好吗不是的。Adam收敛快但有时候泛化性能不如SGD尤其是在图像分类任务中很多实验表明SGDMomentum配合合适的学习率调度最终精度会比Adam高。这个问题在2018年就有人讨论到现在也没有定论但笔试里至少你得知道两者各有优劣。学习率策略也是一个容易忽略的考点。固定学习率、Step Decay、Cosine Annealing、Warm-up这些策略会影响模型最终效果。笔试里不会让你写完整代码但可能会问你为什么需要Warm-up因为训练初期参数离最优点很远梯度变化剧烈如果一开始就用大学习率容易让模型不稳定先用小学习率“预热”可以让参数分布稳定下来再逐渐加大学习率后面训练会更顺。3. 典型真题回忆与解题思路3.1 选择题里的易混淆概念网易2018这套笔试卷的选择题并不比简答题简单多少因为它会在选项里放很多看似正确但实际错误的描述。我记得有一道题是问“关于L1和L2正则化下列说法正确的是”。L2正则化会让权重趋向于均匀地变小而L1正则化会让一部分权重变成0因此L1有特征选择的作用。选项里很容易出现“L1会让所有权重趋于0”这种错误说法如果你没理解“稀疏”和“缩小”的区别很容易选错。还有一道题是问“下列关于Dropout的说法错误的是”。Dropout在训练时会随机丢弃一部分神经元测试时通常不使用Dropout但需要把权重乘上保留概率或者使用Inverted Dropout让训练和测试时的数据尺度保持一致。很多同学只记得Dropout能防止过拟合却忽略了训练和测试阶段的差异看到“测试时也要随机丢弃”就觉得好像对实际上这是错的。做这类题我的经验是先读完全部选项再回题目里找关键词比如“一定”、“总是”、“必须”这些绝对化表述通常是错误选项。但也不能完全靠这个技巧还是要靠理解。平时复习时可以针对每个知识点列一个“易错对比表”比如L1 vs L2、Dropout vs BatchNorm、最大池化 vs 平均池化这样考试时反应会快很多。3.2 简答题的踩分点简答题是笔试里最容易拉开差距的部分。网易这套卷子里的简答题我记得有一道是“请解释Batch Normalization的原理以及它在训练和测试时有什么区别”。这道题看起来常规但想拿高分不容易。一个合格的回答至少要包含三块内容。第一BN的基本操作是对每个batch内的数据在通道维度上计算均值和方差然后归一化再通过可学习的scale和shift进行变换。第二为什么要做归一化因为神经网络每层输入分布会随前一层参数更新而变化这就是Internal Covariate Shift。BN可以让每层输入分布保持稳定从而允许使用更大的学习率降低对参数初始化的敏感度。第三训练时用的是当前batch的均值和方差测试时用的则是训练期间累积的全局均值和方法。很多同学答到前两点就停了忘了说训练和测试的差异。这恰恰是笔试的重要踩分点。如果你想再突出一点可以补充说BN在网络结构中的位置一般放在卷积层之后、激活函数之前并且在batch size很小时效果会变差因为统计量估计不准。这样面试官会觉得你真的用过BN而不是只背过论文。3.3 编程题与数据结构的结合算法岗位的编程题通常不会单独考深度学习框架而是考你数据结构、算法设计和代码实现能力。网易2018的笔试编程题里既有一些经典算法题也有和深度学习相关的计算题。我还记得比较清楚的一道题是让你实现一个函数计算两个矩形框的IoU。这道题听起来简单但边界条件很多。两个矩形可能不相交可能完全包含也可能只相交一个小角。你需要先判断相交区域是否有正面积如果不相交直接返回0。然后计算相交区域的左上角和右下角坐标用max和min取交集再算面积。除以并集面积时要注意分母不能为0。我当时就是没有考虑两个框完全不相交时除了0的问题提交后才发现自己漏了重要分支。除了IoU还有可能考手写softmax、交叉熵、K-means、NMS这些算法。所以在刷题时不能只刷LeetCode经典题还要刷一些深度学习里常用的函数实现。最好能做到不依赖任何框架直接用Python写一个能跑通的小函数。这些代码通常不长但很能反映你的工程功底。4. 实战复盘我在刷这套笔试卷时踩过的坑4.1 基础不牢表现力不足我第一次做这套笔试卷时最大的问题就是基础不牢。当时我花了很多时间看最新的模型论文对ResNet、DenseNet这些结构如数家珍但真到笔试时遇到一个简单的矩阵求导我却推不出来。那道题考的是用链式法则求一个简单全连接网络的梯度我卡了十几分钟最后只能瞎写一个结果。复盘之后我才意识到深度学习算法工程师笔试首先考的是基础。你看懂论文里的网络结构不代表你就能推导网络学习的数学过程。基础不牢表现力就不足。所谓表现力就是你能不能用公式、图表或者简单的语言把一个模型为什么有效讲清楚。后来我在复习时逼着自己把每个经典模型的损失函数、梯度推导、参数更新过程都手推一遍效果比光看论文好得多。4.2 手推公式不熟练手推公式是笔试里绕不开的坎我在这方面也吃过亏。当时遇到一道题要求推导softmax损失对输入logits的梯度我因为有段时间没推了直接在中间环节漏掉了一个求和项导致后面全错。这个推导其实是很好记的对softmax求导数时分两种情况当i等于j时导数是p_i * (1 - p_i)当i不等于j时导数是 -p_i * p_j。所以最终对logits z_i的梯度是 p_i - y_i形式非常简洁。如果你对这类推导不熟建议考前亲自从零推一遍而不是只看别人的推导笔记。推的时候要注意区分求导对象是logits还是隐藏层向量这决定了要不要继续用链式法则往后传。手推公式不熟练的另一个表现是速度慢。笔试时间很紧一道推导向量题如果超过十分钟还没思路就要果断先跳过做后面的题。4.3 忽略了工程细节深度学习笔试里有很多工程细节不是纯理论能覆盖的。网易这套卷子让我印象最深的一道题是问你在训练一个分类模型时训练loss一直在下降但验证loss不降反升可能是什么原因。我当时只答了过拟合但实际上还可能有很多其他原因比如学习率过大、数据增强策略太强、训练集和验证集分布不一致、Dropout在验证时没有关闭等等。这类题目考察的是工程排查能力。你需要有个系统性的排查思路先看训练集和验证集的loss曲线是否存在巨大gap若有则是过拟合问题若两个都在震荡则可能是学习率问题或数据问题若训练正常但验证异常则要检查验证集数据是否干净。笔试里能答出两三点就够但能答出四点甚至更多会让面试官对你的工程经验刮目相看。4.4 时间分配失误我当年做这套卷子时最大的失误是在选择题上花时间太久导致后面编程题时间不够。有的选择题选项设置得很刁钻你越想越纠结最后即便做对了也浪费了大量时间。正确的时间分配策略是先把所有题目扫一遍优先做自己有把握的题把困难题留到最后。编程题也是不要一上来就追求最优解。先把暴力解写出来保证能通过小数据测试然后再优化。笔试系统通常会按通过的测试点给分拿到部分分也比空着好。如果你在某个简答题上花的时间超过15分钟说明你的知识储备还不够临时想很难想出来不如先放弃去做更值钱的编程题。5. 针对后续校招的准备建议5.1 知识体系速建路线如果你想系统的准备大厂算法岗笔试我建议不要只盯着一家公司的真题而是以网易2018这套笔试卷为样本把考察过的知识点向外辐射建立自己的知识体系。第一步数学基础必须过关线性代数里的矩阵乘法、特征值、向量的范数概率论里的条件概率、贝叶斯公式、常见分布最优化方法里的梯度下降、牛顿法这些都要能熟练运用。第二步深度学习基础要系统化。我建议按“网络结构-损失函数-优化算法-训练技巧”这条线去复习。网络结构要理解CNN、RNN、LSTM、GAN的基础原理不需要把每个变体都记下来但至少要知道它们解决什么问题、有什么限制。优化算法要能写出SGD、Momentum、Adam的更新公式并理解它们的优缺点。训练技巧包括正则化、Dropout、BatchNorm、学习率调整这些内容笔试和面试都很爱考。第三步编程刷题不能停。每天至少刷两到三道数据结构与算法题重点看数组、链表、二叉树、动态规划、栈和队列。此外还要专门刷一些机器学习与深度学习相关的代码题比如手写K-means、softmax交叉熵代码、IoU计算、NMS算法、BN的训练和推理实现等。这类题目更贴近算法岗的实际工作。5.2 刷题与模拟策略刷题不是越多越好关键在于总结。我建议建立错题本把每一道错题的核心知识点记录下来过一周再重新做一遍。对于深度学习笔试错题本尤其重要因为很多概念容易混淆比如精确率和召回率、L1和L2正则化、BN和LN、最大值池化和全局平均池化。这些对比关系光看笔记印象不深做过一次错题之后就会记得很牢。模拟笔试也很重要。你可以在网上找一些大厂真题或者模拟题严格按考试时间来做。这个过程能帮你训练时间分配能力也能让你提前感受考试压力。我当年没有做模拟结果在真实笔试里因为太紧张连两道很有把握的题都做错了。后来在备战其他公司时我每周至少做一次完整的模拟笔试心态明显稳了很多。编程题练习时要给自己设定一些硬性约束。比如每道题15分钟内没有思路就看题解但看完题解必须自己重新写一遍并跑通测试用例。不要只是看别人的AC代码那样过两天就忘了。另外代码风格也要注意缩进、变量命名、注释这些在笔试卷子上很难体现但如果你是现场编程或视频面试就显得非常重要。5.3 心态与细节管理考试心态是一个容易被忽略但影响很大的因素。网易2018那场笔试我因为一道选择题纠结太久后面整个节奏都乱了。后来我总结出一个方法考试刚开始时先花两分钟把所有题目浏览一遍标记出“会做”、“有点思路”、“完全不会”三类题然后按“会做-有点思路-完全不会”的顺序答题。这个方法听起来简单但它能让你从被动慌乱变成主动掌控节奏。细节管理方面有几个点要提醒大家。第一编程题一定要先看数据范围再决定用什么算法。如果数据量小暴力解也能过如果数据量大就要考虑时间复杂度和空间复杂度。第二写代码时注意边界条件比如数组为空、两个框不相交、除数为0这些情况虽然没有难度但很丢分。第三简答题尽量分点作答逻辑清晰让阅卷人能快速看到你的踩分点。6. 最后的一些个人体会这套网易2018校招深度学习算法工程师笔试卷虽然已经过去几年了但我现在回看它考察的东西其实一直没有过时。数学基础、编程能力、模型理解、工程直觉这四样东西是任何一个深度学习算法工程师都需要长期打磨的。我印象最深的一点是这套卷子让我认识到光会调参是不够的你必须理解模型为什么有效、损失函数怎么设计、梯度怎么流动。哪怕你只是做应用不搞研究这些基础也能帮你在遇到问题时快速定位。我现在带新人的时候也会给他们做类似的笔试题目的不是刁难人而是看看在压力下他们的思维能不能保持清晰。如果你正在准备校招不要只盯着题海战术。笔试只是第一关它能帮你查漏补缺但真正让你拿到offer的是你对深度学习这个领域的理解和解决实际问题的能力。希望这篇复盘能给你一点启发也祝你在后面的校招里发挥顺利。