十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

字节腾讯NLP实习面试复盘:手撕代码与原理深挖的较量

字节腾讯NLP实习面试复盘:手撕代码与原理深挖的较量 最近刚好把字节跳动头条和腾讯的 NLP 算法实习生面试都走了一遍最后两个都拿到了 offer。回头整理了一下面试记录发现这两家的考察风格差异还挺大的一个偏“手撕代码工程落地”一个偏“基础深度学术视野”。这篇就把我的准备过程、两边的面试原题、答题思路和踩坑点全部梳理出来给正在准备 NLP 实习的兄弟姐们一个参考。我自己是某 211 计算机专业的硕士研究方向是自然语言处理主要做文本分类和情感分析投的是 NLP 算法实习生。简历上有一个完整的项目经历基于 Bert 的新闻标题分类系统就是那个“nlp新闻处理”方向的课题另外有一段在导师实验室做的舆情分析项目。语言主要是 Python框架用的 PyTorchTransformer 相关的内容算是比较熟的。下面按时间线把两家的面试过程完整复盘一遍。1. 求职背景与准备思路1.1 我的基本情况与投递策略先交代一下背景。我本硕都是计算机相关专业硕士阶段才真正接触 NLP。实验室方向偏文本挖掘日常就是处理新闻语料、做文本分类、情感分析这些东西。所以我的简历上最有分量的项目就是“基于 Bert 的新闻标题分类系统”这也是面试官问得最多的一块。投递策略上我是海投加定向结合。字节和腾讯都是走的官网投递大概在一个月内完成。时间安排上有意识地错开了先面字节后面腾讯。这样做的考虑是字节的面试流程相对标准化算法题考得重能快速检验自己的代码功底腾讯的面试更看重对模型原理的理解和表达深度适合在字节面试之后带着实战复盘去面。实际走下来这个顺序帮了我大忙后面详细说。我觉得准备 NLP 实习面试最重要的三件事是项目里的每一个细节都经得起追问、经典模型的推导要能手写出来、手撕代码的水平要达到中等以上力扣题目的程度。这三条里第一条其实是很多人的短板。1.2 简历打磨与项目亮点的取舍简历这个事儿太关键了。我见过太多人项目写得很满但面试官一问就露馅。我的做法是只保留两个项目一个大而全一个小而精。大而全的是“基于 Bert 的新闻标题分类系统”这个项目我把它拆成了四个可以独立讲清楚的点数据层面新闻标题短文本的特点如何清洗、去重、处理类别不平衡模型层面为什么选 Bert 而不是 TextCNN/BiLSTM微调时的 trick学习率、warmup、层冻结部署层面模型蒸馏、ONNX 导出、推理加速评估层面如何设计离线评估指标线上 AB 测试怎么做的小而精的是舆情分析项目这个项目主要用来展示我对传统机器学习模型的掌握因为里面用到了 TF-IDF LR 作为 baseline还对比了 FastText、TextCNN 等模型。简历上不要堆砌“精通”“熟练”这种词没用。面试官只看你做过什么、做到什么程度。我在简历上写了一个自己都觉得有点深的点“针对新闻标题短文本的对抗训练FGM”这个点后来在腾讯面试里被追问了好久但也正是这个点帮我拿到了加分。2. 字节跳动头条NLP实习面试全流程字节的面试一共四轮前三轮是技术面最后一轮是 HR 面。整个流程非常紧凑一轮挂了直接结束效率极高。我个人的体感是字节更看重“你能不能立刻干活”所以代码题和项目细节的追问非常狠。2.1 第一轮基础算法与代码能力摸底字节的一面通常不会太难主要目的是确认你的代码能力过关。我这轮面试官是个年轻的算法工程师上来没废话直接让我做了一道 LeetCode 中等难度的题“三数之和”。这题考察双指针属于经典题。这里有个细节值得说一下。我写完代码后面试官没有立刻让我走而是追问了三个问题这段代码的时间复杂度是多少如果数组里有大量重复元素你的去重逻辑还能优化吗双指针为什么能保证不会漏掉解第三个问题我当时愣了一下但马上组织语言回答因为排序后左指针和右指针的移动是有单调性的左指针右移时右指针只能左移这个单向性保证了不会回头所以不会漏。面试官点头这一面就算过了。一面问的 NLP 基础题很常规Word2Vec 和 GloVe 的区别、LSTM 为什么能缓解梯度消失都是老生常谈。我回答的时候会有意识地往项目上引。比如说到 LSTM 的梯度问题我会顺带提一句“我在新闻标题分类项目里对比过 BiLSTM 和 Bert从效果上看大模型确实有优势但 BiLSTM 在推理速度上更友好。”这样既回答了问题又展示了项目经验。2.2 第二轮模型原理与项目深挖二面是深水区面试官明显是团队里的资深工程师。这一轮没有算法题全程在挖项目。大概聊了四十分钟问得特别细我回忆一下重点问题第一个问题是“你项目里用 Bert为什么不直接拿最后一层做分类而要取 CLS token 的输出”这个问题看着简单但回答的深度很大。我答了三点CLS token 在预训练时被设计用来聚合整个序列的信息不同层的表示侧重不同直接取最后一层会丢失一部分中间层的句法特征我在实验里对比过取最后一层和取最后四层 concat 的效果后者在验证集上稳定提升 0.8%-1.2%。第二个问题是“你做新闻标题分类遇到的最大的工程挑战是什么”我讲的是类别不平衡的处理。新闻标题的类别分布非常 skewed军事类和政治类的样本明显多文化类相对少。我试过几种方法直接过采样效果一般、focal loss稳定提升了 1.5%、阈值调整上线时候用的这个。面试官追问 focal loss 的原理我现场推了公式并且解释了为什么它能缓解易分类样本的梯度主导问题。第三轮是交叉面这个后面单独说。二面最后面试官问了我一个开放题“如果让你设计一个新闻标题的实时分类系统延迟要求在 50ms 以内你会怎么做”我从模型选型、蒸馏、推理加速、缓存设计几个维度答了一通。这种题没有标准答案主要看思路是不是完整。2.3 第三轮交叉面与综合考察字节的交叉面一般是找一个其他团队的工程师来面目的是看你的综合素质和沟通能力。这轮面试官是搜索方向的前辈问的问题跟 NLP 关系不大更像是在考察算法思维。他问了一道设计题“给你一个海量用户的搜索日志如何找出其中的热门关键词”我答了用 HashMap 计数加堆排序的思路然后他追问数据量太大内存装不下怎么办。这个就是经典的 TopK 问题我回答用分治或者 Trie 树。然后他继续加难度“如果日志是实时产生的流数据呢”我答了用 Count-Min Sketch 近似计数或者维护一个固定大小的最小堆。这一轮给我的感觉是不考死知识就是看你能不能把学过的东西迁移到没见过的问题上。所以平时积累的时候不要只刷题要多想想每个算法背后的设计思想。HR 面就很常规了问了我的时间安排、能不能保证实习时长、有没有其他 offer 之类的。这里给个建议如果手里还有其他公司的流程可以坦诚说HR 那边反而会更积极。但不要说谎查出来很影响后续。3. 腾讯NLP实习面试全流程腾讯的面试流程更加灵活没有固定的轮次我总共经历了三轮技术面和一轮 HR 面。整体体感是腾讯讲究“基本功”对经典的机器学习、深度学习理论考察得更深对面试者的学术表达和逻辑组织能力要求更高。3.1 第一轮经典机器学习与数学基础腾讯一面的技术含量明显比字节的一面高一个档次。面试官上来先问了我十分钟的机器学习基础包括推导逻辑回归的损失函数和梯度更新公式SVM 的核函数怎么选择为什么高斯核能映射到无穷维决策树、随机森林、GBDT、XGBoost 的区别聊了很长时间这几个问题我答得不算差但确实感到腾讯对数学推导的要求高。尤其是 SVM 的核函数我当时只回答了“高斯核可以映射到无穷维”面试官直接追问“为什么”。这个问题的关键是用泰勒展开把高斯核展开成多项式核的线性组合每一阶都对应一个特征映射加起来就是无穷维。我踩过这个坑专门花了一晚上把相关证明过了一遍所以答上来了。NLP 部分问的是 Word2Vec 的详细推导。注意这里是“详细”不是让你说个大概。面试官要求我写出 Skip-gram 的损失函数和各参数的梯度。这题太经典了网上很多面经都写过。我建议准备面试的同学一定要自己动手把 Word2Vec 的前向和反向过程推导两遍以上不能只看别人写的推导。很多东西你看着懂真正手推的时候会卡住。这一面还问了一个我当时没答好的题“HMM 和 CRF 的区别是什么”我大概知道 HMM 是生成模型、CRF 是判别模型但深层的“标注偏置问题”解释得不够清楚。面完之后我专门补了这块后面在腾讯三面的时候居然又遇到了这个后面讲。3.2 第二轮Transformer与预训练模型深度考察腾讯二面是我感觉发挥最好的一轮。面试官是 NLP 组的资深研究员全程围绕 Transformer 架构展开问得极其细致。这部分是我准备得最充分的因为知道这是各家面试的必考点。问题清单大概是这样Transformer 为什么用 Layer Norm 而不是 Batch Norm我答了 Layer Norm 对序列长度变化不敏感与 batch 大小无关且在 Transformer 中每个 token 的统计量不同Layer Norm 在特征维度做归一化更合适。Multi-Head Attention 的 head 数怎么选择为什么 8 个效果最好这个我坦诚说没有定论主要是实验经验同时给出了一个角度过多的 head 会增加参数冗余过少则难以捕捉不同子空间的注意力模式。位置编码为什么用三角函数而不是直接学一个位置 embedding我答了三角函数的周期性可以外推到更长的序列而学习的 embedding 在训练长度外的位置没有泛化能力。Bert 的预训练任务中NSPNext Sentence Prediction的作用是什么后续模型为什么不用它这个我结合了 RoBERTa 的发现来答NSP 对很多下游任务没有明显增益甚至可能损害句子对任务的性能。除了 Transformer面试官还问了对抗训练。我简历上有提过 FGM他就让我讲讲原理。我把 FGM 的对抗样本生成公式写了一下然后解释在 embedding 层面加一个小的扰动让模型对这个扰动不敏感相当于一个正则化能提升模型的鲁棒性。他追问为什么加在 embedding 层而不是输入层我答了 embedding 是高维连续空间梯度方向更平滑扰动更有效。二面准备的过程中最重要的是建立了一个“从数学推导到工程实现”的完整链条。比如 Transformer 每个模块我都要求自己既能推导公式也能说出 PyTorch 代码里对应的操作。面试官很喜欢这类回答方式因为这代表你真有动手实践过而不是只看过论文。3.3 第三轮场景设计题与项目复盘腾讯三面的面试官看起来是总监级别开场就让我“用五分钟讲一下你的新闻标题分类项目”。这里注意五分钟讲完一个项目是需要刻意练习的讲太细会超时讲太粗显不出深度。我采用的框架是“背景-难点-方案-结果-反思”。讲完之后面试官问了两个我很意外的点第一“你的模型训练完之后推理的时候如果有新的类别出现怎么办”这是个好问题。新闻标题的类别体系是不断演化的新类别出现是常态。我答了两种思路先做 OODout-of-distribution检测把低置信度的样本拦截下来走人工然后定期用新类别数据做增量训练。第二“如果线上预测的分布和训练分布漂移了你怎么发现这个问题”我答了监控预测结果的置信度分布和类别分布这个算是线上机器学习系统的基本操作。这轮没有手撕代码但有一个场景设计题“给你一个聊天机器人场景用户输入一句话你要判断用户的意图。你打算怎么设计这个系统”这种题没有标准答案但需要思路完整。我从数据标注、模型选型先分类后抽取、多轮对话状态管理、兜底策略四个层面答了。面试官追问“冷启动阶段只有几百条标注数据你会怎么做”这个就是考验实用经验了我答了用规则小模型兜底同时用主动学习筛选高价值样本补充标注等数据量上来了再换成 Bert 微调。最后 HR 面问了职业规划、选择腾讯的原因、实习时间常规问题正常回答就行。整体来说腾讯的面试更软性、更考察思维的全面性。这可能也是大厂风格差异的体现。4. 两家考察重点对比与核心知识梳理4.1 字节 vs 腾讯面试风格差异把两家的面试放在一起对比能很明显看出考察侧重点的不同。我整理了一个对比表格方便大家参考维度字节跳动头条腾讯手撕代码大量中等偏难必考相对少更侧重思路讲解项目深挖非常细关注工程落地关注学术深度和表达逻辑数学推导中等偶有基础题深入会要求完整推导NLP 原理考察频率高但偏应用考察非常深偏理论场景设计题常见常见且追问激烈风格体感直接、快节奏、硬核温和、偏学术、讲逻辑字节的风格是“我招你来是干活的”所以代码能力、工程意识、快速解决问题的效率是第一优先级。腾讯的风格更“学院派”面试官会跟你聊很多理论细节考察你是不是真的理解模型背后在做什么。这两条路线没有优劣之分关键是你适合哪种。我之前有同学代码能力很强去字节如鱼得水也有同学对论文理解特别深去腾讯被夸“基础扎实”。4.2 NLP 高频考点知识清单准备这两家的面试如果只能划一个重点那 NLP 基础知识的覆盖度决定了你的下限。下面是我整理出的最高频的考点清单基本是必问级别Word2Vec 的两种模型CBOW/Skip-gram和训练技巧负采样、层次 SoftmaxELMo / Bert / GPT 的区别和发展脉络Transformer 和 Attention 的完整原理Multi-Head Attention 的计算过程位置编码的几种方式为什么 Transformer 需要位置编码LSTM 的门控机制和梯度流动路径文本分类的常用模型演进TextCNN / BiLSTM / Bert 的优缺点对比CRF 在序列标注中的作用HMM 和 CRF 的具体区别这些知识点不是背下来就完了。我准备的方法是对每一个知识点都强制自己从三个层次去理解。第一层是 What这个模型是什么解决什么问题。第二层是 Why为什么这么设计核心动机是什么。第三层是 How怎么实现代码怎么写有什么坑。这样面试官无论从哪个角度问你都有话可说。以位置编码为例What 是给 Transformer 的输入加入序列顺序信息Why 是因为 Transformer 自身没有循环结构或卷积结构对 token 顺序不敏感How 是用正弦余弦函数生成固定编码并添加到 embedding 上也可以在后面用可学习的 position embedding。如果面试官再往下追问“外推到更长的序列”你还能答三角函数编码具有相对位置表达能力。4.3 算法题的准备策略字节必考手撕代码腾讯虽然考得少但也不是完全不考。我的准备方式是LeetCode 热题 Top 100 剑指 Offer 重点题两道加起来大概两百题左右刷了两遍。第二遍刷的时候我没有再看答案而是用“讲题”的方式检验自己假装面试官在对面把题目、思路、复杂度、可能的 corner case 全部口述一遍。这个方法很费时间但效果极好。因为面试的时候你不仅要把代码写对还要把思路讲清楚。针对 NLP 实习面试我觉得以下类型的题目优先级最高双指针类三数之和、最长无重复子串动态规划类最长公共子序列、编辑距离、正则表达式匹配哈希表类两数之和、字母异位词分组二叉树类层序遍历、最近公共祖先字符串处理实现 strStr、反转字符串中的单词这里有个小经验字节的算法题通常不会直接考模板而是会稍加变形。比如“三数之和”的双指针去重逻辑就可能被换成一个 NLP 场景给你一组词向量找出所有距离之和最小的三个点之类的。所以重要的是掌握算法的核心思想而不是背代码。5. 常见问题与避坑指南5.1 面试中最容易翻车的几个点第一个大坑是项目讲了但说不清。很多人简历上写了 Bert 微调但面试官问“你学习率设的多少为什么是这个值”就卡住了。这种问题没有标准答案但你必须能解释自己的选择。我当时学习率用的是 2e-5原因是 Bert 微调时学习率过大会破坏预训练学到的表征过小则收敛太慢。这个经验来自我实验的时候调过 1e-5、2e-5、5e-5 三个值2e-5 在验证集上效果最好。第二个大坑是数学推导不过关。尤其是 Word2Vec 和 Transformer 的推导腾讯很爱考。如果你不能手写出注意力权重的 softmax 公式或者不知道 skip-gram 的损失函数在负采样之后长什么样大概率会在面试的时候冷场。我的建议是不要只背公式要顺着推导过程走一遍理解每一步是为什么。第三个大坑是对模型的认识停留在 API 调用层面。比如你用了 Bert但不知道它的参数量是多少、有几个 encoder 层、attention head 数是多少、隐藏层维度是多少。一问就打脸这比不会更致命。因为这些信息在模型配置文件里就写着你不知道说明根本没深入看过。第四个大坑是把 HMM 和 CRF 混为一谈。腾讯二面的时候我被追问过 CRF 的标注偏置问题。简单说HMM 是生成模型对联合概率建模会在路径间比较时偏向状态数少的分支CRF 是判别模型直接对条件概率建模通过全局归一化避免了这个问题。这个点我觉得值得多花点时间理解因为它属于“课本知识”和“真实面试”之间的差距。5.2 关于心态和面试节奏的一些建议面试这个东西实力是一部分心态和节奏也很重要。我在字节一面之前紧张得不行手写三数之和的时候循环边界差点写错。后来发现一个缓解紧张很有效的方法面试前一个小时拿一张空白纸把 Word2Vec 的公式推导一遍把注意力机制的计算流程写一遍。这个动作就像是热身能让你进入“技术状态”而不是停留在“焦虑状态”。另外不要怕“挂”。我身边很多同学都有过被拒的经历包括我自己也在另外两家小厂被拒过。面试被拒很多时候不是你不行是匹配度的问题。字节和腾讯虽然都是大厂但团队的风格、业务方向、技术栈差异很大你不适合这家不代表你不优秀。面试的过程中一定要把自己放在“平等交流”的位置上。面试官不是考官更像是一个比你经验更丰富的同行。遇到不会的问题很正常关键是你怎么应对。我的应对策略是先说出自己知道的部分再明确提出自己不太确定的地方最后问面试官是否可以给点提示。面试官通常很乐于引导因为他也想知道你的思维过程。5.3 拿到 offer 之后怎么选最后简单说下选择的问题。字节和腾讯的 NLP 实习 offer 都拿到后怎么选确实是个幸福的烦恼。我的思考维度有几个业务方向搜索/推荐/内容理解 vs 语音/对话/内容安全、团队氛围网上能看到一些评价但要注意甄别、转正率实习最重要的目标之一是争取转正、技术栈匹配度是做纯模型还是模型工程。没有绝对正确的答案只有适合自己的选择。对我来说最终选了头条原因很简单我面试时感受到的业务节奏和工程氛围更适合我现阶段想快速成长的需求。但你如果更喜欢深度研究腾讯可能更合适。最后我想说的是面经永远是参考不是标准答案。同一道题不同面试官的期待可能是完全不一样的。与其刷一百篇面经不如把每一条知识真正吃透。面试的过程本质上是一次自我审视你平时积累了多少面试的时候就会呈现多少一点都装不出来。祝大家都能拿到心仪的 offer。
返回列表