尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

小鹏汽车NLP算法岗面试复盘:从KMP到Bert的考点全解析

小鹏汽车NLP算法岗面试复盘:从KMP到Bert的考点全解析 小鹏汽车2019春招NLP算法岗的面试题这个话题放到现在来看依然很有嚼头。我当时投递的动机很简单智能汽车赛道里自然语言处理是车载语音助手、智能座舱、用户反馈分析这些场景的底层支撑而小鹏又是新势力里技术氛围比较纯粹的一家。整个面试流程走下来我的整体感受是它不像互联网大厂那样特别爱考偏题怪题而是更看重你对基础模型的掌握深度以及能不能把算法落地到具体业务里。这篇复盘我会按面试流程展开从笔试、技术一面、技术二面到最后的HR面把每一类问题、我的回答思路、面试官追问的方向以及我事后复盘发现的坑都写清楚。无论你是准备面试NLP算法岗还是已经在做相关方向想查漏补缺这轮面试题都有不少值得对照自检的点。1. 面试全流程概览1.1 我的投递时间线与面试节奏2019年春招的节奏要比秋招紧凑不少。我当时是在学校就业网上看到的小鹏汽车校招信息投递之后大概一周收到了笔试链接。笔试是线上进行限时两个小时题目分为选择题、编程题和简答题三块。技术面试一共两轮一面是电话技术面主要抠基础二面是现场面试在广州总部除了技术问题还有一道现场coding外加两个业务场景题。技术面通过之后是HR面问的都是一些常规问题但也会考察你对汽车行业和岗位的理解。整条流程走完大概花了三周时间。和当时面其他互联网公司相比小鹏的面试更注重“基础扎实不扎实”“能不能讲清楚模型背后的原理”这两件事。选择题里就有不少“这个算法的时间复杂度是多少”这种送分题但也有一部分题是专门筛选那些只会调包、不懂原理的候选人的。1.2 面试官关注什么从简历项目出发层层追问一面和二面的风格都挺一致先让你挑一个最熟悉的项目讲一遍然后面试官会顺着项目里用的模型和细节往深里问。比如我简历里写了一个基于Bert的文本分类项目面试官就会追问“为什么用Bert而不用LSTM”“你的损失函数是怎么设计的”“类别不均衡问题怎么处理的”。只要有一个细节讲不清楚他马上就会换个角度再问一遍。这给我的启发是面试NLP算法岗简历上写的每一个技术点都要做好“被连续追问三层”的准备。第一层是“你用了什么”第二层是“为什么选它而不选别的”第三层是“它内部是怎么实现的、有什么缺点”。只准备到第一层基本撑不过十分钟。2. 笔试与机试算法功底是第一道门槛2.1 一道把next数组问到底的KMP题笔试里有一道让我印象非常深的题给定模式串 p abacaba求它的 next 数组。题目里特别注明了“next[i] 定义为……”但这个定义被截断或者表述得比较含糊实际上不同教材对next数组有两种常见约定这也成了这道题最大的争议点。第一种约定是严蔚敏《数据结构》里的做法next[i] 表示当第 i 个字符失配时模式串指针应该回退到的位置。在这种定义下next[0] -1然后逐个计算前缀的最长相等真前后缀长度。对 abacaba 来说next[0] -1next[1]前两个字符是ab没有相等的前后缀next[1] 0next[2]前三个字符是aba最长相等真前后缀是a长度1next[2] 1next[3]前四个字符是abac没有next[3] 0next[4]前五个字符是abaca最长相等真前后缀是a长度1next[4] 1next[5]前六个字符是abacab最长相等真前后缀是ab长度2next[5] 2next[6]前七个字符是abacaba最长相等真前后缀是aba长度3next[6] 3所以按第一种约定结果是 [-1, 0, 0, 1, 0, 1, 2, 3]如果把next[0]也算上。第二种约定是把 next[i] 直接定义为“前 i 个字符的最长相等真前后缀长度”下标从0开始那么对应结果是 next[0]0, next[1]0, next[2]1, next[3]0, next[4]1, next[5]2, next[6]3也就是 [0, 0, 1, 0, 1, 2, 3]。我在笔试时按第一种约定作答但事后跟同学讨论发现好几个人用了第二种约定。这道题真正的考点并不是要你死记硬背某一套数组值而是考察你是否理解 next 数组的本质——它记录的是模式串中“已经匹配的部分”里前缀与后缀的最长重合长度。理解了这一点不管面试官用哪种定义你都能现场推出来。提示面试如果遇到这类定义有歧义的题可以先问一句“next数组用的是哪种约定”或者在答案旁边把两种都列出来。这反而能让面试官看到你对基础概念的敏感度。2.2 排序、贪心与最短路径这些题其实在考“复杂度直觉”笔试选择里考了堆排序、快速排序在最好和最坏情况下的时间复杂度还有一个冒泡排序的优化判断。这些题本身不难但容易翻车的是“堆排序建堆的时间复杂度为什么是O(n)”。如果你只背了结论没推过建堆过程很容易当场卡住。快速排序最坏情况退化成O(n²)的原因也经常考我当时答的是“基准选取不当导致每次划分极度不平衡”面试官问我“那怎么改进”这就延伸到了随机化快排和三数取中法。排序算法这块建议不要只背时间复杂度和稳定性表格要把每一次比较、每一次交换的代价都想明白。另有一道编程题考了最短路径题目是“给定一个加权无向图求从节点0到其他所有节点的最短距离”。最直接的做法是Dijkstra算法但笔试环境不限制语言所以我用Python的堆优化版本写了import heapq def dijkstra(n, edges, src0): g [[] for _ in range(n)] for u, v, w in edges: g[u].append((v, w)) g[v].append((u, w)) dist [float(inf)] * n dist[src] 0 pq [(0, src)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in g[u]: nd d w if nd dist[v]: dist[v] nd heapq.heappush(pq, (nd, v)) return dist写完代码之后面试官在电话里追问了一句“为什么用堆优化的Dijkstra复杂度是多少”。这里要记住堆优化的Dijkstra时间复杂度是O((VE)logV)适用于稀疏图如果是稠密图普通O(V²)版本反而更直接。回答时要带上这些前提不要只甩一个结论。2.3 现场编程题字符串匹配之外还考了“文本处理的工程思维”笔试和现场面试里有一种很实际的编程题给一段文本让你统计词频、去停用词、提取关键词。比如有一题是“给定一段英文评论输出出现频率最高的10个单词忽略大小写过滤掉标点和停用词”。这种题看似简单但考的是你对文本预处理流程的完整程度。我当时的实现思路是先把文本转成小写用正则把非字母字符替换成空格再按空格分词然后过滤长度小于2的单词和常见停用词最后用Counter统计词频。真正容易漏掉的是“过滤掉标点”这一步很多人直接split( )导致标点还挂在单词上统计结果就偏了。import re from collections import Counter STOP_WORDS {the, a, an, is, are, of, to, and, in, for} def top_freq_words(text, top_n10): text text.lower() text re.sub(r[^a-z\s], , text) words [w for w in text.split() if len(w) 1 and w not in STOP_WORDS] return Counter(words).most_common(top_n)这种题不是想难为你而是通过很常规的场景看你会不会漏边界情况。面试官后来问我“如果文本里混了URL和数字怎么办”“如果停用词表很大怎么降低过滤开销”这些都是在考察工程经验。2.4 笔试复盘容易在边界条件和复杂度分析上翻车笔试结束后我自己对照答案过了一遍发现错误几乎都出在边界条件上。比如KMP的模式串长度为1时next数组怎么处理、Dijkstra的图中存在负权边时算法是否仍然有效、快排递归深度会不会爆栈。有一道题是“在KMP算法中模式串长度为1时主串扫描的时间复杂度是多少”这个很多人没转过弯来。KMP的复杂度是O(mn)的前提是模式串长度大于0。模式串长度是1时算法退化成一个简单的字符比较但仍然是O(mn)。我当时答的是“O(m)”但其实应该是O(mn)因为还要计算next数组虽然next数组的计算也是O(1)。这种细节特别容易丢分。提示笔试里的基础算法题别只刷难度要把每个经典算法“从头到尾想一遍”。面试官常问的三个延伸方向是边界条件、复杂度推导、能否用更少空间完成。3. 技术一面机器学习基础问到底3.1 简历项目追问文本分类项目的“三层拷问”一面刚开始面试官就让我讲一个最能体现能力的NLP项目。我讲的是一个“社交媒体评论情感分类”的项目用了Bert做句子编码然后接一个全连接层做二分类。面试官的问题节奏很快几乎不给我喘息的机会“你用什么损失函数”——我答二分类用二分类交叉熵BCE。“为什么不用多分类交叉熵”——因为只是判断正面/负面二分类交叉熵和softmax多分类交叉熵在数学上是等价的但二分类用sigmoid输出更直接。“你的数据类别比例是多少如果不均衡你怎么办”——当时数据里正面和负面大约是7:3我用了类别权重来调整损失函数也可以考虑过采样/欠采样。“你评估模型为什么用F1不用准确率”——因为类别不均衡准确率会虚高F1能同时兼顾精确率和召回率。这些追问强度其实不算高但如果你只写过模型、没思考过评价指标和损失函数的含义就会在这里暴露。我当时比较庆幸的是我在项目里确实调过类别权重也对比过accuracy和F1的差异所以每一个问题都有实际依据不是在背概念。3.2 手推逻辑回归从sigmoid到参数更新面试官在电话里说“你手推一下逻辑回归的梯度下降吧”。这题我在面试前已经练过很多遍核心是理解逻辑回归为什么选用sigmoid函数以及交叉熵损失函数的梯度表达式。逻辑回归的假设是P(y1|x) 1/(1e^(-θ^T x))通常写成sigmoid函数。损失函数采用交叉熵L(θ) -1/m · Σ[y_i log h(x_i) (1-y_i) log(1-h(x_i))]对参数θ求偏导利用sigmoid函数性质 h(z) h(z)(1-h(z))最终得到梯度形式∂L/∂θ_k 1/m · Σ (h(x_i) - y_i) · x_{ik}这个结果非常漂亮梯度等于预测值与真实值之差乘以特征值。这意味着当预测完全准确时梯度为零模型不再更新。手推完成后面试官问了我一句“如果样本量很大梯度下降每一步都要遍历全部数据有什么替代方案”这就是在引导你回答随机梯度下降和小批量梯度下降。我当时答了SGD和Mini-batch SGD还说了两者的收敛速度差异。面试官最后补了一句“逻辑回归的损失函数是凸函数吗”这个问题很关键逻辑回归的交叉熵损失函数是关于参数的凸函数所以可以通过梯度下降到全局最优不必担心局部最优。3.3 特征工程与数据问题文本型特征怎么选、怎么降维一面里还问了不少特征工程的问题比如“缺失值怎么处理”“文本特征用TF-IDF好还是词向量好”。有一个题是我预料之中的“TF-IDF和BM25有什么区别”当时面试官是在问完文本分类项目后顺势问的。BM25是在TF-IDF思想上做了改进引入文档长度归一化和词频饱和函数所以对长文档更友好。BM25的核心公式可以理解为综合词频TF、逆文档频率IDF、文档长度三方面词频不是线性增加而是有一个饱和上限词在一个文档里出现10次和出现20次对相关性的提升远不如从0次到1次那么明显这个回答让面试官比较满意。因为BM25在信息检索场景里是标配算法做NLP的人如果只知道TF-IDF而不了解BM25确实说不过去。3.4 模型对比SVM、决策树、集成模型轮流问一面的后半段面试官花了不少时间做模型对比基本是把主流模型挨个问了一遍“SVM和逻辑回归的区别是什么”——重点在于SVM关注的是决策边界附近的支持向量而逻辑回归关注的是全部样本的概率拟合SVM用hinge loss逻辑回归用交叉熵。“核函数是什么为什么需要核函数”——当数据线性不可分时通过核函数把样本映射到高维空间使它们在高维可分。我当时说了RBF核还提到了“核技巧”的关键是只计算核函数值而不显式计算映射后的坐标。“决策树ID3、C4.5和CART有什么区别”——ID3用信息增益C4.5用信息增益率CART用基尼指数。面试反问“为什么C4.5要用信息增益率”因为信息增益偏向取值多的特征信息增益率做了归一化。“GBDT和随机森林的区别”——随机森林是Bagging并行训练多棵树取平均GBDT是Boosting串行训练每棵树拟合上一轮的残差。这些问题都算是机器学习算法岗的必考题。关键在于你要能顺着一个模型讲出另一个模型的改进动机而不是单纯念名字。面试官问到集成模型时特别强调了一句“XGBoost相对GBDT做了哪些优化”我当时答了二阶泰勒展开、正则项、列采样、并行化面试官点头后就没有深入了。3.5 一面复盘基础概念一定要能“口头推导”一面结束后我最大的感触是光知道模型能做什么远远不够必须能把模型公式里的每一步变化都讲清楚。尤其是逻辑回归和SVM这两个模型是你讲任何文本分类、情感分析问题的基础面试官特别喜欢从这两个模型里挑一个让你手推。我后来把机器学习高频面试题分成了三类第一类是“两个模型有什么区别”第二类是“为什么会这样设计”第三类是“如果数据变化了怎么办”。每一类都至少准备了两个回答角度一个是从数学角度一个是从工程角度。这个习惯我一直保留到了后来的社招面试受益很多。4. 技术二面NLP核心模型逐个过关4.1 Word2Vec为什么用负采样不用softmax二面是现场面试面试官先看了一遍我的简历然后说“你是做NLP方向的那我问一些NLP基础”。第一个问题是“Word2Vec有两种训练方式CBOW和Skip-gram它们有什么区别”。我回答CBOW是通过上下文预测中心词适合小型数据集训练速度快Skip-gram是通过中心词预测上下文对低频词更友好但训练相对慢。面试官接着问“Word2Vec的输出层为什么不用softmax而是用负采样”。这是一个非常经典的NLP面试题。softmax需要计算词表大小V个类别的归一化概率而V通常几十万甚至上百万计算成本太高。负采样的思路是不再计算所有词的概率只采样k个负样本和一个正样本做二分类大大降低计算量。面试官追问“负采样按什么概率分布采样”我答的是按词频的3/4次方加权分布采样这个设计是为了提高低频词被采样的概率。4.2 LSTM从RNN梯度消失讲到门控机制面试官问完Word2Vec后紧接着问“RNN为什么会有梯度消失问题LSTM又是怎么解决的”这个问题我准备过多遍。RNN在反向传播时梯度要沿着时间步连乘连乘的结果如果每个因子都小于1梯度会指数级衰减导致远离当前时刻的依赖难以被学习。LSTM引入了门控机制有输入门、遗忘门和输出门还有一个细胞状态c_t它通过遗忘门乘以前一时刻的细胞状态再加上输入门控制的新信息。关键点在于细胞状态的传播路径是一条“高速公路”梯度可以通过这条路径传得更远不易衰减。但这里有个容易踩的坑LSTM并不能完全解决梯度消失只是缓解了梯度衰减的速度。门控结构里sigmoid函数的导数是最大为0.25的如果门控状态持续饱和梯度仍然可能衰减。面试官听到我说“缓解”而不是“解决”时明显更认可。4.3 Attention与Bert2019年春招最热的新考点2019年春招有个很明显的时代特征Bert刚刚发布不久很多面试官都开始把Bert挂到嘴边但真正深入理解的人还不多。于是我深刻体会到——如果你对前沿模型比别人多一点理解面试里就是极其鲜明的亮点。我的二面面试官问的问题很有层次“注意力机制里的公式是什么”——Attention(Q,K,V) softmax(QK^T/√d_k)V“为什么要除以√d_k”——这是很多人的知识死角。我当时答的是当d_k比较大时Q和K的点积数值会变得很大导致softmax梯度趋近于零除以√d_k相当于对点积结果做缩放让softmax落在梯度敏感的区域。“Bert的两个预训练任务是什么”——Masked Language Model和Next Sentence Prediction。MLM随机掩盖15%的词让模型根据上下文预测被掩盖的词NSP判断两个句子是否是连续句子。“Bert为什么不用LSTM”——Bert用Transformer的Self-Attention替代了循环结构能够并行计算还能通过Self-Attention直接建模任意两个位置之间的依赖关系比LSTM的长距离依赖捕获能力更强。面试官问到这里突然停了一下问我“你用过Bert做实体识别吗”。我说没有实际做过但我们微信交流中有用Bert-BiLSTM-CRF做NER的方案。面试官点头说“那你说说CRF在NER里是干什么用的”。我就讲了CRF的序列标注约束作用它会学习标签之间的转移概率比如B-Person后面不能直接接I-Organization这种约束能显著降低非法标签序列的出现概率。4.4 检索与问答BM25、向量召回与排序逻辑后半场面试官转向了检索问答场景。他问“如果做一个车载领域的FAQ问答系统你会怎么设计”。我当时的回答分了三部分候选召回对称问句相似度匹配可以用BM25或向量召回把知识库里搜出来Top50候选问题精排用Bert做二分类判断“用户query和候选答案是否匹配”按得分排序兜底如果最高分低于阈值返回“抱歉我没有理解你的问题”并引导用户换个说法面试官追问“BM25和向量召回哪个更好”这里其实没有标准答案关键在于场景区分。BM25基于词项匹配适合词汇重叠度高的场景鲁棒性不错但无法处理同义改写向量召回基于语义向量相似度能匹配同义句但需要大量标注数据训练而且会存在“召回结果跟query语义相近但不完全是用户要问的”情况。在实际系统中两者常做融合用轻量级规则或模型做判断。这个回答让面试官比较满意因为我没有试图用一个技术解决所有问题而是根据自己的理解给出了一套可行的工程方案。4.5 二面复盘前沿模型要懂原理更要能落地二面结束后我最大的体会是面试官并不会因为某个模型很热门就直接让你背paper而是会围绕“这个模型解决了什么问题”“它的核心步骤是什么”“如果数据变了怎么调整”来考察你是否真正掌握。像Bert这样的模型如果你只是听说过名字说不出预训练任务和Transformer结构是过不了关的。我当时在准备阶段对Bert做了比较深的研究包括读了两遍英文原论文还把注意力机制的公式推过几遍。事实证明这些准备在面试里全部用上了。那轮面试的亮点基本都集中在我能“现场推导”而不是“背答案”的回答上。5. 现场coding与业务场景题面试官现场出的两道题5.1 手写代码实现一个带权重的随机抽样二面的现场coding题目是“给定一个词频表按词频比例随机抽取一个词”。这个题很多人第一时间想到的是“把每个词按频率展开成长列表再抽样”但词频很大的时候这种做法内存开销太高。正确做法是把每个词按权重映射到[0,1)区间上的一个区间段然后生成一个0到1之间的随机数判断它落在哪个区间里。这样只保存累计权重不需要展开列表。我当时用Python写了这个逻辑import random def weighted_sample(words, weights): total sum(weights) r random.uniform(0, total) upto 0.0 for word, weight in zip(words, weights): upto weight if r upto: return word return words[-1]面试官看完说“这个写法是O(n)的如果词表很大还能优化吗”我知道他说的是可以用前缀和加二分查找把时间复杂度降到O(log n)。当时在小黑板上画了前缀和数组的示意图又写了一段二分查找的示意代码面试官点头说“有意思”。提示现场coding别急着写代码。先把题目拆清楚说出最直接的暴力做法再说优化方案最后再动手写。面试官想听的其实是你怎么思考而不是你背过多少段代码。5.2 业务场景题车载语音助手的query理解现场面试的第二个场景题是“用户对车载语音助手说‘我想去机场’系统需要做哪些NLP处理才能完成这个任务”这个问题考查的是完整对话系统流程。我的回答如下首先做语音识别结果的文本输入但需要考虑用户的表述可能有ASR噪声比如“我想去机场”被识别成“我想去机厂”所以要做文本纠错然后做领域识别和意图识别判断这是一个导航类意图而不是娱乐或车控类再做槽位提取这个句子里“机场”是一个POI、或者说目的地槽位同时要判断用户是否说了出发地如果没说就需要反问最后把意图和槽位传给后端导航服务完成POI检索和路径规划面试官追问“如果用户说‘我要去白云机场T2航站楼但是先接一下我老婆’怎么办”。这个问题明显在考多轮对话和槽位状态追踪。我当时答的是把这句话拆成两个意图导航到白云机场T2加上一个途经点“接人”。系统需要维护一个对话状态记录目的地和途经点两个槽位并支持槽位更新。面试官听完说“多轮对话这块你做过吗”我说研究方向里接触过但没上线他也就没再深挖。5.3 工程化问题线上推理时延与效果监控业务场景题之后面试官问了一个偏工程的问题“如果这个问答模型要部署到车载设备上对时延要求很高你会怎么优化”这个问题我答得比较有条理模型层面用蒸馏把大模型压缩成小模型量化从FP16到INT8减少计算量推理层面用TensorRT或ONNX Runtime做加速打开动态shape优化架构层面把FAQ检索和问句分类等轻量模块前置把重模型后置。大部分常见问题走规则和小模型就能解决只有复杂问题才需要上Bert类模型缓存层把高频query的返回结果缓存起来命中后直接返回避免重复计算面试官追问“模型上线后效果变差了怎么监控”我说要记录线上日志统计几个核心指标包括用户无匹配率、平均响应时延、用户追问率。用户追问率一旦上升很可能意味着系统没有正确理解用户意图。这个问题能看出你有没有真正做过线上系统。如果只是在学校做实验很难说出这些监控指标的名字。5.4 场景题复盘多拿“实际业务”做标尺我在准备这个岗位时专门研究过车载语音助手和智能座舱的产品形态比如语音导航、电话、车控、娱乐问答这些场景。面试时能快速说出“优先走规则、再走模型、重型模型兜底”的分层思想很大程度是因为提前想了这些场景。如果面试前去了解一下目标公司的核心产品形态很多业务题都能准备到位。6. 复试与HR面技术之外的开放题6.1 终面的开放性问题怎么学一个新模型通过二面之后紧接着是终面。终面面试官更偏架构和全局视角没有死扣具体公式而是问“如果今天让你学一个没见过的新模型你会怎么学”这个问题需要答出方法论。我当时说了三个步骤第一先看一篇综述或技术博客搞懂这个模型解决了什么问题、在什么场景下生效第二把原论文和核心公式读一遍重点看损失函数和训练细节对着别人的复现代码过一遍流程第三自己找一个小数据集跑一个demo做一次实验对比它和现有方法的差异。面试官听完问了一句“你最近在看什么模型”这个其实是考察你是否保持技术敏感度。我如实回答了当时在关注Transformer相关的工作比如Bert在蒸馏和压缩方向的一些尝试。面试官没有再追细节而是转到了“你怎么看待技术分享”。我说有维护技术博客的习惯面试官明显对这个答案更有兴趣因为团队需要能沉淀知识的同学。6.2 HR面为什么选小鹏、如何看待加班HR面的问题比较常规但有一个问题很有意思“为什么选择加入小鹏汽车而不是其他互联网公司”我当时从三个角度回答第一智能汽车是AI技术落地最有想象力的场景之一NLP在车载场景里有具体且高频的需求第二小鹏是新势力里技术驱动的公司算法团队能接触到从数据采集、模型训练到部署上线的完整链路第三我比较喜欢从零到一的过程愿意接受创业公司的工作节奏。HR还问了我“能接受加班吗”。这个问题我一般不建议说“能接受任何加班”更不要说“完全不加班”。我当时答的是“项目节点紧张的时候我完全可以接受高强度工作但我希望加班是阶段性的而不是长期无意义的消耗”。这个回答既表达了态度又传递了对工作节奏的思考HR也接受了。6.3 复试复盘技术过硬之外要让面试官看到“学习力”整场终面给我的感觉是到了最后一轮面试官其实已经不太担心你的技术能力了他们更关心的是“这个人是不是有独立学习能力”“遇到不会的东西会不会去补课”“能不能和团队一起成长”。所以回答开放性问题时不要只输出答案要让面试官看到你的思考过程和后续动作。我事后总结了一套回答“怎么学”问题的公式先说学习路径再说一个具体案例最后说你会怎么验证自己学会了。这样三个层次下来面试官会觉得你是一个“有自己系统方法”的人而不只是一个会背知识点的候选人。7. 高频问题与避坑清单7.1 NLP算法岗高频考点速查表我把这轮面试中涉及的最高频考点整理成一张速查表方便大家按图索骥式地准备考点常见问法回答要点逻辑回归手推梯度下降从sigmoid到交叉熵到梯度表达式最后说明凸函数性质SVM线性不可分怎么办核函数、软间隔、RBF核的特性决策树ID3/C4.5/CART区别信息增益、信息增益率、基尼指数集成学习GBDT vs XGBoost二阶泰勒展开、正则项、列采样、并行化Word2Vec为什么用负采样softmax词表太大负采样转成二分类按词频3/4次方采样LSTM为什么能缓解梯度消失细胞状态直通路径、门控机制Attention注意力公式为什么除以√d_k点积数值过大会让softmax梯度消失缩放保持梯度敏感Bert预训练任务MLM加NSPTransformer并行化BM25和TF-IDF的区别词频饱和、文档长度归一化KMPnext数组怎么算最长相等前后缀注意定义约定每个考点都要准备到“能讲给没有任何背景的人听”的程度才算过关。7.2 我的避坑清单五个真实踩过的坑第一个坑是“只背结论不会推导”。面试官问我Bert为什么用MLM而不是语言模型我说“因为语言模型只能从左到右预测不能同时看到上下文”但让我说具体为什么双向信息重要时我卡了一下。这种“知道结论但说不清因果”的状态在面试里特别吃亏。第二个坑是“简历写了不熟悉的技术点”。我简历里写了“熟悉CRF”但二面被追问CRF损失函数时我只能说个大概面试官能明显感觉到你的深浅。后来在面试前我就把所有简历里提到的技术都重新查了一遍不懂的直接从简历里删掉。写简历不是为了显得厉害而是为了让你“每个字都接得住”。第三个坑是“现场coding没有先讲思路”。有一道题我拿到后直接开始敲代码面试官在旁边看了一会儿说“你先说说你的思路”。从那以后我每次写代码前都会先说暴力解再说优化解再动手写。面试官更希望你是一个“能沟通的工程师”而不是一个“打字很快的程序员”。第四个坑是“业务场景题缺少分层思维”。面试官问“你怎么设计FAQ问答系统”时我一开始只想用Bert硬解面试官提醒“你有没有想过很多高频问题其实不需要上模型”。如果只想着“用最强大的模型”会被认为缺少工程落地意识。后来我习惯凡是系统设计题都先把“简单方案”和“复杂方案”分开讲。第五个坑是“不会反问”。二面最后一个环节面试官问我“你有什么想问我的吗”我当时只问了一句“团队目前做什么”没有进一步追问。后来意识到好的反问能体现你的专业水平和求职意愿。比如可以问“团队目前对车载场景的NLP是怎么分工的”“模型从训练到部署的流程是怎样的”这些问题能让面试官感受到你是认真研究过这个岗位的。7.3 面试前的最后冲刺建议如果面试时间已经很近我建议把准备时间按4:4:2分配四成时间刷基础算法题KMP、排序、动态规划、Dijkstra这些高频题四成时间梳理机器学习与NLP核心模型的手推和对比两成时间准备业务场景和项目复盘。项目复盘要把“项目的难点是什么”“你做了什么”“结果怎么样”“如果重做会怎么改进”这四个问题想透这些是面试官必问的。笔试部分如果线上考试环境可能会限制你调试所以平时练习就要养成“不依赖自动补全”的习惯手写Python代码保持流畅。同时要熟悉常见库的使用比如collections.Counter、heapq、re这些笔试时能省不少时间。最后再分享一个小技巧整套面试下来我印象最深的不是哪道题特别难而是面试官几乎在每个环节都在验证同一件事这个人是不是真的理解模型背后的原理而不是只会调用现成的库。所以面试前我建议大家把最常用的三四个模型——比如逻辑回归、Word2Vec、LSTM、Bert——从损失函数到训练过程到工程应用全部梳理一遍最好能对着镜子讲出来。我个人在面试前一周做了一件很有效的事把每个高频题的“回答框架”写在便签上每天抽十道题口头回答一遍假装面前坐着面试官。这个过程能帮你发现很多“脑子里以为会嘴上讲不出来”的知识漏洞。等到真正面试的时候你会发现自己对答案的自信程度明显不一样。这轮小鹏汽车NLP算法岗的面试经历虽然过去有段时间了但里面的考点和考察方式放到今天依然很有参考价值。技术面试这件事归根到底就是“你懂什么、懂到什么程度、能不能说出来”。把基础打牢把项目讲透把代码写熟这三件事做到位了大部分算法岗面试都能从容应对。
返回列表