ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

网易深度学习工程师笔试复盘:从反向传播到模型部署的核心考点

网易深度学习工程师笔试复盘:从反向传播到模型部署的核心考点 2018年那会儿深度学习工程师还是不少应届生眼里的香饽饽。网易校招这套BJ笔试卷当年刷完印象很深没有一道题是为了难为人但每一道都能看出你是不是真的理解深度学习而不是只会调框架。时隔几年回头看这套卷子的考察逻辑依然不过时——数学底子、机器学习基础、深度学习机制、coding能力外加一点系统设计思维。如果你正在准备算法岗笔试或者想系统梳理一遍自己的知识盲区这篇文章值得认真看看。我会把题型结构、核心考点、答题思路和备考方法一条条拆开讲也会把当年踩过的坑和我后来面过、带过人的经验放进去尽量让你少走弯路。1. 笔试题型拆解网易在考察什么1.1 试卷结构与时间分配网易2018年深度学习工程师校招笔试BJ卷和当年大多数互联网公司算法岗笔试一样大致分成几个模块选择题、简答题、编程题偶尔会有开放设计题。选择题涉及数学和机器学习基础简答题主要考深度学习理论比如反向传播推导、CNN结构设计理由、过拟合处理方案编程题通常是两道左右一道较简单的数据处理或算法题一道和深度学习相关的实现题开放题则会让你设计一个系统比如根据业务场景设计一个图像识别方案。时间分配上我记得当时只有两个小时左右题量却不少。很多人栽在时间分配上前面的选择题纠结太久结果编程题没写完。我的建议是选择题遇到不会的标记一下先跳过每道题控制在两分钟内简答题只要答题要点清晰不用写长篇大论编程题至少留40分钟先写框架再补细节。这类笔试表面考知识实际考的是你在有限时间内快速定位问题、用最可靠方案解决问题的能力。1.2 题目背后的能力模型为什么网易要这样设计笔试回头看其实很清楚深度学习工程师不是纯算法研究岗而是需要把模型落地的人。所以选择题中的数学题考察的是你对优化、矩阵运算、概率论的理解——这些是看懂论文、调试模型的基本功机器学习基础题考察你对传统算法的掌握因为深度学习是从这个土壤长出来的深度学习机制题考察你是否亲手推导过、实现过而不是只会调用Keras或TensorFlow API编程题考察工程能力开放题考察系统思维。这套模型放到今天依然适用。深度学习技术迭代很快但底层能力要求没有变。如果你只是背了一堆名词比如知道什么是卷积、什么是LSTM但没有真正理解它们为什么有效笔试很容易露馅。这也是我这些年带人时的强烈感受简历写得很漂亮的人笔试一考基本功就原形毕露。所以这篇复盘我会重点讲怎么把这些“底层能力”补扎实。2. 深度学习理论考点反复出现的硬核内容2.1 反向传播从链式法则到梯度消失反向传播是深度学习笔试的必考内容没有之一。考察方式通常是给一个简单的网络结构比如一个两层的全连接网络让你手推某个参数的梯度。表面上是数学题实际上考的是你是否理解计算图和链式法则的本质。做题时别急着展开公式先把计算图画出来。从损失函数开始一步步往回标出每一条路径。比如损失L经过softmaxsoftmax输入是zz由W和x计算得到那么∂L/∂W就是∂L/∂z乘以∂z/∂W而∂L/∂z里还有一个softmax求导的经典陷阱i等于j和不等于j时导数不同很多人在这里丢掉符号。所以条件允许的话最好把softmax的雅可比矩阵写一遍笔试时才能不出错。另一个高频考察点是梯度消失和梯度爆炸。简单的场景一个深层网络如果每层用sigmoid激活链式法则会连乘一串小于1的导数梯度传到前面几层就趋近于零网络几乎学不动。笔试中会问你解决办法标准答案有三个方向换激活函数ReLU系列、加BatchNorm、做残差连接。但如果你想拿高分最好能进一步解释为什么ReLU能缓解它在正半轴导数为常数1不会像sigmoid那样把梯度越乘越小而残差连接则是给梯度提供了“高速公路”让误差可以直接回流。能把“为什么”讲清楚面试官才会觉得你真的懂。提示笔试简答题不要只写结论。写公式推导时保留关键步骤文字说明用一两句话点出本质比如“链式法则是核心梯度消失的本质是多个小于1的项连乘”。踩分点往往就藏在这些解释里。2.2 卷积与池化吃透CNN的核心机制CNN相关题目在笔试里出镜率极高。选择题可能直接问输入224×224×3的图像用一个步长为2、padding为1的5×5卷积核输出尺寸是多少计算公式是 (W - F 2P) / S 1代入就是 (224 - 5 2) / 2 1 111.5这里需要注意不能整除时一般向下取整实际框架的实现可能有差异所以看到类似题先注意向下还是向上取整的约定。参数量计算也是常客。一个卷积层有C_in个输入通道、C_out个输出通道、K×K的卷积核参数量就是C_in × C_out × K × K如果还带偏置项就再加上C_out。比如输入64通道输出128通道3×3卷积参数量就是64×128×3×373728再加128个偏置。这种题没有难度但很考细心单位别写成M、K时不要算错。池化是另一个绕不开的知识点。最大池化为什么常用因为它提取的是局部区域最显著的特征对轻微的平移和形变有一定容忍度平均池化则保留更多背景信息。全连接层前常用的全局平均池化可以强制让每个特征图对应一个类别得分还大大减少了参数量是经典分类网络的标配。笔试中可能会让你比较各种池化的作用出题角度通常是为什么降采样用池化而不是直接加大卷积步长这时候要答出来池化没有可学习参数、计算开销极低还能提升平移不变性而stride卷积在降采样同时会引入可学习参数表达能力强但容易过拟合。两者没有绝对优劣关键看场景。2.3 训练策略与正则化模型调优必答题训练策略在笔试里也是重头戏。比如问训练集loss很低、验证集loss很高怎么办这就是典型的过拟合问题标准答案包括增加数据量、做数据增强、加Dropout、加权重衰减、早停、降低模型容量。但更高级的回答会先说清楚判断依据训练集和验证集loss相差大说明泛化能力弱模型记住了训练集噪声而不是学到底层规律。优化器选择也高频出现。SGD、Momentum、RMSProp、Adam笔试大概率让你比较。我的记忆技巧是这样SGD最朴素学习率不对就震荡Momentum加了“惯性”能加速收敛并越过局部极小RMSProp对不同参数自适应调整学习率Adam则把Momentum和RMSProp结合基本是默认选择。笔试如果问你为什么Adam收敛快你可以说它同时使用了梯度的一阶矩和二阶矩估计对每个参数给了自适应步长。但也要知道Adam的坑在部分任务上最终的泛化性能不如调好学习率的SGDmomentum。这个点如果简答题里能提到会显得你很懂行。学习率策略也值得准备。warmup、cosine decay、StepLR、ReduceLROnPlateau这些名词至少要知道是干什么的。常见的角度是训练初期用较大学习率快速接近最优区域后期用小学习率精细收敛。warmup的核心是避免训练初期梯度方向不稳定时大步长导致发散这个写过训练脚本的人应该深有体会。3. 笔试拉分项数学、编程与系统设计3.1 数学基础题矩阵求导与概率思维数学题在选择题里占了很大比例。线性代数里最常考的是矩阵求导、特征值分解、SVD。深度学习里大量操作其实是矩阵运算所以笔试考这些并不是为难你。比如给定一个二次型问你梯度是什么或者给一个协方差矩阵问你PCA的主成分方向。这类题如果忘了就把矩阵求导的几个常见结论重新推一遍比如 ∂(xᵀAx)/∂x (A Aᵀ)x推导过程用逐元素展开即可。概率论也是必考。贝叶斯公式是超高频考点经常包装成一个场景题比如“某种疾病的检测准确率是99%误检率是1%人群中患病率是0.1%某人检测阳性实际患病的概率是多少”这类题考的是条件概率真正会算的人会发现结果往往远低于直觉。拿这个例子算一下就知道了P(患病|阳性) (0.001×0.99) / (0.001×0.99 0.999×0.01) ≈ 0.09。所以笔试中看到概率题先把贝叶斯公式写出来再代入数字别凭感觉选。3.2 编程题与手写代码准备编程题是笔试里最容易拉开差距的部分。除了常规的LeetCode题算法岗笔试经常让你手写和深度学习相关的实现。我在2018年那会儿准备的时候会把几个经典实现背得很熟用numpy写一个softmax函数并加上稳定的数值处理手写一个K-means聚类手写一个两层全连接网络的前向和反向用numpy实现一个最简单的卷积操作。以softmax为例一个常见的坑是数值溢出。如果直接用exp(x)当x很大时exp(x)会爆掉所以写法上要先把每个元素减去该行的最大值保证指数里最大是0。整个函数写下来大概是import numpy as np def softmax(x): # x shape: (N, C) x_max np.max(x, axis1, keepdimsTrue) exp_x np.exp(x - x_max) return exp_x / np.sum(exp_x, axis1, keepdimsTrue)然后顺手把交叉熵也写了对预测概率取负对数按样本求均值。这类代码面试官看重的不只是对错还有你有没有考虑数值稳定性。写代码时养成好习惯先处理边界条件再写主逻辑。手写卷积也不难但很考基本功。核心是用im2col把图像展成矩阵再用矩阵乘法实现或者直接四层for循环硬算。笔试时建议先写直观版本保证正确性再提到可以用im2col加速。代码算得慢没关系但思路要清晰。3.3 开放题从识别猫到完整系统设计开放题是很多人的噩梦因为没有一个标准答案。网易这类公司很爱出“请设计一个XX系统”的题。热搜里有一个词叫“深度学习的识别猫”虽然听起来像入门项目但把它扩展成系统设计题就很有代表性。如果题目是“设计一个猫狗分类系统”你的答案最好不要只说“用CNN训练一个分类模型”。面试官想听的是完整链条数据怎么来、怎么标注、不平衡怎么办模型选什么结构、为什么训练时数据增强怎么加评估用什么指标线上推理延迟怎么控制。如果你能答到“在边缘设备部署时可以把模型量化到INT8准确率下降不到1%但速度提升3倍”这道题的分基本就稳了。这类开放题考察的不是你会不会某个模型而是你有没有真正把一个项目从0做到1的闭环思维。系统设计题还有一根主线是鲁棒性。比如问“模型上线后遇到用户上传的模糊图片怎么办”很多人的第一反应是继续调模型但更完整的思路包括输入侧做图像预检和增强、训练侧加噪声和模糊模拟、推理侧加置信度阈值与人工兜底。这种多环节打补丁的思路才是大厂做算法工程的核心方法论。笔试时把链条写出来即使细节不完美也能看出你的工程意识。4. 从笔试走向实战浮点数格式选型与模型部署4.1 浮点数格式fp32、fp16、bf16、tf32到底怎么选这里单独开一章是因为近几年“深度学习模型部署必知浮点数格式”已经成了笔试和面试的高频话题也是实际项目里绕不开的工程问题。2018年笔试时可能还不太考这些但如果你现在还在刷这套题准备面试这一块一定要补上。fp32单精度是传统训练的默认格式32位里有1位符号位、8位指数位、23位尾数位。它精度够用但内存占用大显存紧张的时候训练速度也上不去。fp16半精度把指数位压缩到5位、尾数位压缩到10位内存直接减半但表示范围窄训练时很容易溢出或下溢。bf16是Google提出来的保留了8位指数位只把尾数裁到7位所以它的动态范围和fp32一样大不会轻易溢出但精度低一些大模型训练时常用。tf32是NVIDIA用在Tensor Core上的一种截断格式运算时把fp32的尾数截成10位精度介于fp32和fp16之间但在A100等硬件上算矩阵乘法的速度远高于fp32。选型没有万能答案我的经验是这样日常训练默认用fp32显存不够或者想提速再用混合精度大模型训练优先考虑bf16因为它的动态范围让人省心推理部署追求速度时用fp16或进一步量化到INT8在A100、H100这类卡上做训练可以开启tf32来提速。混合精度训练还有个关键组件是loss scaling因为fp16下梯度可能太小被下溢成0需要乘一个缩放因子再反缩放。笔试如果问到这里能说出“动态loss scaling是AMP的默认策略”就很加分。注意fp16和bf16在推理阶段也有差异。如果用fp16部署模型输出精度可能轻微下降但如果模型里有一些值很大或很小的操作fp16很容易出NaNbf16虽然精度低一点但极少出现范围问题。所以部署前一定要跑通一遍全量验证集对比精度曲线。格式指数位尾数位内存占用典型场景主要风险fp328234字节训练、精度敏感场景显存占用大fp165102字节混合精度训练、推理加速取值范围窄易溢出bf16872字节大模型训练精度损失明显tf328104字节Tensor Core加速训练仅NVIDIA新卡支持4.2 推理优化与端侧部署的关键点笔试的开放题里如果涉及部署常见的考察点包括模型裁剪、蒸馏、量化、TensorRT/ONNX Runtime加速。量化是最常考的因为它在工程上收益最直接把fp32的权重和激活转成INT8内存减少4倍推理速度大幅提升代价是精度轻微下降。量化的方式分后训练量化PTQ和量化感知训练QAT。PTQ直接拿训练好的模型量化操作简单但遇到数值分布特别不均匀的层容易掉点QAT在训练时就模拟量化误差精度更高但需要重新训练成本也高。笔试中如果问“模型上线如何在精度和速度之间权衡”你可以这样答先做PTQ试水掉点严重再对敏感层单独处理或者上QAT。这种回答体现的是“先低成本验证再做精细化处理”的工程思维。另外一个常被忽略的点是BatchNorm在训练和推理时的行为差异。训练时BN用的是当前batch的均值方差推理时用的是训练阶段统计好的全局均值方差。如果模型从训练切到推理时忘了切模式或者导出模型时BN融合没做前期几层输出就会偏掉。这种问题不是笔试必考但实际项目里非常常见面试时能主动提出来会显得经验很足。4.3 环境配置与工程复现的经验“深度学习环境配置”能成为热搜词说明坑实在太多了。笔试不一定考但这类题目后面通常跟着面试面试官大概率会问“你平时在什么环境里跑模型”。我建议准备一套顺手的本地环境Ubuntu系统上装好NVIDIA驱动和CUDA用conda或venv管理Python环境深度学习框架用PyTorch就够大部分人用了。有个很常见的坑是“Ubuntu22安装深度学习驱动后没反应”这类问题多半是驱动与内核版本不匹配或者nouveau内核模块没禁掉。装驱动不是越新越好要先去NVIDIA官网查自己的显卡支持哪个版本。装完之后用nvidia-smi验证能看到GPU信息才算成功。PyTorch安装也建议用官方匹配CUDA版本的pip源别图省事随便装CPU版跑起来才发现慢十倍。复现项目是笔试备考阶段最好的练习。找几个经典的分类、检测、分割项目把训练脚本跑通记录每个参数的作用。我特别喜欢拿“猫狗识别”这种小项目练手数据量不大、训练时间短可以快速验证不同学习率、不同backbone的效果差异。跑通一个项目远比背十个概念更能应对笔试和面试。5. 常见问题与备考路线图5.1 高频错点与排查方式结合这些年的笔试和面试经验我把高频错点整理成一个速查表考前翻一遍很管用错点典型表现排查思路卷积输出尺寸算错忘记padding或stride代入错误牢牢记住 (W-F2P)/S1先判断能否整除参数量漏掉偏置只算了权重项统一先算权重再加偏置养成习惯softmax求导符号错对角元素漏写手推一遍雅可比矩阵写清ij和i≠j两种情况梯度消失原因解释不透只说“因为网络太深”从链式法则连乘的角度切入引到激活函数导数范围过拟合只答一种方案只写Dropout按数据、模型、训练策略三个层面分别展开优化器选择凭感觉说“Adam最厉害”先列优缺点再结合场景说明选型依据混合精度训练崩了直接换回fp32检查loss scaling开关、BN层数值、梯度下溢这里的每一个错点都对应一条“考试时能救命的思路”。做完题后复盘错题比盲目刷新题效率高得多。5.2 短期冲刺与长期积累建议如果离笔试只有两到三周我的建议是分成三段第一周把所有基础概念过一遍重点是反向传播推导、CNN结构、优化器与正则化这几块第二周集中刷编程题和手写实现把softmax、卷积、交叉熵、K-means这些写成可复用的代码第三周做整套模拟题训练卡时间答题的节奏。但长期来看最扎实的备考方式还是动手做项目。深度学习这个领域有一个特点看十篇教程不如自己跑通一个模型。你只有在训练中真正遇到过loss不降、梯度爆炸、显存溢出才能在笔试中体会到那些题目背后的痛点。比如你遇到过loss突然变成NaN才会真正理解学习率过大会导致数值溢出你调过BN的batch size才会理解BN在训练和推理时的差异。这些经验是背题永远替代不了的。关于环境我强烈建议用Ubuntu配合PyTorch把练习环境固定下来。不建议用太复杂的配置显卡驱动、CUDA、PyTorch这三层够用就行其他依赖缺什么装什么。很多人在环境配置上浪费大量时间最后反而没时间刷题。配置好之后写一个简单的CNN训练脚本能跑通就说明整个链路没问题。我个人的体会是网易这套2018年的笔试卷放在今天仍然很有参考价值因为它的核心考察点不是最新的模型结构或技巧而是深度学习工程师真正的基本功。刷题只是第一步把知识体系建起来再把自己的代码能力补上去笔试和面试都不会太差。最后再分享一个小习惯每道错题不要只看答案而是把背后的原理写在旁边写满一本错题集之后你会发现自己对深度学习的理解上了一个台阶。祝准备校招的同学都能拿到心仪的offer。
返回列表