ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

网易NLP算法工程师笔试复盘:从选择题到编程题全解析

2026/8/30 19:35:42 拓冰建站 浏览量
网易NLP算法工程师笔试复盘:从选择题到编程题全解析 网易的笔试系统是牛客网那套进去之后先是一段防作弊说明然后就是单选题、多选题和三道编程题。我选的岗位是NLP算法工程师提前批整体感受是选择题考察的面很广但不算深编程题比想象中更看重基本功而真正拉开差距的是最后两道偏工程的题目。这篇文章就按我的答题顺序把能回忆起来的题目、我的解题思路以及当时踩过的坑都复盘一遍给接下来要参加类似校招笔试的同学一些参考。1. 笔试开场系统构成与答题节奏复盘1.1 题型分布与分值结构先搞清楚要面对什么网易这套笔试题一共分成三块20道单选题、10道多选题和3道编程题。单选题每题大概2分多选题每题3分编程题每题15-20分不等总分在100分左右。我印象比较深的是多选题选错不得分、漏选得一半分所以拿不准的选项我基本都会只选最确定的那个这个策略在分数上确实帮我保住了不少。题型分布大致是单选里NLP基础知识大概占6-7道机器学习和深度学习占6-7道数据结构和算法占3-4道剩下的概率统计和智力题占2-3道。多选则更偏深度学习细节和模型对比。三道编程题难度是递进的第一道是字符串处理第二道是动态规划第三道是贪心加数据结构优化medium偏hard的水平。整体时长120分钟看起来充裕但实际做到最后一道题时我已经只剩40多分钟了。选择题里有一些题目需要现场推导公式比如贝叶斯后验概率计算、softmax交叉熵梯度推导这些非常耗时间如果前面节奏没控制好后面编程题会写得很赶。1.2 答题顺序和时间分配我当时的选择与失误我的答题策略是先做编程题再回来刷选择题。这个习惯是我在牛客刷题时养成的因为编程题分值高且往往通过率低趁头脑清醒时先把代码写出来后面选择题就算时间紧也还能靠直觉蒙一些。实际做下来第一道字符串题花了15分钟第二道动态规划虽然思路对了但边界条件调试花了25分钟第三道题我看出是贪心加优先队列但写代码到一半发现时间不够只能写了个暴力版本拿部分测试点的分数。这里的教训是笔试前一定要练熟优先队列、并查集、有序集合这类常用容器的手写实现因为Java的PriorityQueue和TreeSet、Python的heapq在紧张状态下很容易写错比较器。选择题我是最后40分钟赶完的个别涉及NLP细节的题目比如CRF的维特比解码复杂度、BERT的参数量计算我只能凭印象选所以这部分失分偏多。如果重来一次我会把时间分配调整为编程题60分钟、选择题50分钟、最后10分钟检查多选题的漏选情况。2. 数学与机器学习基础看似送分实则送命的题目2.1 概率统计和信息论考点这几道题不能不掌握选择题里有一道我记得很清楚给定两个正态分布求混合分布的方差。很多人会直接写成两个方差的加权平均但正确做法是要加上两项均值差的贡献公式是 Var w1*(σ1² μ1²) w2*(σ2² μ2²) - μ²。这类题在NLP里其实很实用比如做高斯混合模型初始化、文本向量聚类时都会用到同样的分解逻辑。信息论相关的题目基本年年有今年考了KL散度和交叉熵的关系。题目问当真实分布P固定时为什么最小化交叉熵等价于最小化KL散度。答案是KL散度 交叉熵 - H(P)而H(P)是常数所以最优解一致。另外还考了一道条件熵的计算给一个二元分布的联合概率表求H(Y|X)。这类题只要对公式熟悉现场列一张小表推一遍也不难但千万别凭感觉选。还有一个容易被坑的点是贝叶斯公式应用题。题目说某NLP模型的准确率是98%在负样本上的误报率是2%样本中正样本占比1%问如果模型预测为正实际为正的概率是多少。答案是直接用贝叶斯公式算大致是 0.98*0.01 / (0.98*0.01 0.02*0.99) ≈ 33%。类似的题在往年笔试中也出现过关键是要看清题干给的是“误报率”还是“召回率”一字之差答案完全不同。2.2 经典机器学习算法辨析LR、SVM、决策树那些事单选考了逻辑回归和线性SVM的区别选项包括是否自带概率输出、是否对异常值敏感、损失函数形式、是否核方法。正确答案是逻辑回归通过sigmoid输出概率而线性SVM输出的是距离间隔SVM的hinge loss在边界外的样本不产生损失所以决策边界更依赖支持向量对异常值相对不那么敏感。KNN那道题也很典型给定一组二维点问K3时某个样本的预测类别。这本是送分题但如果样本点的坐标间隔很小算欧氏距离容易算错。我的建议是遇到带小数的坐标先全部乘以10转成整数再算能省去很多无谓的失误。聚类算法考了K-Means和层次聚类的对比问哪种聚类不需要预先指定簇数答案是层次聚类。同时题里还问K-Means对初始化敏感的原因因为代价函数是非凸的初始中心不同可能落入不同局部最优解。多选题里出现了DBSCAN和K-Means对噪声的鲁棒性对比DBSCAN能识别噪声点而K-Means会把噪声硬分到某个簇里这个点今年考到了。2.3 损失函数与评价指标别混淆了F1和AUC的适用场景有一道单选给出一个文本分类任务中模型在测试集上的预测结果让计算精确率、召回率和F1值。这种题一定要把混淆矩阵先画出来再一行行填TP、FP、FN、TN不要心算。当时我旁边好像有人直接用公式心算结果发现题目给的是一个多分类问题需要按micro或macro两种方式分别计算F1而选项里恰好设置了两个对应不同计算方式的答案坑得很。AUC的考查方式更有意思给5个样本的预测概率和真实标签问AUC是多少。我用的方法是把所有正样本和负样本两两配对统计预测概率正样本大于负样本的对数再除以总对数。这个思路其实就是Wilcoxon-Mann-Whitney检验的定义比直接画ROC曲线快很多也方便在考场上逐步推导。交叉熵损失函数的梯度推导在多选题里出现了一次问softmax交叉熵对logits的梯度是多少。答案是预测概率减去one-hot标签。这类推导题如果平时没有手动推过考场上很容易忘记多分类分母那个求和项的链式法则。我自己的做法是考前把softmax、交叉熵、二分类logistic loss这三个梯度推导在白纸上各写两遍几乎是每年必考。3. 深度学习与NLP核心从Transformer到预训练模型3.1 注意力机制与Transformer结构细节必考的硬骨头关于Transformer的选择题今年依然没缺席而且比往年更细。有一题问多头注意力中如果模型维度d_model512头数h8每个头的维度是多少以及为什么要除以根号d_k做缩放。答案前者是64后者是为了避免点积结果过大导致softmax进入饱和区梯度过小。这两个点都属于“背过就会”的知识点但如果只读过不推导很容易在考场上卡住。还有一个记忆深刻的题Transformer的位置编码是绝对位置还是相对位置为什么原始Transformer选择的是正弦余弦函数。答案核心是正弦余弦编码具备一定的相对位置表达能力因为P_{posk}可以表示成P_{pos}的线性组合。今年多选里还增加了一个干扰项说“RoPE是原始Transformer默认采用的位置编码”但实际上RoPE是后来的工作选它就错了。很多人在这一步失分我提醒以后复习时要注意每个编码方法提出的时间线。Transformer的参数量计算也是高频题。考了一个BERT-base规模的编码器问大概参数量。答案是110M左右但计算方式要拆成词嵌入层、注意力层和前馈网络三部分分别统计。词嵌入部分占大头因为词表通常是3万左右乘768维Transformer每层的参数是12*768²注意每层有12个权重矩阵12层加起来大约85M。这类题我第一次做的时候把注意力层的四个矩阵漏算了一个后来每次复习都会单独再算一遍。3.2 BERT、GPT与预训练范式这部分拉开差距选择题里问到BERT和GPT在模型结构和训练任务上的核心区别我选了Transformer Encoder vs Decoder、双向注意力 vs 因果注意力、MLM vs 自回归语言建模。多选里还拓展了几个选项比如BERT的NSP任务在后续RoBERTa中被移除GPT-2开始把LayerNorm移动到子层输入端等。这些点属于近两年的热门考点需要平时读论文时沉淀下来临时抱佛脚很难拿全。有一道题考的是BERT分词器的WordPiece实际效果给一个词“unaffable”问它会被分成哪些子词。这道题需要熟悉WordPiece的贪心最长匹配规则。我当时按经验判断应该是有“un”、“aff”、“able”几个部分选项里还有一个干扰项用了BPE的##后缀表示法但说成WordPiece会用“##able”这类标记实际上BERT的WordPiece对中间子词用的是##前缀。这个细节如果不读源码很容易被绕进去。预训练模型的微调策略也是重点。题目给了一个少样本文本分类场景选项包括冻结BERT全部参数只训练分类头、全量微调、使用Adapter、使用Prompt Tuning。多选问哪些做法在低资源场景下更稳妥答案是全冻分类头、Adapter、Prompt Tuning都可以全量微调在数据极少时容易过拟合。这道题其实考的是对参数高效微调方法的理解深度如果只会在HuggingFace里调Trainer不知道这些方法背后的动机就很难判断每个选项的适用场景。3.3 NLP经典任务与经典模型TF-IDF和BM25这些不能丢别以为大模型时代就不考传统NLP模型了笔试里TF-IDF、BM25、Word2Vec、HMM、CRF全都出现了。有一道题要求比较BM25和TF-IDF问BM25在哪些方面做了改进答案是引入了文档长度归一化、词频饱和函数和IDF平滑这些改进让BM25在检索场景中更稳健。关于词向量多选题给了一个Word2Vec训练后的词向量性质判断选项包括词向量之间可以类比推理、不同随机种子训练结果不同、词向量不包含上下文信息。这里要搞清楚word2vec是静态词向量每个词只有一个固定表示不包含上下文动态信息所以它无法解决一词多义问题。后面关于ELMo和BERT的两道选择题也是围绕这个缺陷展开的题目问ELMo相比Word2Vec的核心突破是什么答案是ELMo使用双向LSTM并融合多层表示能根据上下文动态生成词向量。HMM和CRF的对比在单选出现了。问在序列标注任务中CRF相比HMM的优势是什么正确选项是CRF可以设计任意特征函数不依赖强独立性假设能建模标签之间的转移关系。另一道题问维特比算法的时间复杂度答案是O(N*L²)其中N是序列长度L是标签数。这个复杂度很多人会记成O(N*L)实际上是每步都要遍历上一个所有可能标签的转移所以是平方项。我笔试时差点选错后来靠排除法A是O(NL)、B是O(NL²)、C是O(N²L)、D是O(N²L²)才锁定B。4. 代码题与算法数据结构三道编程题的实战复盘4.1 字符串处理与KMP变体第一题拿到手别急着写第一道编程题我印象非常深因为它在经典KMP的基础上加了变化给定模式串p要求输出p的next数组也就是next[i]定义为p[0:i]这个子串的最长相等前后缀长度。比如模式串abacaba它的next数组需要逐位计算。很多同学会直接把KMP的next数组背出来但这里有个微妙之处不同教材对next数组的下标偏移定义不一样有的从0开始有的从1开始还有的会把初始值设为-1。题目如果没有明确说明最好在代码里写成标准KMP算法里使用的部分匹配表也就是next[i]表示“当第i位失配时应该跳转到哪个位置继续匹配”这样最符合主流的双指针写法。我的写法是用两个指针i和ji代表当前计算的子串末尾j代表当前最长相等前后缀长度然后按经典递推更新。这个题的关键不在算法本身而在输出格式。网易的笔试系统经常要求输出以空格或逗号分隔的数组我因为没注意分隔符第一版提交后报了一个格式错误的提示。后来我把输出改成每个元素后跟空格最后再删掉末尾空格才算通过。建议这类字符串题做题前先花20秒看示例输入输出确认数组格式和下标起点再用最小的例子手动走一遍流程避免最简单的错误。4.2 动态规划与序列建模状态定义决定成败第二道编程题是典型的线性DP大概意思是给出一个长度为n的数组要求把数组划分成若干连续段每段有一个代价比如段内最大减最小的绝对值求总代价不超过某个上限时最多能分成多少段。这种题一看就是DP加二分但我在考场上选了一个比较绕的状态设计导致边界条件处理起来很麻烦。我当时定义的dp[i]表示前i个元素能组成不超过代价上限的段数最大值然后用一个指针不断扩展当前段的右端点如果当前段的代价超过上限就更新左端点。这个思路本身是对的朴素实现是O(n²)在n到1e5的时候会超时需要配合贪心优化。后来我发现这个题如果先把数组排序就变成了一个简单的贪心问题按顺序累计当前段的代价一旦超过上限就开新段这样只需要O(n)的时间复杂度。这也是笔试题目常见的“伪装”表面是DP题实际用贪心就能解决。我们复盘一下DP和贪心的判断标准如果每段内部的顺序没有意义那就要考虑排序排序后能贪心如果段内顺序对结果有影响那才必须用DP。当时我要是早点意识到这个区别第二题能省下很多时间。4.3 优先队列与贪心优化最后一题我只拿了部分分第三道编程题是经典的区间调度变种给定若干任务的开始时间、结束时间和收益选择不相交的任务集合使总收益最大。这种题常见解法是动态规划加二分按结束时间排序后对每个任务寻找最近的不冲突任务用二分查找优化转移。这个思路我一眼就看出来了但实现时在二分查找的边界处理上卡了很久。关键坑在于查找最近不冲突任务时需要在结束时间数组中查找“最后一个结束时间小于等于当前任务开始时间”的位置。很多库函数比如Python的bisect_right查的是插入位置需要减一才是目标索引。我当时在这里来回试了几次才终于把边界调对但这时候时间已经不太够了。这个题想拿满分还需要在动态规划转移时用维护前缀最大值来减少一层遍历做到时间O(n log n)、空间O(n)。我因为时间原因只提交了二分加遍历的O(n²)版本测试用例过了6个剩下几个大用例超时。这里我反思的是笔试前应该把“区间调度二分”和“贪心优先队列”这类组合题型集中刷20道左右形成肌肉记忆考试时才能快速写出无Bug版本。4.4 排序、二分、贪心等基础算法选择题里的隐形考点编程题之外选择题对算法基础的考察也不容忽视。今年考了快速排序在平均和最坏情况下的时间复杂度答案是O(n log n)和O(n²)。题目问最坏情况下发生在什么时候正确答案是当每次划分都极端不平衡时比如数组已经有序且选取第一个元素作为基准。排序算法的稳定性对比也出现了一次问哪些排序是稳定的。正确选项是归并排序和冒泡排序快速排序、堆排序和选择排序都是不稳定的。当时还考了堆排序建堆过程的时间复杂度答案是O(n)这个很多人会误以为是O(n log n)因为从叶子节点向上逐层调整总开销是线性的。我在这里多花了半分钟回忆建堆的数学证明但最终还是能推出来。二分答案也出现在选择题里题目给出了一个标准的二分答案代码片段要求补全循环条件和收缩条件。这种题其实就是考代码填空关键要判断用的是左闭右开还是左闭右闭区间写法。网易的笔试代码风格有时候会偏向Python风格用while left right然后right mid、left mid 1。如果平时刷题固定用一套二分模板看到官方给的另一种式子就容易慌所以考前最好把两种模板都熟悉一遍做到能互相转换。5. 系统设计与场景题NLP算法落地能力怎么考5.1 文本分类与语义匹配设计题从数据到上线全流程选择题里有一道综合场景题题干相当长某新闻客户端需要一个文本分类模型能够把每日数百万篇新闻自动分到几十个一级分类中要求给出从数据处理到模型上线的主要流程。选项包括去重与清洗、分词、TF-IDF或Embedding表征、模型训练与评估、上线后A/B测试。正确选项基本上是所有这些项的组合但有一个干扰项是“使用OCR把图片转成文字后直接拼接进行训练”这不属于文本分类的标准流程如果题干说是纯文本的话这步是多余的。这道题考察的其实是对NLP项目完整生命周期的理解不只是会调用模型还要知道数据清洗、样本不均衡处理、线上线下一致性等工程细节。新闻文本分类跟普通文本分类比有个特殊性类别之间可能存在层级关系比如“体育”下面有“足球”和“篮球”“科技”下面有“人工智能”和“手机数码”所以设计时可以考虑层级分类或带约束的多标签分类精度会有明显提升。我当时选的方案是先按URL和正文MD5去重再用规则过滤标签页和乱码文本接着用预训练模型做文本Embedding之后接一个浅层分类器最后根据线上日志和人工抽检评估效果。题里问哪些环节可以并行处理我意识到这里考的是分布式数据处理的常识但作为NLP岗能答出“Embedding批量推理和分类器训练可以异步并行”就更完整了。5.2 检索、排序与语义匹配向量召回来了网易的NLP岗位一直很重视搜索和推荐方向今年笔试里有一道关于召回和排序的题目给定一个问答检索系统用户输入问句需要从千万级FAQ库中检索最相关的答案。以下哪些方法适合做召回阶段哪些适合做精排阶段。选项中包含BM25、向量相似度检索、BERT交叉编码器、双塔模型等。这里的关键是理解“召回”和“精排”的工程约束召回阶段要处理千万级候选必须快所以适合用BM25或双塔模型把问句和答案映射成向量后用向量检索精排阶段候选数量只有几百这时候可以用BERT交叉编码器做细粒度匹配虽然慢但准确率高。BGE嵌入模型这类双塔方案在真正项目中越来越常见但笔试的选项里没有具体考到它只是作为“向量检索”概念出现。我注意到这类题目在近两年校招笔试中频繁出现。本质上是在考察候选人是否理解“先粗筛、后精排”的漏斗式架构以及能否根据数据规模选择合适模型。如果你只在跑HuggingFace的pipeline而没想过线上场景的延迟这类题很难答全。我的建议是复习时把双塔vs交叉编码器、BM25的公式、向量检索的召回率和延迟权衡都整理成一套笔记。5.3 模型压缩与在线推理低延迟场景怎么设计多选里有一道关于BERT线上部署的题一个客服机器人需要对每个用户消息在100ms内返回意图分类结果但直接跑BERT-base需要约40ms加上前后处理和批量排队后经常超过阈值。问哪些优化方案可行。答案包括模型蒸馏为小型模型如从BERT-base蒸馏到TinyBERT、量化到INT8、知识蒸馏、提前退出机制以及使用ONNX Runtime或TensorRT进行推理优化。这类题目往年会以“AI推理性能优化”的形式出现今年直接结合了NLP模型说明出题人希望候选人理解模型压缩的基本思路。关键是区分哪些是“无损/低损优化”哪些会明显影响效果。比如蒸馏通常能保留大部分效果但直接裁剪层数会有更大的效果损失量化也可能在某些任务上掉点。当时选项里有一个“把所有层参数置为0”的干扰选项正常的优化思路不会做这种事懂得压缩原理的话一眼就能排除。我自己的工程经验是INT8量化对BERT类模型效果影响很小尤其是在分类任务上准确率下降可能在0.5%以内但推理速度能提升2-3倍。所以在笔试里遇到这种题我的判断标准是有没有改变模型结构、有没有用到真实数据分布、有没有保留效果评估环节。如果三个维度都合理那大概率是正确选项。6. 给下一届的备考建议与踩坑记录6.1 我踩过的三个坑希望你不要再踩第一个坑是编程环境不熟悉。网易笔试用的牛客网默认支持Python和Java等语言但我平时用的是PyCharm的本地环境对牛客网的在线编辑器不熟悉。第一道题刚写完时因为系统自动补全和本地IDE不一样导致我误删了代码。考后我想了一下最好在笔试前专门去牛客网用在线编辑器刷20道题把快捷键和输入输出习惯提前适应好。第二个坑是选择题的公式自己没吃透。有几道概率题和信息论题我明明复习时见过类似思路但因为只看不练到考场上推导了半天也不确定。后来我的对策是每天抽10分钟推一个公式包括softmax交叉熵梯度、朴素贝叶斯后验概率、KL散度计算、F1和AUC计算。推公式虽然枯燥但笔试碰到原题就能秒杀。第三个坑是时间分配失误。我把太多时间花在第二道DP题的边界调试上导致最后一道题写了个半成品。事后复盘更合理的做法是三道编程题按15分钟、20分钟、25分钟各设一个提醒超时立刻放弃当前写法直接用暴力方法拿部分分把剩余时间留给选择题或检查。在笔试里拿到自己会做的分数永远是第一优先级的完整的一道easy题肯定比半道hard题更有价值。6.2 高效的复习路径按优先级排个序如果距离笔试还有一个月左右我的建议是先把NLP基础理论过一遍。具体来说文本表示Word2Vec、ELMo、BERT、GPT、序列标注HMM、CRF、BiLSTM-CRF、文本分类FastText、TextCNN、Transformer分类、匹配双塔、交叉编码器、生成Seq2Seq、注意力机制、Beam Search都需要知道基本原理和适用场景。这个部分大概需要7-10天。第二个优先级是机器学习基础重点是逻辑回归、SVM、决策树、K-Means、KNN、朴素贝叶斯、PCA和常见评价指标。这个部分不用推太深但笔试常考的损失函数、优化方法和适用场景要很熟练。再用3-5天刷算法题重点刷贪心、动态规划、字符串、树和图、排序与二分。不要贪多每天2-3道高频题就行关键是心态好、保证手感。最后一周用来做往年笔试真题和模拟题。牛客网上有不少互联网公司NLP方向的笔试合集虽然题目不全但题型和难度可以参考。我在最后一周每天做一套专门训练在有限时间内选择性放弃题目的能力。这个训练很有效它帮我逐步知道哪些题一眼就能做、哪些题应该跳过。6.3 笔试之后如何为面试争取主动权笔试结束后不要干等结果我建议立刻开始准备面试中高频的内容项目复盘、手推公式、模型细节、场景设计题。特别是笔试里暴露的薄弱点比如CRF原理、BERT变体、检索系统结构这些大概率会在面试里再考一次。我当时就是因为笔试里有一道位置编码的题做错了面试时专门把Transformer的位置编码从头到尾推导了一遍结果面试官真的问到了RoPE和ALiBi的区别我答得比笔试时流畅多了。另外可以提前把简历里写的每个项目都准备一个“5分钟讲清楚”的版本包含背景、难点、方案、结果、你的角色。网易的面试风格很喜欢深挖项目经常追问“你为什么选这个方案”“如果数据量翻十倍还能不能用”。如果你在准备笔试的间隙就开始思考这些问题等收到面试通知时就不会手足无措。