ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

2018网易深度学习算法工程师笔试题解析与备考指南

2018网易深度学习算法工程师笔试题解析与备考指南 2018年网易校园招聘深度学习算法工程师笔试卷虽然公开的官方答案不多但这套题的出题范围在牛客网和不少考研论坛里被翻来覆去讨论了好多年。我是2018年应届参加的算法岗笔试后来也帮团队做过校招卷评审说实话现在每年有师弟师妹问我“算法岗笔试到底怎么准备”我都会建议他们先找一套当年的真题做一遍不是为了押题而是为了搞明白大厂算法岗的笔试门槛到底划在哪里。这篇内容我就以这份试卷为线索把深度学习算法工程师笔试里最容易考、也最容易丢分的知识点完整过一遍包括卷面结构、核心考点、手撕代码的套路、备考路线和常见坑。如果你正处在准备校招的阶段或者想从开发岗转算法岗这篇内容应该能帮你建立一张比较清晰的复习地图。1. 这份笔试在考什么从2018网易卷看算法岗的能力模型1.1 典型题量与科目分布2018年前后的大厂算法岗笔试基本都在牛客网这类在线平台完成时长一般是90到120分钟。网易的深度学习算法工程师卷我记得题量不小做完还要留出时间检查压力主要集中在中间段。我当时遇到的卷面结构大概是这样的题型常见题量主要科目考察目的单选题15-20题机器学习、深度学习、数学基础概念理解和基础计算多选题5-10题知识覆盖面很广边界条件和易混淆概念的辨析填空/简答2-4题公式推导、网络结构计算对原理的真正理解编程题2-4题数据结构、动态规划、字符串代码实现能力方案/问答0-2题模型设计、训练调参经验工程思维和综合能力要注意网易这类公司的笔试经常是“一套基础卷 方向加试题”的组合。基础卷所有算法岗共用加试题才会区分你是做推荐、NLP、CV还是语音。我印象很深的一点是2018年那会儿深度学习正热很多人以为算法岗笔试就是考“哪个框架的API怎么用”结果一看卷子懵了。真正占大头的反而是数学、数据结构和算法基础。所以如果你现在问我“框架要不要刷”我的回答是框架只要会用就行笔试根本不考API记忆它考的是你扔掉框架之后还剩多少真功夫。1.2 出题逻辑算法工程师不等于调包侠看完整张卷子我最大的感受是出题人想筛选的并不是“会用TensorFlow的人”而是具备三块底层能力的人。第一块是数学功底。概率论、线性代数、最优化是重灾区。比如给定一个正态分布让你算最大似然估计或者给一个二分类问题让你写交叉熵的公式然后求梯度。这些东西当时觉得是“书本知识”工作后才发现调参、设计损失函数、定位NaN来源全都要靠它们。第二块是编程基本功。这里不看你Python写得多溜而是看你能不能在没有IDE提示的情况下把一个中等难度的算法题从头写到尾。网易这种笔试的代码题通常不会出那种偏题怪题但会出“看似简单、边界条件特别多”的题专门用来淘汰平时只刷easy题的同学。第三块是深度学习原理。这一块不是让背概念而是让你解释“为什么”。比如为什么ReLU能缓解梯度消失为什么LSTM能记住长期信息为什么BatchNorm要区分训练和推理阶段。这些问题如果只看过不思考考场上一问就露馅。1.3 岗位方向决定差异算法岗并不只有深度学习还有一点容易被忽略。网易的算法工程师岗位分得很细推荐算法、NLP算法、CV算法、语音算法各有各的侧重。深度学习算法工程师听起来很“万金油”但卷子里的加试题往往会暴露方向。比如做CV方向图像处理基础、卷积网络结构、目标检测相关概念会多一些做推荐方向特征工程、CTR预估、Embedding相关就会冒出来做语音方向音频信号处理、采样率转换这类内容也可能出现。我当年认识一个同学主攻搜索推荐结果卷子加了语义匹配的题他没答好最后虽然进面了排序也受了影响。所以准备笔试之前建议先想清楚自己投的是哪个细分方向别眉毛胡子一把抓。深度学习的东西要会但方向上一定要有自己的侧重点。2. 深度学习核心考点从梯度推导到网络结构2.1 反向传播为什么每次都从softmax交叉熵开始考在网易这份卷子里softmax和交叉熵基本是必考的而且多半以推导题或填空题形式出现。我当时看到题目第一反应是“这还不简单”但真要把梯度推导写清楚不少人会卡在分子分母求导那一步。假设分类问题的真实标签是one-hot向量y模型输出logits是zsoftmax把z变成概率pp_i exp(z_i) / Σ_j exp(z_j)交叉熵损失是L -Σ_i y_i log p_i求∂L/∂z_i最后能得到一个非常干净的结果∂L/∂z_i p_i - y_i也就是说交叉熵和softmax组合在一起梯度恰好等于“预测概率减真实标签”。这个形式这么漂亮所以考试爱考面试也爱考。更重要的是工程上如果你自己写损失函数把softmax和交叉熵分开算很容易在数值上出问题——概率接近0时log趋近负无穷梯度就不稳了。我当时复习的时候把sigmoid、tanh、ReLU各自的导数都手推了一遍。sigmoid的导数是σ(1-σ)ReLU在0点不可导但工程上默认导数为0。这些看似琐碎却几乎是所有“梯度消失”问题的讨论起点。2.2 CNN必考公式与池化细节CNN相关考点在深度学习岗笔试里占据绝对C位尤其是特征图尺寸计算和感受野计算。这类题不是单纯考记忆公式而是看你有没有真正理解卷积的滑动过程。输出尺寸公式是out (in - kernel 2 × pad) / stride 1举个例子输入是32×32的单通道图像用3×3卷积核pad1stride2那么输出就是(32 - 3 2×1) / 2 1 16如果题目给出的是多通道输入还要注意卷积核的通道数必须和输入通道数一致。感受野这个点更容易丢分。很多人只记了一个粗略“越深感受野越大”但笔试会考具体数值。从第l层往回推感受野的计算方式为r_out r_in (kernel - 1) × stride积累所以如果你在代码里连续用了几层小卷积核感受野是怎么一点点扩大的最好能自己从头算一遍别只在脑子里有模糊概念。池化也是一个高频点尤其是“池化的反向传播”。最大池化的反向传播不是平均分配梯度而是把梯度原封不动地回传到前向时最大值所在的位置其他位置梯度为0。平均池化则是把梯度平均分给窗口内每个位置。这个知识点在选择题里出现过很多次但你光看书不去手写一次代码很容易记反。还有一个经常考的细节是卷积层的参数量计算。对于一个输入通道数为cin、输出通道数为cout、卷积核大小为k×k、带偏置的卷积层参数总量是cout × (cin × k × k 1)我有一年帮团队筛简历发现很多候选人简历写着“熟悉CNN”但一道“3×3卷积、64个输出通道、输入是256通道特征图算一下这个卷积层参数量”的选择题正确率只有一半。这个问题不难难的是你平时有没有想过。2.3 RNN/LSTM梯度消失的另一面RNN和LSTM在2018年的卷子里基本是必考毕竟那是序列建模最火的时候。RNN的核心问题在于梯度消失由于反向传播时梯度要沿着时间步连乘如果权重矩阵的特征值小于1长时间跨度的梯度会指数级衰减模型记不住太久之前的信息。LSTM之所以能缓解这个问题关键在于它有一条“细胞状态”C_t的传送带。遗忘门决定上一时刻状态保留多少输入门决定新信息写入多少它们配合起来让梯度可以沿着C_t的路径更直接地流动避免每一步都经过非线性压缩。LSTM门控的公式肯定是要掌握的f_t σ(W_f · [h_{t-1}, x_t] b_f) i_t σ(W_i · [h_{t-1}, x_t] b_i) o_t σ(W_o · [h_{t-1}, x_t] b_o) C̃_t tanh(W_C · [h_{t-1}, x_t] b_C) C_t f_t ⊙ C_{t-1} i_t ⊙ C̃_t h_t o_t ⊙ tanh(C_t)笔试时不用默写全套公式但至少要知道每个门的作用以及为什么sigmoid和tanh各司其职。sigmoid输出在0到1之间适合做门控tanh输出在-1到1之间适合构造候选值。这个设计不是拍脑袋是数学性质决定的。2.4 损失函数、正则化与优化器选型损失函数这块分类任务交叉熵回归任务MSE这是常识。但笔试往往考察细节比如为什么回归问题用MSE加sigmoid会导致梯度消失。因为sigmoid在两端饱和MSE对sigmoid输出求导时会把σ(z)也乘进去z很大或很小时梯度接近0网络学不动。交叉熵和softmax组合则能避开这个问题。正则化方面L1和L2的区别是送分题但很多人只知道“L1稀疏、L2平滑”不知道背后原因是L1在0点不可导优化时更容易把权重压到0。Dropout的考点通常是训练和推理阶段的行为差异训练时随机丢弃并做inverted scaling推理时保留全部神经元且权重乘以1。优化器选型也是个高频选择。SGD稳定但收敛慢Momentum引入惯性Adagrad对低频参数做更大更新RMSProp缓解Adagrad学习率单调下降的问题Adam结合了Momentum和RMSProp。如果考到Adam的偏置校正你要明白这是为了修正训练初期一阶矩和二阶矩估计偏差较大的问题。另外2018年的卷子开始出现变分推断相关的选择题比如KL散度和ELBO。KL散度的公式KL(p||q) Σ p(x) log(p(x)/q(x))它不具备对称性KL(p||q)不等于KL(q||p)这也是为什么有些算法会强调“反向KL”和“前向KL”的差异。ELBO则是变分推断的核心不等式log p(x) ≥ E_{q(z|x)}[log p(x,z) - log q(z|x)]这个公式是VAE的基础笔试出现频率可能不高但如果你投的岗位和生成模型沾边最好能写出来并解释“为什么是下界”。3. 机器学习与通用算法考点笔试里的“基础盘”3.1 经典机器学习与启发式算法深度学习岗位的卷子里经典机器学习内容并不会消失反而往往占选择题的一半。决策树、SVM、朴素贝叶斯、随机森林、GBDT这些基础算法每一样都不能有明显的知识盲区。我当时复习时用了一个很笨但有效的方法把每个算法用三句话总结清楚。比如SVM就是“在特征空间找一个最大间隔超平面用核函数处理非线性用对偶问题求解”GBDT就是“每一棵树拟合前面所有树的负梯度”。能用自己的话讲清楚做题才不容易被选项绕进去。启发式算法也是一类容易被忽略的考点。粒子群算法PSO和模拟退火SA偶尔会以选择题或填空题形式出现因为它们代表了一类“没有解析解时怎么办”的工程思维。PSO的核心是速度更新公式v w×v c1×r1×(pbest - x) c2×r2×(gbest - x)其中w是惯性权重c1是自我认知系数c2是社会认知系数pbest是个体历史最优gbest是全局最优。理解这个公式的关键是粒子有三个趋势保持原有运动方向、飞向自己见过的最好位置、飞向群体见过的最好位置。模拟退火的接受概率是P exp(-ΔE/T)温度T高时接受较差解的概率大有助于跳出局部最优温度逐渐降低算法趋于稳定收敛。这个“以一定概率接受坏解”的思想在很多工程优化题里都是考点。3.2 数据结构与算法KMP、排序、贪心、动态规划编程题是算法岗笔试的重头戏。网易2018年的卷子据我回忆编程题覆盖了字符串、链表、动态规划这几个大类。字符串题里KMP算法出现的频率一直不低因为它既能考代码量又能考对“前缀函数”的理解。这里用一个经典例子来演示KMP的next数组计算。给定模式串p abacaba我们通常求的是前缀函数π[i]表示p[0..i]的最长相等真前后缀长度。i子串前缀函数π[i]0a01ab02aba13abac04abaca15abacab26abacaba3我的计算方式是把模式串逐位扩展每加一个字符就看看能不能接在上一个前后缀后面。比如到i6时子串是abacaba最长相等前后缀是aba所以π[6]3。需要特别提醒的是不同教材对next数组的定义略有差异。有的next[i]表示“第i位失配时应该跳转的位置”存在整体右移和初值-1的变体。做笔试时一定要先看清题目给出的定义别把前缀函数和失配跳转数组直接画等号这是KMP题最容易丢分的地方。排序算法的稳定性也是高频题。我整理一个速查表排序算法平均时间复杂度最坏时间复杂度是否稳定冒泡排序O(n²)O(n²)稳定插入排序O(n²)O(n²)稳定归并排序O(n log n)O(n log n)稳定快速排序O(n log n)O(n²)不稳定堆排序O(n log n)O(n log n)不稳定选择排序O(n²)O(n²)不稳定冒泡排序虽然效率低但它的优化版本一趟遍历无交换就提前结束经常被用来考“什么时候复杂度能降下来”这类细节。贪心和动态规划的区别也是必问点。贪心每一步选当前最优不保证全局最优动态规划通过状态转移枚举所有可能保证全局最优代价是更高的空间和时间复杂度。笔试中常见题型包括最大子数组和、最长上升子序列、0-1背包、区间调度这些题型建议提前背熟状态转移方程并且能手写出来。3.3 信号与图像处理基础很多同学看到“深度学习算法工程师”就以为不用管图像处理或信号处理但2018年的卷子告诉我图像处理基础概念是会考的而且一旦考到区分度很大。图像锐化的拉普拉斯算子是典型考点。拉普拉斯是二阶微分算子离散形式大致是∇²f f(x1, y) f(x-1, y) f(x, y1) f(x, y-1) - 4f(x, y)锐化操作通常是原图加上拉普拉斯结果的加权g(x, y) f(x, y) c × ∇²f(x, y)这里c通常取1。理解它为什么能锐化是因为二阶微分在图像边缘处响应最强叠加之后边缘对比度被加强图像看起来更清晰。信号处理方面音频重采样算法也是常客。重采样就是从一种采样率转换到另一种采样率最简单的最近邻插值会产生明显音质损失线性插值质量一般高质量的会用到sinc插值或polyphase滤波器。在语音算法岗的加试题里这类题会考得细一些但通用卷里最多考你对“重采样会引入失真”这个概念有没有认知。4. 手撕代码与现场推导怎样在有限时间里拿稳分4.1 手写卷积与池化的训练直觉笔试的编程题一般不要求手写深度学习网络但如果你投的是深度学习岗位有一些公司会在问答题环节要求你描述或写出某个网络模块的实现思路。我建议提前准备一个“池化的前向和反向”代码模板因为代码量小却能展示你是否真的理解操作背后的梯度逻辑。比如最大池化的前向实现可以写得很简洁import numpy as np def max_pool_forward(x, pool_size, stride): n, c, h, w x.shape oh (h - pool_size) // stride 1 ow (w - pool_size) // stride 1 out np.zeros((n, c, oh, ow)) for i in range(oh): for j in range(ow): window x[:, :, i*stride:i*stridepool_size, j*stride:j*stridepool_size] out[:, :, i, j] window.max(axis(2, 3)) return out但代码本身不是重点重点是如果面试官问“反向传播怎么写”你要立刻说出前向时要记录每个窗口最大值的位置反向时只把梯度填回这些位置其余位置置零。卷积前向的核心是im2col思想把每个卷积窗口拉成一行所有窗口拼成一个大矩阵然后和权重矩阵做一次矩阵乘法。这个思路笔试很少让你写完整实现但理解它对理解“为什么GPU适合做卷积”非常有帮助。4.2 算法题现场的四个习惯2024年看2018年的老经验有些东西依然适用。我把自己刷题和做笔试题时的习惯整理成四条每条都是踩过坑之后才总结出来的。第一先确定输入规模再选算法。看到数据范围n≤10⁵你就要意识到O(n²)会超时基本可以排除暴力解法。y当年我就吃过亏第一道编程题看起来简单直接写了双重循环案例过了但提交后大规模数据超时白白丢分。第二先想brute force再想优化。不要一开始就憋最优解先把最朴素的解法想清楚哪怕不写也能帮你理解问题的结构。大多数动态规划题暴力递归版本能写出来加个memo就是记忆化搜索再加个状态压缩往往就是标准DP。第三主动构造边界用例。提交前花30秒想一想数组为空怎么办只有一个元素怎么办数值全是负数怎么办很多看似正确的代码就是在这种极端输入上翻车的。第四用一个小例子把代码流程走一遍。写完别急着交拿题目给的示例输入在纸上或心里模拟一遍看看中间变量是否符合预期。这一步能拦住一半以上的粗心Bug。4.3 浮点格式FP32、FP16、BF16、TF32这个隐藏考点2018年的时候混合精度训练还没有现在这么普及但近几年一旦面试聊到模型部署和训练加速浮点数格式就成了绕不开的点。笔试卷面上这类题出现频率也越来越高原因是它能把“懂原理”和“只会调库”的人区分开。类型指数位尾数位典型特点FP328位23位训练默认精度范围大FP165位10位范围小最大值约65504容易溢出BF168位7位范围与FP32一致精度低TF328位10位常用于GPU Tensor Core加速精度介于FP16和FP32之间我用一个场景说明为什么这是考点。假设你用FP16训练一个Transformer前向计算时loss突然变成NaN最常见原因不是代码写错而是中间结果超出了FP16的表示范围。此时怎么办通常的做法是开混合精度训练让前向和反向在FP16下计算但梯度用FP32保存并且使用loss scaling把loss乘一个较大系数防止梯度过小被“下溢”成0。这个知识点对笔试和面试都很有价值因为它同时考察数值计算基础、深度学习训练机制和工程经验。哪怕2018年那张卷子没有直接考我也建议你把它列入复习清单因为它在后续面试里出现概率极高。5. 备战路线与资源清单一个月怎么安排5.1 四周计划如果距离笔试还有一个月一份可执行的复习计划比任何“三天速成”都靠谱。我建议按四周切分每周聚焦一个主题。第一周用来补数学和机器学习基础。线性代数重点看矩阵求导、特征值概率论重点看最大似然估计、贝叶斯公式、常见分布机器学习过一遍经典模型能做到“看到概念立刻说出它的核心思想”即可。第二周集中攻深度学习。把反向传播、CNN、RNN/LSTM、损失函数、正则化、优化器这个个部分逐个攻破。每个部分都动手推一遍公式不要只看书。第三周转向刷题。LeetCode上的hot 100题加上牛客网往年的名企笔试题每天固定写3到5道重点练习输入输出处理和边界用例。如果时间紧优先刷字符串、链表、动态规划和贪心这几个高频题型。第四周做模拟考。找一套往年真题严格按考试时长和在线做题方式模拟一遍。注意这里一定要用真实的在线笔试平台去练因为很多同学在本地IDE写代码没问题一进牛客的环境就不知道怎么处理多行输入了。5.2 书单与课程书籍方面最经典的组合是《深度学习》花书加《统计学习方法》。花书适合建立深度学习理论体系但读起来偏难建议配合课程一起看。统计学习方法则更适合短时间突击机器学习基础。课程方面吴恩达的深度学习专项和李宏毅的机器学习公开课是最稳妥的选择。中文内容如果看视频更习惯也可以找一些从零开始的系列教程现在B站和知乎上有很多比如宋立恒深度学习从零开始这类课程优点是节奏相对友好适合第一遍建立概念。刷题平台我推荐LeetCode加牛客网。LeetCode用来练代码思路牛客网用来练在线笔试的手感。两者都要用因为各平台的输入输出风格不太一样等到笔试那天再适应就晚了。5.3 在线笔试系统与本地环境在线笔试最常见的问题不是算法不会而是输出去格式错误。2018年的笔试平台没有本地IDE那么宽容你必须自己处理标准输入输出。比如题目要求读一个整数n然后读n行数据你就得写一个读取循环不能像在IDE里那样直接定义变量。我给自己定了一个规矩每次刷牛客题都使用平台的在线编辑器写完整代码包括main函数或输入读取部分而不是只把核心函数写在本地。养成这个习惯之后笔试当天的紧张感会小很多。另外笔试前一定要确认本地环境可用。如果你习惯用PyTorch或TensorFlow做实验记得提前把CUDA、cuDNN和Python虚拟环境配好。虽然笔试一般用不到GPU但万一面完还有一个现场编程环节环境会直接决定你的心态。还有一点是摄像头和浏览器问题。部分公司的在线笔试有监考要求会检测切屏行为。我的建议是考试前把无关网页全部关掉只留一个草稿纸和笔别挑战平台规则这既是对自己负责也是最基本的职业素养。6. 高频易错点与实战提醒6.1 易错点速查表我把历年带过的校招生和自己在刷题时最容易错的点整理成了一个速查表笔试前一天可以拿出来过一遍。考点常见错误正确理解CNN输出尺寸忘记考虑pad或stride0严格套公式先算整除关系池化反向传播把梯度平均分配max池化只回传最大值位置softmax稳定性直接算exp出现Inf先减去最大值再算expKMP next数组不同教材定义混淆看清楚题目给的定义排序稳定性以为快排稳定交换排序本质不稳定FP16训练loss变成NaN不知道原因检查是否超出范围用混合精度BatchNorm训练和推理用同一种统计量训练用batch统计量推理用全局统计量LSTM以为是单向线性传递门控机制加上细胞状态线性流动KL散度以为是对称度量KL(p贪心 vs DP贪心用在背包问题上0-1背包必须用DP6.2 我踩过的坑与复盘方法说几个我当年笔试时真实经历过的坑。第一个坑是选择题做得太心急。2018年那套卷子前面的选择题里有一道关于感受野的题我平时会算但当时觉得题目太熟扫了一眼就选了错误答案丢了分。后来我养成了一个习惯凡是涉及数值计算的选择题哪怕答案再明显也要在草稿纸上认真算一遍。第二个坑是编程题的输入处理。第一道编程题我思路很顺但写完之后没注意题目要求的是“多组输入”我只读了一组就结束了。这件事对我影响很大从那以后我刷题特别关注题目里的“多组数据”“直到EOF”这类表述。第三个坑是时间分配。当时我在一道较难的填空题上纠结了太久导致后面编程题差点没写完。后来我给自己定了一个原则笔试题每道题的停留时间上限是15分钟超过就跳先把能拿的分拿到手。这个策略在后来的笔试里帮我保住了很多原本可能会丢的分。复盘这个事我的感受是比刷题更重要。每次模拟考或真题练习结束后我会把错题按知识树归类比如“数学基础”“CNN计算”“字符串算法”“工程经验”这几个分支然后记录错误原因和正确思路。考后复盘我是这么做的先不看答案凭记忆再做一遍错题看自己能不能推出正确答案如果推不出来再查资料把相关知识点连带复习一遍。这样做一次效果比盲目刷十道新题都大。最后再分享一个小技巧。很多人笔试完就觉得任务结束了其实笔试后的复盘才真正决定你后续面试的上限。网易校招不会只看笔试题分数面试环节更看重你对问题本质的理解。你把笔试暴露出来的薄弱点补上面试时就多了一分从容。别把笔试当成一场考试把它当成一次免费的自我体检这样整个秋招过程中的每一关都能变成你进步的机会。
返回列表