2026大模型面试:传统NLP基础必考28题
精选自170+道采集题目,保留最高频最核心的28题 | 难度:⭐基础 ⭐⭐进阶 ⭐⭐⭐深入
一、词向量与语言模型(6题)
- ⭐⭐ [高频] Word2Vec的CBOW和Skip-gram分别是什么?哪一个效果更好?在什么场景下各有优势?
一句话秒答:CBOW用上下文猜中间词,Skip-gram反过来用中间词猜上下文,小数据集Skip-gram更强。
展开来说:
- CBOW就像"完形填空"------把一个词挖掉,让周围的词投票猜它是谁。输入是上下文窗口里的词向量求平均,输出是中心词的概率。因为多个词一起平均,训练速度快,但低频词的信号容易被"稀释"掉。
- Skip-gram反过来,像"造句"------给你一个词,让你猜它周围可能出现什么词。每个中心词要和窗口里的每个上下文词各组一对训练样本,所以一个句子能拆出更多训练对,低频词也能充分学习。
- 速度 :CBOW快,因为每个窗口只产生一个训练样本;Skip-gram慢,产生 2×window_size2 \times window\_size2×window_size 个。效果:Skip-gram在小语料、低频词上表现更好,CBOW在大语料上效率更高且效果接近。Google原论文实验结论也是Skip-gram在语义类比任务上更优。
面试加分:实际工业场景中我们90%的时间都直接用Skip-gram + Negative Sampling组合,因为真实语料里长尾词非常多,Skip-gram对低频词的表征质量明显更好。
- ⭐⭐ [高频] Word2Vec中为什么会用到负采样(Negative Sampling)?负采样的采样方式是怎样的?
一句话秒答:因为原始softmax要对整个词表做归一化,太慢了,负采样把多分类问题变成了几个二分类问题。
展开来说:
- Word2Vec原始训练目标是一个 ∣V∣|V|∣V∣ 路的softmax,词表动辄几十万,每一步都要算全部词的内积再归一化,计算量是 O(∣V∣)O(|V|)O(∣V∣),根本跑不动。
- 负采样的思路特别朴素:正确的 (中心词, 上下文词) 对标签为1,再随机抽 kkk 个"噪声词"组成负对标签为0,每步只更新 k+1k+1k+1 个词的向量,计算量从 O(∣V∣)O(|V|)O(∣V∣) 骤降到 O(k)O(k)O(k)。原论文推荐小数据集 k=5-20k=5\text{-}20k=5-20,大数据集 k=2-5k=2\text{-}5k=2-5。
- 采样分布不是均匀的,而是按词频的 34\frac{3}{4}43 次幂采样:P(w)∝f(w)0.75P(w) \propto f(w)^{0.75}P(w)∝f(w)0.75。这个 0.750.750.75 的trick很巧妙------它让高频词被采到的概率降一点,低频词被采到的概率升一点,不至于全被"的、了、是"这些虚词占满。
面试加分:如果面试官追问"为什么是0.75不是1或0.5",你可以说这是Mikolov团队实验调出来的经验值,本质是在均匀分布(指数=0)和词频分布(指数=1)之间做了个折中,让采样既不忽略低频词也不偏离真实分布太远。
- ⭐⭐ [高频] 什么是GloVe?GloVe与Word2Vec的区别和联系是什么?
一句话秒答:GloVe利用全局词共现统计信息训练词向量,Word2Vec只看局部窗口,GloVe把"统计派"和"预测派"统一了。
展开来说:
- GloVe的全称是 Global Vectors,核心idea是:如果两个词经常一起出现,它们的向量内积应该近似于它们共现次数的对数。损失函数长这样:J=∑i,jf(Xij)(wiTw~j+bi+b~j−logXij)2J = \sum_{i,j} f(X_{ij})(w_i^T \tilde{w}j + b_i + \tilde{b}j - \log X{ij})^2J=∑i,jf(Xij)(wiTw~j+bi+b~j−logXij)2,其中 XijX{ij}Xij 是全局共现矩阵里 iii、jjj 的共现次数,f(⋅)f(\cdot)f(⋅) 是个权重函数,用来压制高频共现对的影响。
- 区别:Word2Vec是"预测模型"------通过滑窗在线训练,每次只看局部上下文;GloVe是"计数模型"------先统计全局共现矩阵,再做矩阵分解式的优化。你可以理解成:Word2Vec是"边走边学",GloVe是"先把全局地图画出来再学"。
- 联系:Levy & Goldberg 2014年的论文证明了,Skip-gram + Negative Sampling 本质上等价于对PMI(逐点互信息)矩阵做隐式分解。所以两者在数学本质上是相通的,实际效果上也非常接近,差距更多来自超参调优而非模型本身。
面试加分:在实际项目中两者效果差不多,选择更多取决于工程偏好------GloVe训练时需要先建共现矩阵,内存开销大但可以很好地利用全局统计;Word2Vec内存友好但需要多轮遍历语料。
- ⭐⭐ [高频] 静态词向量(Word2Vec/GloVe)存在什么问题?如何解决多义词问题?
一句话秒答:静态词向量"一词一向量",搞不定多义词------"苹果"在水果和手机两个语境里是同一个向量。
展开来说:
- 核心问题就是上下文无关(context-free):不管"苹果很甜"还是"苹果发布会",word2vec查表出来的向量都是一个,多义词的不同含义被强行平均到了一个点上。
- 其次还有OOV问题------训练时没见过的词直接没有向量(FastText通过子词信息部分缓解了这个问题,但本质还是静态的)。
- 解决多义词的关键思路是让向量随上下文动态变化。ELMo是第一个成功的方案:用双向LSTM给每个词生成上下文相关的向量,同一个"苹果"在不同句子里得到不同表示。再后来BERT更彻底------用Transformer双向编码,每个token的表示都融合了整个句子的信息,多义词问题基本解决。从静态词向量到动态上下文向量,就是从"查字典"进化到"读完整个句子再理解每个词"。
面试加分:如果追问实战中还用不用静态词向量------用的,在轻量级场景(比如召回层初筛、冷启动embedding初始化)静态词向量依然是性价比之王,大模型时代它是"穷人的embedding"。
- ⭐ [高频] 自回归语言模型(Autoregressive LM)与自编码语言模型(Autoencoding LM)的区别?
一句话秒答:自回归从左往右逐词生成,自编码挖空填词双向理解,GPT vs BERT就是这俩路线。
展开来说:
- 自回归LM(AR) :建模 P(xt∣x1,...,xt−1)P(x_t | x_1, ..., x_{t-1})P(xt∣x1,...,xt−1),像写作文一样从左写到右,每个词只能看到前面的词。GPT系列就是这条路。优点是天然适合生成任务(逐token采样就行),缺点是看不到右边的上下文,理解能力打折。
- 自编码LM(AE) :不按顺序生成,而是把输入搞"残"(比如BERT随机mask掉15%的词),然后让模型根据双向上下文 把它们还原出来。建模的是 P(xmasked∣xunmasked)P(x_{masked} | x_{unmasked})P(xmasked∣xunmasked)。优点是双向理解能力强,缺点是mask这个操作只在预训练有、微调和推理时没有,存在预训练-微调不一致问题,而且不擅长做生成。
- 一句话总结:AR像"盲人摸象只能从头摸到尾",AE像"看到全景但要做完形填空"。XLNet试图融合两者------用排列语言模型做自回归但随机排列顺序,间接看到双向信息。
面试加分:到了大模型时代,自回归路线(GPT系列)全面胜出,因为生成能力是刚需,而理解能力可以通过scale up来弥补------这也是为什么BERT路线逐渐式微的根本原因。
- ⭐⭐ [高频] 什么是子词分词(Subword Tokenization)?常见方法有哪些?(BPE、WordPiece、SentencePiece)
一句话秒答:子词分词把词拆成介于字符和完整词之间的片段,解决OOV和词表爆炸问题,BPE是最常用的。
展开来说:
- 核心矛盾:word-level分词词表太大还有OOV,character-level分词又太碎、序列变长、丢失语义。子词分词是折中方案------高频词保持完整(如"the"),低频词拆成有意义的片段(如"unhappiness" → "un" + "happi" + "ness")。
- BPE(Byte Pair Encoding):从字符级出发,反复合并语料中出现频率最高的相邻token对,直到词表达到目标大小。GPT系列用的就是BPE。简单粗暴但效果好。
- WordPiece:和BPE很像,但合并时不是看频率最高,而是看合并后能最大化训练数据的似然(likelihood),贪心选能最大提升语言模型概率的合并对。BERT用的就是WordPiece。
- SentencePiece :Google出的工具库,最大特点是语言无关------它把输入当成raw byte流来处理,不需要预分词(不依赖空格分词),对中文、日文等无空格语言特别友好。它可以内部跑BPE或Unigram算法。LLaMA、T5等模型都用它。
面试加分:如果被追问BPE和WordPiece的实际差异------在大规模语料上两者效果几乎一样,真正的差异在工程实现上。现在大模型圈基本是BPE(通过tiktoken或SentencePiece)一统天下。
二、RNN / LSTM / GRU(5题)
- ⭐⭐ [高频] RNN存在什么问题?为什么RNN会出现梯度消失和梯度爆炸?
一句话秒答:RNN的时序链式结构导致梯度在反向传播时被连乘,乘多了要么爆炸要么消失。
展开来说:
- RNN的隐状态公式是 ht=tanh(Whht−1+Wxxt+b)h_t = \tanh(W_h h_{t-1} + W_x x_t + b)ht=tanh(Whht−1+Wxxt+b),反向传播时梯度要沿时间步链式传递:∂L∂ht=∂L∂hT∏k=tT−1∂hk+1∂hk\frac{\partial L}{\partial h_t} = \frac{\partial L}{\partial h_T} \prod_{k=t}^{T-1} \frac{\partial h_{k+1}}{\partial h_k}∂ht∂L=∂hT∂L∏k=tT−1∂hk∂hk+1。这个连乘项里每一步都包含 WhW_hWh 的转置和 tanh 的导数。
- 梯度消失 :tanh的导数最大值是1(在0点),大部分区域远小于1。连乘 T−tT-tT−t 次后指数级衰减趋近0,距离越远的时间步信号越弱------就像"传话游戏"传了20个人,原始信息早就面目全非了。这导致RNN学不了长距离依赖。
- 梯度爆炸 :如果 WhW_hWh 的最大特征值大于1,连乘后梯度指数级增长,loss直接nan。这个相对好解决------梯度裁剪(gradient clipping) 设个阈值截断就行。但梯度消失没法靠裁剪解决,得从模型结构上动手,这就催生了LSTM和GRU。
面试加分 :实际训练RNN时,梯度爆炸通常先暴露出来(loss突然变nan),加上
clip_grad_norm_(model.parameters(), max_norm=1.0)就能救;但梯度消失是"无声的杀手"------模型不报错,就是效果上不去,这才是更致命的问题。
- ⭐⭐ [高频] LSTM有哪几个门?各自的作用是什么?LSTM如何缓解RNN的梯度消失问题?
一句话秒答:LSTM有遗忘门、输入门、输出门三个门,通过cell state这条"信息高速公路"让梯度可以无衰减地流过长序列。
展开来说:
- 遗忘门(Forget Gate) :ft=σ(Wf[ht−1,xt]+bf)f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)ft=σ(Wf[ht−1,xt]+bf),决定上一步cell state里哪些信息要扔掉。输出0到1之间的值,0="完全忘掉",1="全部保留"。就像整理笔记时划掉不重要的内容。
- 输入门(Input Gate) :it=σ(Wi[ht−1,xt]+bi)i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)it=σ(Wi[ht−1,xt]+bi),配合候选值 C~t=tanh(WC[ht−1,xt]+bC)\tilde{C}t = \tanh(W_C [h{t-1}, x_t] + b_C)C~t=tanh(WC[ht−1,xt]+bC),决定哪些新信息要写入cell state。两者逐元素相乘:Ct=ft⊙Ct−1+it⊙C~tC_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_tCt=ft⊙Ct−1+it⊙C~t。就像在笔记本上新增内容。
- 输出门(Output Gate) :ot=σ(Wo[ht−1,xt]+bo)o_t = \sigma(W_o [h_{t-1}, x_t] + b_o)ot=σ(Wo[ht−1,xt]+bo),决定cell state中哪些信息要暴露到隐状态输出:ht=ot⊙tanh(Ct)h_t = o_t \odot \tanh(C_t)ht=ot⊙tanh(Ct)。就像决定"我记住了很多,但这次只说其中一部分"。
- 为什么缓解梯度消失 :关键在cell state的更新公式 Ct=ft⊙Ct−1+it⊙C~tC_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_tCt=ft⊙Ct−1+it⊙C~t,梯度沿cell state反向传播时,乘的是遗忘门 ftf_tft 而不是固定权重矩阵。当 ftf_tft 接近1时,梯度几乎无损传递------这就像修了一条"高速公路",信息和梯度可以畅通无阻地穿越很多时间步。
面试加分:注意LSTM是"缓解"而非"彻底解决"梯度消失。当序列真的很长(比如几千步),LSTM也会力不从心,这也是后来Transformer用attention直接建立任意位置间连接的动机之一。
- ⭐⭐ [高频] GRU的前向计算过程是怎样的?GRU与LSTM的区别?实际任务中如何选择?
一句话秒答:GRU用重置门和更新门两个门就搞定了LSTM三个门的活儿,参数更少、训练更快,效果基本持平。
展开来说:
- GRU的前向计算就四步:
- 更新门 :zt=σ(Wz[ht−1,xt])z_t = \sigma(W_z [h_{t-1}, x_t])zt=σ(Wz[ht−1,xt]) ------ 决定保留多少旧信息、接受多少新信息(兼任LSTM的遗忘门和输入门的角色)
- 重置门 :rt=σ(Wr[ht−1,xt])r_t = \sigma(W_r [h_{t-1}, x_t])rt=σ(Wr[ht−1,xt]) ------ 决定在生成候选隐状态时忘掉多少历史信息
- 候选隐状态 :h~t=tanh(W[rt⊙ht−1,xt])\tilde{h}t = \tanh(W [r_t \odot h{t-1}, x_t])h~t=tanh(W[rt⊙ht−1,xt]) ------ 用重置门过滤后的旧隐状态来算新的候选值
- 最终隐状态 :ht=(1−zt)⊙ht−1+zt⊙h~th_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_tht=(1−zt)⊙ht−1+zt⊙h~t ------ 更新门做新旧插值
- GRU vs LSTM的区别 :GRU没有单独的cell state,隐状态直接暴露;两个门 vs 三个门,参数量少约1/3;更新门同时控制遗忘和输入,用 (1−zt)(1-z_t)(1−zt) 和 ztz_tzt 做互补------LSTM的遗忘门和输入门是独立的,理论上表达能力更强。
- 选择策略:数据量大、任务复杂(比如长文本、多层堆叠)→ 选LSTM,因为它多一个门意味着更细粒度的控制;数据量小、模型轻量、要快 → 选GRU。实际上很多实验表明两者效果差距在1%以内,选谁不如花时间调学习率。
面试加分:说实话,2026年了这两个都不太会直接用了,但面试考的是你对门控机制的理解。如果追问"那现在用什么",答Transformer + 各种高效注意力变体就行。
- ⭐⭐⭐ [高频] RNN系列模型为什么难以并行化?这个问题后来是如何解决的?
一句话秒答 :因为RNN的 hth_tht 必须等 ht−1h_{t-1}ht−1 算完才能算,时间步之间存在严格的串行依赖。
展开来说:
- RNN的计算图本质上是一条链:h1→h2→h3→...→hTh_1 \to h_2 \to h_3 \to ... \to h_Th1→h2→h3→...→hT,每一步都依赖上一步的输出,就像流水线上后一个工人必须等前一个做完才能开工。这意味着一个长度为 TTT 的序列,至少需要 TTT 个串行计算步,GPU的并行能力完全浪费了。
- 这个问题曾有一些缓解方案:比如在batch维度并行 (不同样本可以同时算)、截断BPTT(把长序列切段分别算),但本质上没解决时间步内的串行依赖。
- 真正的解决方案就是Transformer(2017) :Self-Attention对序列中所有位置的计算是同时进行 的------Attention(Q,K,V)\text{Attention}(Q,K,V)Attention(Q,K,V) 里的矩阵乘法天然可并行,计算复杂度虽然是 O(n2d)O(n^2d)O(n2d),但深度只有 O(1)O(1)O(1)(所有位置一步算完),而RNN是 O(n)O(n)O(n) 的串行深度。这就是Transformer论文标题"Attention Is All You Need"的底气------不用RNN了,并行起飞。
面试加分:补充一句:LSTM的串行瓶颈还体现在训练吞吐上------同样的GPU,Transformer可以把batch开很大利用tensor core,LSTM开再大batch也受限于序列长度的串行步数。这也是为什么大模型时代RNN基本退场的核心工程原因。
- ⭐⭐ [面经] LSTM中各个门为什么使用不同的激活函数(sigmoid vs tanh)?
一句话秒答:sigmoid输出0-1当"开关比例"控制信息流,tanh输出-1到1当"信息本身"提供有正有负的表达。
展开来说:
- LSTM里有两种角色的激活函数:门控信号 用sigmoid,候选值/信息内容用tanh,分工非常明确。
- sigmoid用于三个门 (遗忘门 ftf_tft、输入门 iti_tit、输出门 oto_tot):输出范围 (0,1)(0,1)(0,1),天然适合表示"通过比例"。0=完全关闭,1=完全打开,就像水龙头的开关旋钮。如果换成tanh会出现负值,负值乘以信息内容意味着反转信号,语义上说不通------你不会让"遗忘门"把信息反着记住。
- tanh用于候选cell state C~t\tilde{C}_tC~t 和最终输出 tanh(Ct)\tanh(C_t)tanh(Ct) :输出范围 (−1,1)(-1, 1)(−1,1),既能表示正激活也能表示负激活,增强了模型的表达能力。而且tanh是零中心化的(均值接近0),有助于梯度流动,比sigmoid作为信息变换函数更好------sigmoid不是零中心的,容易导致梯度偏向一个方向更新。
- 本质上就是:sigmoid管"开多大",tanh管"信号是什么",两者配合 σ⊙tanh\sigma \odot \tanhσ⊙tanh 就是"控制信号以多大比例通过"。
面试加分:有些LSTM变体尝试过把门控换成hard sigmoid(分段线性近似)来加速推理,效果基本不掉,说明sigmoid在门控里的具体形状没那么关键,关键是要有0-1的"开关"语义。
三、Seq2Seq与注意力机制(5题)
- ⭐⭐ [高频] Seq2Seq中,编码器如何将变长输入序列转化为固定长度的上下文向量?这样做有什么问题?
一句话秒答:编码器把所有时间步的信息压缩到最后一个隐状态向量里,信息瓶颈问题严重------长句子记不住。
展开来说:
- 经典Seq2Seq的编码器就是一个RNN/LSTM,逐词读入源序列,最后一个时间步的隐状态 hTh_ThT 作为整个句子的"上下文向量" ccc,传给解码器。不管输入是5个词还是50个词,都被压成同一个固定维度的向量(比如512维)。
- 问题很直觉:一个512维的向量能装多少信息?短句子还好,长句子(比如50个词)的早期信息经过层层遗忘门过滤后基本丢得差不多了。这就像让你看一篇长文章,然后只允许你用一句话概括------信息损失是必然的。实验也表明,随着源序列变长,翻译质量急剧下降。
- 有两个缓解办法:一是用双向RNN,让 c=[hT→;h1←]c = [h_T^{\to}; h_1^{\leftarrow}]c=[hT→;h1←] 拼接正反方向的隐状态;二是用最后几个隐状态做平均。但根本解决方案是Attention机制(Bahdanau et al., 2015)------让解码器在每一步动态地"回头看"编码器的所有隐状态,按相关性加权求和,不再依赖单一固定向量。
面试加分:这个"信息瓶颈"的思路非常重要------它不仅催生了Attention,还启发了后来很多架构设计:比如U-Net的skip connection、ResNet的残差连接,本质上都是在解决"信息经过多层/多步传递后衰减"的问题。
- ⭐⭐ [高频] Attention机制的本质思想是什么?Query、Key、Value分别代表什么?softmax(QK^T/sqrt(d))V 是怎么来的?
一句话秒答:Attention本质是"带权查找"------用Query去和所有Key算相关度,再按这个相关度对Value做加权求和。
展开来说:
- 你可以把Attention想象成"去图书馆查资料":Query 是你脑子里的问题("我想找什么"),Key 是每本书封面上的关键词("这本书讲什么"),Value是书的实际内容("这本书的干货")。你拿问题和每本书的关键词比对相关度,最相关的书多看几眼,不相关的一带而过------最后你脑子里留下的知识就是按相关度加权的内容。
- 公式推导过程:
- 算相关度 :QQQ 和 KKK 做点积 QKTQK^TQKT,得到一个 n×nn \times nn×n 的分数矩阵,每个元素表示query iii 和key jjj 的"匹配程度"。
- 为什么要除以 dk\sqrt{d_k}dk :当 dkd_kdk 很大时,点积的方差会随维度增大而增大(方差约为 dkd_kdk),导致softmax进入饱和区(梯度趋近于0)。除以 dk\sqrt{d_k}dk 把方差拉回到1,让softmax输出的分布不至于太"尖锐"。
- softmax归一化 :softmax(QKTdk)\text{softmax}(\frac{QK^T}{\sqrt{d_k}})softmax(dk QKT) 把分数变成0-1的概率分布,保证权重和为1。
- 加权求和 :概率矩阵乘以 VVV,每个query位置得到的输出是所有value按注意力权重的加权组合。
面试加分 :面试时把"为什么除以根号dk"讲清楚是加分项------假设Q和K的每个元素独立且均值为0方差为1,那么点积 q⋅k=∑i=1dkqikiq \cdot k = \sum_{i=1}^{d_k} q_i k_iq⋅k=∑i=1dkqiki 的方差是 dkd_kdk,除以 dk\sqrt{d_k}dk 后方差变回1。
- ⭐⭐ [高频] 什么是Self-Attention?它与普通Attention(Cross-Attention)有何区别?
一句话秒答:Self-Attention的Q、K、V都来自同一个序列,是"自己关注自己";Cross-Attention的Q来自一个序列,K、V来自另一个序列。
展开来说:
- Self-Attention :输入一个序列,Q、K、V全部由同一组token经过不同的线性变换 WQ,WK,WVW^Q, W^K, W^VWQ,WK,WV 得到。每个token和序列里所有token(包括自己)算注意力权重。就像一群人开会,每个人环顾四周看看跟谁最相关,然后综合大家的信息更新自己的理解。
- Cross-Attention(普通Attention):Q来自一个序列(如解码器),K和V来自另一个序列(如编码器)。就像翻译时,译者(decoder)带着当前要翻的问题(query),去"查阅"原文(encoder的key和value)。
- 关键区别总结:Self-Attention建模的是序列内部各位置的关系,Cross-Attention建模的是两个序列之间的对齐关系。Self-Attention是Transformer最重要的创新,它让模型无论token间距多远都能直接交互,彻底解决了RNN的长距离依赖问题。
面试加分:在实际大模型架构中,纯decoder模型(如GPT)只有Masked Self-Attention;encoder-decoder模型(如T5)才同时有Self-Attention和Cross-Attention。如果面试官追问"那多模态模型里图文怎么交互",答案也是Cross-Attention------文本token做query,图像patch做key/value。
- ⭐⭐ [高频] 什么是Beam Search(束搜索)?Beam Width如何选择?Length Penalty为什么需要?
一句话秒答:Beam Search就是每步保留top-k个候选序列,在贪心和穷举之间取了个平衡。
展开来说:
- 贪心搜索每步只选概率最高的一个词,容易"一步走错步步错"。穷举搜索要遍历所有可能序列,词表大小 VVV、序列长度 TTT,复杂度 O(VT)O(V^T)O(VT),根本不现实。Beam Search就像你去超市试吃,不可能每个摊位都尝(穷举),也不能只尝第一个就走(贪心),而是同时端着k个小碟子(beam width=k),每步尝完就淘汰最差的,只保留最好的k个继续往下尝。
- Beam Width怎么选 :一般机器翻译用410,对话生成用15。Width越大搜索越充分但越慢,线性关系------beam=10大约是beam=1的10倍计算量。实践中beam=4~5是性价比甜蜜点,再大提升就很小了。
- 为什么要Length Penalty :因为序列概率是每个词概率的连乘(取log后是累加),序列越长总分越低。不加惩罚的话模型会偏爱短句子,翻译出来就是"半截话"。常见做法是把总log概率除以 lengthα\text{length}^\alphalengthα,α\alphaα一般取0.6~1.0。
面试加分:实际项目中beam search生成容易出现重复片段,可以加n-gram blocking(禁止生成已出现的n-gram),效果比单纯调beam width好很多。
- ⭐ [高频] 什么是Teacher Forcing?Teacher Forcing的优缺点是什么?训练和推理阶段的差异(Exposure Bias)如何理解?
一句话秒答:Teacher Forcing就是训练时给解码器喂真实标签而不是自己上一步的输出,快但会导致训推不一致。
展开来说:
- 打个比方:Teacher Forcing就像学开车时教练随时帮你扶方向盘。你每一步都是在"正确轨道"上练的,所以收敛特别快,训练也稳定。但问题是考试的时候(推理阶段)教练不在了,你一旦方向偏了,后面就全歪了------因为你从来没练过"自己纠偏"。
- 优点:训练收敛快、梯度稳定、并行效率高(每步输入已知,不用等上一步输出)。
- 缺点 :造成 Exposure Bias(曝光偏差)------训练时模型只见过ground truth上下文,推理时却得面对自己可能出错的输出,分布不匹配。错误会像滚雪球一样累积放大。
- 怎么缓解:Scheduled Sampling是经典方案,训练早期100%用teacher forcing,后期逐渐增加用模型自身输出的比例,相当于"教练慢慢松手"。另外强化学习(如REINFORCE/PPO)直接优化序列级指标也能绕开这个问题。
面试加分:GPT系列自回归模型天然就是teacher forcing训练的,但因为预训练数据量够大、序列够长,exposure bias被"暴力数据"给稀释了,这也是为什么大模型时代大家不太讨论这个问题了。
四、BERT与预训练语言模型(6题)
- ⭐⭐⭐ [字节/阿里] BERT的预训练任务有哪两个?分别是怎么做的?MLM中15%/80%/10%/10%的设计原因?
一句话秒答:MLM随机遮住15%的词让模型猜,NSP判断两句话是否相邻,两个任务合起来让BERT既懂词义又懂句间关系。
展开来说:
- MLM(Masked Language Model) :随机选15%的token进行处理,但不是全替换成
[MASK],而是三档操作------80%换成[MASK]、10%换成随机词、10%保持不变。为什么这么设计?
- 如果100%都换成
[MASK],模型只学会了"看到[MASK]才预测",微调时又没有[MASK],预训练和微调分布不一致- 10%随机替换是"打疫苗",逼模型对每个位置都保持警觉,不能光盯着
[MASK]- 10%保持不变让模型学会在正常文本上也做语义理解,弥合预训练和微调的gap
- 为什么是15%而不是更多? 遮太多,上下文信息太少模型猜不准;遮太少,训练效率低。15%是实验调出来的平衡点
- NSP(Next Sentence Prediction):50%正样本(真实下一句)+50%负样本(随机拼的句子),二分类任务。但后来RoBERTa证明NSP没啥用甚至有害,因为负样本太简单了(跨文档拼接一眼就能识别)
面试加分:如果面试官追问"为什么不用其他比例",可以说SpanBERT把mask策略改成了连续span遮盖、ERNIE用了实体级和短语级mask,效果都比原版好,说明mask的粒度和策略比具体比例更重要。
- ⭐⭐ [高频] BERT如何进行Fine-tuning?不同下游任务(分类、NER、QA)如何适配?
一句话秒答:BERT微调就是在预训练模型上面接一个轻量任务头,不同任务换不同的头就行。
展开来说:
- 文本分类(情感分析、主题分类) :取
[CLS]对应的输出向量,接一个全连接层+softmax,完事。[CLS]相当于整句话的"摘要表示"。- 序列标注(NER):每个token的输出向量都过一个分类头,预测BIO标签。更好的做法是后面再接一个CRF层,因为标签之间有约束关系(比如I-PER前面不能是B-LOC)。
- 阅读理解/QA :输入是
[CLS] Question [SEP] Passage [SEP],模型在Passage的每个token上预测两个概率------"是答案起始位置"和"是答案结束位置",取概率最高的span就是答案。- 句对任务(NLI、匹配) :两个句子拼起来输入,用
[CLS]做分类(蕴含/矛盾/中立)。- 微调时一般学习率很小(2e-5到5e-5),epoch 2-4就够了,别训太久容易过拟合到下游小数据上。
面试加分:实际做项目时,在小数据场景下我会先冻结底层6-8层只训练上面几层,等loss稳了再全部解冻,这种layer-wise的学习率衰减策略能明显减少过拟合。
- ⭐⭐⭐ [高频] GPT和BERT有什么不同?(单向vs双向、自回归vs自编码、生成vs理解)
一句话秒答:GPT是单向自回归、天生会生成;BERT是双向自编码、天生会理解,两者架构哲学完全不同。
展开来说:
- 单向 vs 双向:GPT只能从左往右看(因为要一个词一个词地生成,不能偷看后面),BERT能同时看左右两边。就像GPT是"蒙着右眼读书",BERT是"两只眼睛都睁着做完形填空"。
- 自回归 vs 自编码 :GPT的训练目标是预测下一个词 P(xt∣x<t)P(x_t|x_{<t})P(xt∣x<t),天然适合生成任务;BERT的训练目标是根据上下文还原被遮住的词 P(xt∣x\t)P(x_t|x_{\backslash t})P(xt∣x\t),天然适合理解任务。
- 架构差异 :GPT用的是Transformer Decoder (带causal mask),BERT用的是Transformer Encoder(无mask,全连接注意力)。
- 谁赢了:在ChatGPT之前,BERT路线在NLU任务上吊打GPT。但GPT-3发现模型够大后自回归也能做理解,GPT-4之后自回归路线一统天下。核心原因是生成能力是理解能力的超集。
面试加分:现在面试如果被问到这题,可以顺势聊一下"为什么最终是GPT路线胜出"------因为自回归的生成能力天然支持任意任务的统一范式,而BERT的完形填空范式很难扩展到开放生成。
- ⭐⭐⭐ [面经] RoBERTa相比BERT做了哪些改进?(去掉NSP、动态Mask、更多数据、更大batch)
一句话秒答:RoBERTa就是"把BERT训练调到最佳状态"------去NSP、动态Mask、更大数据、更大batch、更久训练。
展开来说:
- 去掉NSP任务:实验发现NSP对下游任务没啥帮助甚至有负面影响,删掉后指标反而涨了。原因是NSP的负样本(跨文档拼接)太简单,模型靠主题差异就能判断,根本没学到真正的句间逻辑。
- 静态Mask → 动态Mask:BERT预处理时就把mask位置定死了,整个训练过程同一个样本永远遮同样的位置。RoBERTa每个epoch重新随机mask,相当于数据增强10倍。
- 更多数据:BERT用了16GB语料,RoBERTa直接堆到160GB(加了CC-News、OpenWebText、Stories等)。
- 更大Batch Size:BERT用256,RoBERTa用到了8K。大batch让梯度估计更准,配合线性warmup效果很好。
- 训练更久:BERT训1M步,RoBERTa训500K步但batch更大,等效看到更多token。
面试加分:RoBERTa最大的启示不是某个具体改进,而是告诉我们------很多时候"把已有方法训好"比"发明新方法"更重要,这个思路在大模型时代同样适用(Chinchilla的scaling law也是这个逻辑)。
- ⭐⭐ [高频] BERT为什么使用WordPiece分词?BERT的位置编码与Transformer的正弦位置编码有什么区别?
一句话秒答:WordPiece在词级和字符级之间取平衡解决OOV,BERT的位置编码是可学习的而非固定正弦。
展开来说:
- 为什么用WordPiece:纯word-level分词词表太大(几十万),低频词学不好,OOV问题严重;纯char-level分词序列太长,语义稀疏。WordPiece是折中方案:高频词保持完整(如"the"),低频词拆成子词片段。词表压缩到30K左右,既覆盖率高又不会太稀疏。原理上和BPE类似,区别是BPE按频率合并,WordPiece按似然来选择合并对。
- 位置编码的区别 :
- 原始Transformer用固定的正弦/余弦函数:PE(pos,2i)=sin(pos/100002i/d)PE_{(pos,2i)}=\sin(pos/10000^{2i/d})PE(pos,2i)=sin(pos/100002i/d),不可学习,但理论上可以外推到更长序列
- BERT用可学习的位置嵌入(Learned Positional Embedding):就是一个 512×768512 \times 768512×768 的参数矩阵,每个位置对应一个可训练向量。好处是更灵活;缺点是最大长度固定为512,超过就得想办法扩展
面试加分:现在大模型基本都用RoPE(旋转位置编码),既可学习又能外推,算是吸收了两者的优点。如果面试官追问位置编码演进,可以从"绝对→相对→旋转"这条线聊下去。
- ⭐⭐⭐ [高频] ALBERT使用了哪些方法来压缩模型?(低秩因式分解、跨层参数共享)
一句话秒答:ALBERT靠两招瘦身------词嵌入做低秩分解、所有Transformer层共享参数,参数量砍到BERT的1/18。
展开来说:
- 词嵌入因式分解(Factorized Embedding) :BERT的词嵌入矩阵是 V×HV \times HV×H(30K × 768),很大。ALBERT把它拆成两步:先映射到低维 V×EV \times EV×E(30K × 128),再投影到隐藏层 E×HE \times HE×H(128 × 768)。参数量从约23M降到约3.9M,压了近6倍。道理很简单:WordPiece词表里大部分token用不着768维那么高维的表示,128维就够了。
- 跨层参数共享(Cross-layer Parameter Sharing):12层Transformer共用同一套参数(attention + FFN全共享),相当于同一层"循环使用"12次。参数量直接除以12。虽然听起来很暴力,但实验发现性能只掉了一点点。
- 额外改进------SOP替代NSP:ALBERT把NSP换成了Sentence Order Prediction(判断两句话顺序是否对调),比NSP更难也更有用,因为SOP逼模型关注句间逻辑连贯性而不是主题差异。
- 代价:参数少了但推理速度没变快(因为计算量不变,该算的矩阵乘法一个没少),甚至因为共享参数收敛慢,训练时间反而更长。
面试加分:面试时别忘了提一句"ALBERT参数少但推理不快",很多人搞混参数量和计算量,说清这个区别会加分。真要加速推理得用蒸馏、量化或剪枝。
五、文本分类与序列标注(3题)
- ⭐⭐ [高频] TextCNN进行文本分类的过程是怎样的?TextCNN的局限性是什么?
一句话秒答:TextCNN用多种宽度的卷积核捕捉不同长度的n-gram特征,接max-pooling后拼起来做分类,简单高效但捕捉不了长距离依赖。
展开来说:
- 整体流程 (四步走):
- Embedding层 :每个词映射成ddd维向量,整个文本变成 n×dn \times dn×d 的矩阵
- 卷积层 :用多种高度的卷积核(通常3/4/5,对应3-gram/4-gram/5-gram)在文本上滑动,卷积核宽度等于ddd(覆盖整个词向量维度),所以是"一维卷积"
- 1-Max Pooling:每个卷积核的输出取最大值,不管句子多长最终都变成一个标量
- 全连接+Softmax:把所有卷积核的max值拼成一个向量,过全连接层做分类
- 为什么管用:不同尺寸的卷积核就像不同大小的"放大镜",3-gram抓局部短语(如"not good"),5-gram抓更长的模式。max-pooling保证不管关键特征出现在句子哪个位置都能抓到。
- 局限性 :卷积核是局部窗口,无法建模长距离依赖;max-pooling丢失了位置信息和词序信息;对长文本分类效果明显不如BERT等全局注意力模型。
面试加分:在资源受限、延迟敏感的线上场景,TextCNN仍然很有用------推理速度比BERT快几十倍,小数据上加上预训练词向量效果也不差,是"又快又够用"的工业级baseline。
- ⭐⭐ [高频] 什么是BiLSTM-CRF?为什么NER任务中DNN后面还要加CRF层?CRF层能学到什么?
一句话秒答:BiLSTM负责提取每个字的上下文特征,CRF负责学标签间的转移约束,两个搭配才能输出合法的标注序列。
展开来说:
- 为什么BiLSTM不够:BiLSTM给每个token独立打分,但它不管标签之间的约束。比如NER里"I-PER"前面不能跟"B-LOC"。如果只用BiLSTM+softmax做独立分类,很可能输出不合法序列。
- CRF能学到什么 :CRF维护一个 转移分数矩阵 TTT(大小为 k×kk \times kk×k,kkk是标签数),TijT_{ij}Tij 表示从标签iii转移到标签jjj的"合理程度"。训练完之后,TB-PER→I-PERT_{\text{B-PER} \to \text{I-PER}}TB-PER→I-PER 的分数会很高,TB-PER→I-LOCT_{\text{B-PER} \to \text{I-LOC}}TB-PER→I-LOC 的分数会很低。就像给输出序列加了一套"语法规则"。
- 联合打分:最终序列的得分 = BiLSTM的发射分数(每个位置的标签得分) + CRF的转移分数(相邻标签的兼容得分)。用Viterbi算法在所有可能标注序列中找到总分最高的那个。
- 训练目标 :最大化正确标注序列的条件概率 P(y∣x)=exp(Score(x,y))∑y′exp(Score(x,y′))P(y|x) = \frac{\exp(\text{Score}(x,y))}{\sum_{y'}\exp(\text{Score}(x,y'))}P(y∣x)=∑y′exp(Score(x,y′))exp(Score(x,y)),分母的归一化用前向算法高效计算。
面试加分:实测在NER任务上,加CRF层一般能提1-3个F1点。但如果用了BERT这种足够强的编码器,CRF的提升就不太明显了,所以现在很多BERT-NER方案直接接softmax也够用。
- ⭐⭐ [高频] CRF、HMM、MEMM三者的区别和联系是什么?
一句话秒答:HMM是生成式+两个独立假设,MEMM改成判别式但有标签偏置,CRF用全局归一化彻底解决了这些问题。
展开来说:
- HMM(隐马尔可夫模型) :生成模型,建模联合概率 P(X,Y)=∏P(yt∣yt−1)⋅P(xt∣yt)P(X,Y)=\prod P(y_t|y_{t-1}) \cdot P(x_t|y_t)P(X,Y)=∏P(yt∣yt−1)⋅P(xt∣yt)。两个假设:齐次马尔可夫假设 + 观测独立假设。最大问题:观测独立假设太强了,现实中一个词的标签往往跟周围的词都有关系。
- MEMM(最大熵马尔可夫模型) :判别模型,建模 P(Y∣X)=∏P(yt∣yt−1,X)P(Y|X) = \prod P(y_t|y_{t-1}, X)P(Y∣X)=∏P(yt∣yt−1,X),可以引入丰富特征。新问题:标签偏置(Label Bias)------因为每一步都做局部归一化,转移出度少的状态会被"偏爱"。
- CRF(条件随机场) :判别模型,但用全局归一化 :P(Y∣X)=1Z(X)exp(∑特征函数)P(Y|X) = \frac{1}{Z(X)} \exp(\sum \text{特征函数})P(Y∣X)=Z(X)1exp(∑特征函数)。彻底解决了标签偏置问题,是序列标注任务的"终极经典"。
- 一张表总结:HMM:生成式→局部归一化→特征受限;MEMM:判别式→局部归一化→有标签偏置;CRF:判别式→全局归一化→无标签偏置。
面试加分:面试时画一个"生成→判别、局部→全局"的2x2矩阵,一下就能让面试官看懂三者的演进关系,非常清晰。
六、文本匹配、信息抽取与综合(3题)
- ⭐⭐ [高频] 文本匹配的两大类方法(基于表示 vs 基于交互)分别是什么?什么是孪生网络(Siamese Network)?
一句话秒答:基于表示的方法"先编码后比较"、基于交互的方法"边看边比较",孪生网络是表示方法的典型代表。
展开来说:
- 基于表示(Representation-based):两个文本各自独立编码成向量,最后算相似度(余弦/点积/MLP)。优点:文本向量可以离线预计算、ANN索引,检索飞快。缺点:两个文本编码时互相看不到,精度有上限。代表:DSSM、Sentence-BERT、SimCSE。
- 基于交互(Interaction-based):两个文本早期就拼接在一起做交叉注意力,让token级别充分交互。优点:信息交互充分,精度高。缺点:每对文本都得过一遍模型,不能离线缓存。代表:ESIM、BERT Sentence Pair。
- 孪生网络(Siamese Network) :两个共享权重的编码器,分别编码两个输入,然后比较输出向量。"孪生"就是双胞胎共享一套参数,保证同样的文本编码出同样的向量。训练时用对比损失或三元组损失:拉近正例对、推远负例对。
面试加分:工业界常用"双塔(表示)做召回 + 交互模型做精排"的两级流水线,两种范式各取所长而不是二选一。
- ⭐⭐⭐ [高频] 什么是关系抽取?pipeline式与联合抽取各有什么优缺点?
一句话秒答:Pipeline是先抽实体再抽关系,分两步走;联合抽取一步到位同时搞定实体和关系,减少了误差累积。
展开来说:
- 关系抽取是什么:从文本中抽出"实体-关系-实体"的三元组。比如从"马云创办了阿里巴巴"中抽出(马云, 创办, 阿里巴巴)。
- Pipeline式(流水线):第一步NER抽实体 → 第二步关系分类判断实体对之间的关系。优点:模块独立优化,灵活性高。缺点:误差累积------NER错了后面必错;两个模块信息不共享。
- 联合抽取(Joint Extraction):一个模型同时识别实体和关系。常见做法:共享编码器+分别接NER头和关系头;序列标注式(如TPLinker、CasRel);生成式(直接让模型生成三元组文本)。优点:信息共享,避免误差累积。缺点:设计复杂,关系重叠处理较难。
面试加分:关系重叠问题(SEO/EPO/SOO三种重叠类型)是联合抽取的核心难点,CasRel用"先抽subject,再对每个subject抽object和relation"的cascade思路很好地解决了这个问题。
- ⭐⭐ [高频] 什么是TF-IDF和BM25?两者的区别和联系?BM25公式中各参数含义?
一句话秒答:TF-IDF和BM25都是"词频x逆文档频率"的思路,但BM25对词频做了饱和处理、还考虑了文档长度,是TF-IDF的升级版。
展开来说:
- TF-IDF:核心思想:一个词在当前文档出现越多(TF高)、在整个语料库出现越少(IDF高),就越能代表这篇文档。问题:TF是线性增长的,一个词出现100次和出现10次,TF差10倍,但实际区分度没那么大。
- BM25(Best Matching 25) :公式:BM25(t,d)=IDF(t)⋅ft,d⋅(k1+1)ft,d+k1⋅(1−b+b⋅∣d∣avgdl)\text{BM25}(t,d) = \text{IDF}(t) \cdot \frac{f_{t,d} \cdot (k_1 + 1)}{f_{t,d} + k_1 \cdot (1 - b + b \cdot \frac{|d|}{avgdl})}BM25(t,d)=IDF(t)⋅ft,d+k1⋅(1−b+b⋅avgdl∣d∣)ft,d⋅(k1+1)
- k1k_1k1(一般1.2~2.0):词频饱和参数,控制TF的上限------k1k_1k1越小,词频饱和得越快
- bbb(一般0.75):文档长度归一化参数,b=0b=0b=0不考虑长度,b=1b=1b=1完全按长度归一化。长文档天然词频高,bbb就是用来"扣掉"长度优势的
- avgdlavgdlavgdl:语料库平均文档长度
- 联系 :当k1→∞k_1 \to \inftyk1→∞且b=0b=0b=0时,BM25退化为类似TF-IDF的形式。BM25是概率检索模型推导出来的,理论基础更扎实。
面试加分:在RAG系统中,BM25作为稀疏检索和dense embedding做混合检索(hybrid search),互补效果很好------BM25擅长精确关键词匹配,dense擅长语义相似,两个分数加权融合(如RRF排序)是当前工业界主流方案。