想象一家跨国餐厅:顾客只讲中文,厨师只懂英文。从前,店里贴着一张“固定对照表”,中文写“鱼香肉丝”,英文就照抄“Fish-flavored shredded pork“。菜单上新个菜,对照表就失灵;句子一长,更是鸡同鸭讲。直到店里请来一位”理解式翻译官“——她通读中文菜单,把每道菜的食材、做法、搭配关系都吃透,再为厨师写出一份全新的英文菜单。她怎么读?读的时候把每个词的位置、上下文关系用便利贴记下来;怎么写?写的时候按顺序逐词输出,每写一个词都回头翻看便利贴;怎么能保证写得好?她会同时试几种写法,挑最顺口的一句;最后怎么知道好不好?顾客对照标准菜单打分。这套”翻译流水线“,就是 Transformer 机器翻译模型的生动写照——它正是现代大语言模型的底层引擎,也是当前最主流的机器翻译实现方式。读完这篇文章,你会彻底搞懂翻译模型是如何”读进来、写出去”的。

岗位关联

掌握 Transformer 翻译模型,等于拿到理解 ChatGPT 等大语言模型的第一把钥匙:编码器、注意力、束搜索、BLEU 这些概念,是 NLP 工程师面试与实战绕不开的基石。

目录
  1. 可视化演示
  2. 翻译任务概览:从“词表对照”到“理解式翻译”
  3. 编码器结构:通读菜单的接待员
  4. 解码器结构:边写边回看的出单员
  5. 注意力机制:译员“说哪看哪”的便利贴
  6. 束搜索解码:同时试菜,选出最顺口的表达
  7. BLEU评估:顾客对照标准答案打分
  8. 训练与展望:教出好译员的“师傅带徒弟”
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示Transformer机器翻的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Transformer机器翻:Tran Transformer翻译模型 编码器结构与自注意力机制 核心机制可视化 Transformer机器翻整体架构与关键组件

翻译任务概览:从“词表对照”到“理解式翻译”

回到那家跨国餐厅。最早的“固定对照表”相当于早期机器翻译的规则翻译——语言学家手工编写转换规则,把源语言逐条映射成目标语言。这种方案脆弱得像一张没有余量的菜单:遇到“麻婆豆腐要中辣不要葱”这种组合句,规则就瞬间崩盘。后来餐厅改用“点菜统计”——收集大量双语菜单,用统计规律猜测翻译,这就是统计机器翻译,它比规则灵活,但仍依赖繁琐的特征工程。

直到“理解式翻译官”登场,她不再背词表,而是把整句读进脑海,理解每个词在语境中的角色后再整体写出译文。这个思路对应神经机器翻译,其基石是 Seq2Seq 架构:一个网络负责“读”(编码器),把源句压缩成一个语义表示;另一个网络负责“写”(解码器),逐词生成译文。而 Transformer 的突破在于:它抛弃了 RNN 的循环结构,用“自注意力”让每个词直接与全句所有词互动,训练更快、长句处理更强。翻译官从“顺着菜单一行行读”升级为“一眼扫完整个菜单、同时看清所有搭配”。

数学上,翻译问题可以写成“已知源句 x,最大化译文 y 的概率”:

理解式翻译官的一切本领——读、记、写、挑、评——本质上都是在逼近这个条件概率最大化的目标。这就是机器翻译的“总任务书”。

P(y∣x)=∏t=1TP(yt∣y<t,x)\displaystyle P(y|x) = \prod_{t=1}^{T} P(y_t | y_{<t}, x)
这是条件概率的链式法则:整句话的翻译概率,等于每个词依次被生成的概率相乘。
  1. 条件概率含义P(y|x) 读作“在源句 x 已知的条件下,译文 y 出现的概率”,翻译就是要找一个让这个概率最大的 y。
    P(y∣x)\displaystyle P(y|x)
  2. 连乘操作Π 是连乘符号,表示从第一个词 t=1 一直乘到最后一个词 t=T,把所有词的概率累乘起来。
    ∏t=1T\displaystyle \prod_{t=1}^{T}
  3. 自回归依赖y_{<t} 表示这个词之前已生成的所有词。生成第 t 个词时,既要“回头看”自己已写出的词,也要“照着”源句 x 来写。
    P(yt∣y<t,x)\displaystyle P(y_t | y_{<t}, x)

编码器结构:通读菜单的接待员

接待员的第一件事,是把顾客的中文菜名逐个转换成她能“思考”的格式。每个词先经过输入嵌入,被映射成一个稠密向量——这相当于在菜单上给每道菜贴一个独特的二维码,机器只认这个码。但二维码不含位置信息,“红烧肉”和“肉红烧”码一样,意思却不同。于是需要位置编码,好比在每道菜旁边写上序号:“1号菜、2号菜……”。

位置编码的巧妙之处在于,它不是简单地写一个数字,而是用一组正弦波函数生成。为什么用正弦波?因为不同频率的正弦波组合,既能区分不同位置,又能让模型自然感知“相邻位置”的相似性,就像门牌号既能定位又能推断邻里远近:

有了带序号的词向量,接下来就是接待员的核心动作——自注意力层:每个词都向全句其他词“发问”,看谁和自己的语义关联最强,并把关联紧密的词的信息吸收进来。这相当于接待员看到“红烧”,立刻联想到“肉”和“酱汁”,在脑中形成语境。最后经过前馈网络做一次逐位加工,一层层堆叠后,接待员就产出了整句的深度语义表示,留给后面的出单员使用。

PE(pos,2i)=sin⁡(pos100002i/dmodel)\displaystyle PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i / d_{model}}}\right)
这是位置编码的偶数维公式:pos 是词的位置,i 是维度下标,d 是向量维度。
  1. 位置编号pos 表示词在句子里的位置下标,从 0 开始数,第一个词 pos=0,第二个 pos=1。
    PE(pos,2i)\displaystyle PE_{(pos, 2i)}
  2. 维度拆分2i 表示只取偶数维度下标,奇数维度用余弦函数。每个词的向量由一半正弦、一半余弦拼接而成。
    sin⁡(pos100002i/dmodel)\displaystyle \sin\left(\frac{pos}{10000^{2i / d_{model}}}\right)
  3. 波长变化分母里的 10000^{2i/d} 让 i 越大、波长越长——低维负责区分邻近位置,高维负责表达长距离关系,最后与词向量相加得到带序号的表示。
    100002i/dmodel\displaystyle 10000^{2i / d_{model}}

解码器结构:边写边回看的出单员

出单员的工作是“按顺序写英文菜单”,但他有个重要规矩:不能偷看未来的菜名。这对应解码器的掩码自注意力——生成第 3 个词时,只允许看前 2 个已经写出的词,未来的词全部遮住。为什么?因为翻译是逐词生成的,如果允许看未来,模型就会“作弊”,推理时又看不到未来,训练和推理就脱节了。这就好比出单员写菜单时,后面还没想好的菜不能提前写进脑海。

写完一个词后,出单员要做一件关键动作:交叉注意力——翻看接待员的便利贴。在交叉注意力层,解码器的每个词会拿着“查询”去编码器的输出中检索相关信息。比如写 “love“ 时,它查询到源句”爱“和”猫“的语义关联,从而确认动作的对象。交叉注意力让”写“和”读”之间建立了桥梁,这是 Transformer 翻译模型中最核心的信息通道。

逐词生成的过程,就是一个循环:预测下一个词 → 把它加入已生成序列 → 再预测下一个,直到输出结束符。每轮生成都依赖两部分输入:已生成的前置词(经过掩码自注意力),以及编码器输出的源句语义(经过交叉注意力)。出单员就这样一个词一个词地“挤”出整个译文,速度不快但步步为营。这就像写英文菜单:先写主菜名,再写配料,再写做法,写完一个回头看一眼便利贴,确认没写偏,才继续下一个。

注意力机制:译员“说哪看哪”的便利贴

注意力机制是整个 Transformer 的灵魂,它回答了一个问题:写某个英文词时,模型到底该关注源句的哪些部分?在餐厅比喻里,便利贴上写着每道菜和周围菜的关系;在模型里,这个机制被形式化为 Q、K、V 三个角色——查询(Query)、键(Key) 和 值(Value)。

可以把注意力理解成“在便利贴墙上找信息”:Q 是你手里的问题(“我要写下一个词,该参考什么?”),K 是每张便利贴的标题(“这张贴是关于什么食材的?”),V 是便利贴上的具体内容(“食材的具体做法是什么?”)。模型先让 Q 和所有 K 做点积,算出“这个问题和每张贴的匹配度”,再用 softmax 归一化成权重,最后用权重对所有 V 加权求和——注意力有多集中在某张贴,就取多少那张贴的内容。公式如下:

单靠一组 Q/K/V,相当于只有一个便利贴视角。多头注意力则让模型同时开多个“视角”——有的头关注语法关系,有的头关注语义指代,有的头关注位置远近。就像多位助理同时从不同角度读菜单,最后把意见汇总,让理解更全面。正是这种“多视角并行查询”的机制,让 Transformer 翻译长句时比传统模型稳健得多。

Attention(Q,K,V)=softmax(QK⊤dk)V\displaystyle \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right) V
缩放点积注意力:用 Q 和 K 计算相似度,除以维度开方防止数值过大,softmax 归一化后加权提取 V。
  1. 相似度打分把 Q 与 K 做矩阵乘法(点积),得到所有“问题-便签”配对的相关性得分。
    QK⊤\displaystyle QK^{\top}
  2. 缩放因子除以 √d_k(键向量的维度开方),防止点积结果太大导致 softmax 输出极端的 0 或 1,让梯度更稳定。
    QK⊤dk\displaystyle \frac{QK^{\top}}{\sqrt{d_k}}
  3. 归一化权重softmax 将得分变成 0 到 1 之间的概率分布,所有位置权重之和为 1。
    softmax(QK⊤dk)\displaystyle \text{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)
  4. 加权求和用权重对 V 加权求和,权重越大的位置,其内容对当前输出贡献越大。
    softmax(QK⊤dk)V\displaystyle \text{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right) V

束搜索解码:同时试菜,选出最顺口的表达

翻译官写完译文草稿后,还有个关键抉择:如果每个词都有多种候选表达,该选哪条路走到底? 最朴素的方案是贪心解码——每步只挑概率最高的那个词,一条路走到黑。这就像点菜时只看眼前最贵的那道菜,不管后面搭配是否合理。贪心的问题在于“局部最优不等于全局最优”:第一步选了概率高的 “I“,后面可能把整句带偏;而概率略低的 ”I'll” 也许能引出更通顺的后文。

束搜索(Beam Search) 则聪明得多:它每一步同时保留 K 条概率最高的候选路径(K 称为束宽),像同时试吃几道候选菜,保留最顺口的几份继续往下试。K=1 时束搜索退化为贪心;K 越大,搜索空间越大,效果越好但计算越贵。实际翻译中 K 通常取 4~8。评分时,每条路径的分数是各词对数概率之和,但直接相加会让长句吃亏(概率连乘后数值越来越小),所以还要做长度归一化:

束搜索就像一位细心的传菜主管:不急于定稿,而是手里同时端着几盘候选表达,边走边尝,最后端出整体最顺口的那一道。这个“少而精”的思路,让翻译质量在计算代价可控的前提下显著提升。

score(y)=1∣y∣α∑t=1∣y∣log⁡P(yt∣y<t,x)\displaystyle \text{score}(y) = \frac{1}{|y|^{\alpha}} \sum_{t=1}^{|y|} \log P(y_t | y_{<t}, x)
束搜索的评分公式:把所有词的对数概率求和,再除以长度 α 次方,防止模型偏爱短句。
  1. 对数概率累加把每个词的 log P 加起来,连乘变连加,避免小数下溢,也便于比较。
    ∑t=1∣y∣log⁡P(yt∣y<t,x)\displaystyle \sum_{t=1}^{|y|} \log P(y_t | y_{<t}, x)
  2. 长度惩罚除以 |y| 的 α 次方,|y| 是句子长度。α 是超参数,通常取 0.6~1.0,值越大越偏向短句。
    1∣y∣α\displaystyle \frac{1}{|y|^{\alpha}}
  3. 比较排序分数越高的候选路径越优,束搜索每步保留前 K 名继续扩展,直到所有候选都输出结束符。
    score(y)=1∣y∣α∑t=1∣y∣log⁡P(yt∣y<t,x)\displaystyle \text{score}(y) = \frac{1}{|y|^{\alpha}} \sum_{t=1}^{|y|} \log P(y_t | y_{<t}, x)

BLEU评估:顾客对照标准答案打分

译文生成之后,怎么知道翻得好不好?最直接的办法是请翻译专家人工打分,但成本太高。BLEU(Bilingual Evaluation Understudy) 提供了一种自动化评分法:拿模型译文和一份“标准答案”(参考译文)对照,看两者在 n-gram 层面重合多少。

想象顾客手里有一份名厨定的“标准菜单”,模型译者端出的菜要和标准菜单比对——配料一样算 1-gram 命中,搭配一样算 2-gram 命中,以此类推。BLEU 的核心是修正的精确率(modified precision):每个 n-gram 的出现次数不能被“重复利用”超过参考译文中出现的次数。比如模型译文把“猫”写了三次,但参考里只有一次,那最多只算一次命中,防止“车轱辘话刷分”。同时还有简洁惩罚(brevity penalty):译文太短即使全对也要扣分,就像只端出一道“我”不可能是一份完整菜单。综合公式如下:

BLEU 的聪明之处在于:它不用理解语义,只用“词面重合”来估算质量,计算快、可复现,因此成为机器翻译研究中最通用的指标。但顾客打分只看“菜名像不像”,不管“好不好吃”——这就是 BLEU 的局限,我们在后面误区部分会细说。对于翻译工程师来说,BLEU 是快速迭代模型的“仪表盘”,而最终质量还是要靠人工抽查兜底。

BLEU=BP×exp⁡(∑n=1Nwnlog⁡pn)\displaystyle \text{BLEU} = \text{BP} \times \exp\left(\sum_{n=1}^{N} w_n \log p_n\right)
BLEU 是 n-gram 精确率的加权几何平均,再乘上简洁惩罚系数 BP。
  1. n-gram 精确率p_n 表示 n 个连续词组成的片段在参考译文中出现的比例,n 通常取 1 到 4。
    pn=模型译文中命中参考的 n-gram 数模型译文 n-gram 总数\displaystyle p_n = \frac{\text{模型译文中命中参考的 n-gram 数}}{\text{模型译文 n-gram 总数}}
  2. 加权几何平均对每个 n 的 log p_n 加权求和再取 exp,权重 w_n 通常均匀取 1/N,让不同粒度都发挥作用。
    exp⁡(∑n=1Nwnlog⁡pn)\displaystyle \exp\left(\sum_{n=1}^{N} w_n \log p_n\right)
  3. 简洁惩罚 BP如果模型译文长度小于参考译文,BP 小于 1,对偏短译文进行打折。
    BP={1,if ∣y∣>∣r∣e1−∣r∣/∣y∣,if ∣y∣≤∣r∣\displaystyle \text{BP} = \begin{cases} 1, & \text{if } |y| > |r| \\ e^{1 - |r|/|y|}, & \text{if } |y| \leq |r| \end{cases}

训练与展望:教出好译员的“师傅带徒弟”

一台翻译模型是怎么训练出来的?核心方法叫 Teacher Forcing(教师强制)。在训练时,模型生成第 t 个词时,我们不给它看自己前一步生成的“错词”,而是直接喂入参考译文的真实前词——就像师傅在旁边扶着徒弟的手写:即使徒弟第 2 步写错了,第 3 步依然按标准答案教,而不是将错就错。这样训练收敛快、稳定性好;推理时不再有“老师”,模型只能靠自己已生成的词继续写,这就是训练和推理的“暴露偏差”。

训练目标是最小化交叉熵损失。模型对每个位置输出一个词表上的概率分布,我们希望它的预测分布尽量贴近“标准答案”(一个 one-hot 分布)。偏离越远,惩罚越大:

当翻译官训练完成,她的能力就可以部署到现实世界:实时翻译设备把语音切成小块逐句翻译,同声传译场景要求低延迟和高流畅度的平衡,而更深远的意义在于——Transformer 这套“编码器-解码器 + 注意力”的架构,正是今天大语言模型(GPT、LLaMA 等)的底层模板。理解翻译模型,就等于拿到了理解整个现代 NLP 大厦的钥匙。从一间小餐厅走出的翻译官,如今已经成长为千家万户的智能助手。

L=−1T∑t=1Tlog⁡P(yt∣y<t,x)\displaystyle \mathcal{L} = -\frac{1}{T} \sum_{t=1}^{T} \log P(y_t | y_{<t}, x)
交叉熵损失:真实词对应的预测概率取负对数后求平均,概率越低损失越大,梯度信号越强。
  1. 负对数似然-log P(y_t) 的含义是“模型给标准词的概率越低,损失越大”,促使模型提高标准词的预测概率。
    −log⁡P(yt∣y<t,x)\displaystyle -\log P(y_t | y_{<t}, x)
  2. 序列平均对所有 t=1 到 T 位置求平均,让损失反映整句的平均质量,而不是只看某一个词。
    −1T∑t=1T\displaystyle -\frac{1}{T} \sum_{t=1}^{T}
  3. Teacher Forcing 配合训练时 y_{<t} 用参考译文的前词,让模型每一步都在“正确上下文”中学习。
    P(yt∣y<t,x)\displaystyle P(y_t | y_{<t}, x)

AI 应用场景

实时同声传译耳机

阶段:推理部署(流式解码 + 束搜索)

解决的问题:传统人工同传需要两名译员轮换,成本高且难以覆盖所有语种;流式 Transformer 翻译模型将语音实时转写并翻译,用束搜索在延迟与质量之间取得平衡。

具体案例:某会议耳机产品内置流式 Transformer 翻译,中英交替发言时,设备先做语音识别,再用轻量解码器逐句生成译文,BLEU 达到 40+,端到端延迟控制在 1.5 秒内,用户几乎感觉不到“先翻译后播放”的割裂感。

跨境电商商品评论批量翻译

阶段:离线批处理(训练 + 评估)

解决的问题:人工翻译海量商品评论成本太高;训练好的 Transformer 翻译模型可批量把外文评论翻成中文,并用 BLEU 分数筛选低质量译文,安排人工复核,实现“机器先翻、人工抽检”的流水线。

具体案例:某跨境电商平台每天产生 50 万条多语言评论,团队用预训练翻译模型批量生成中文译文,BLEU 低于 20 的句子自动进入人工队列,最终 90% 的评论实现全自动翻译,人工成本降低约 70%。

字幕组视频自动翻译初稿

阶段:数据标注 + 模型微调

解决的问题:字幕翻译讲究术语一致和长度限制,人工逐句翻译一部剧耗时数十小时;用领域语料微调 Transformer 模型生成初稿,再用“长度归一化束搜索”适配字幕字符数限制。

具体案例:某字幕组用微调后的翻译模型为纪录片出初稿,配置长度归一化参数使每行字幕不超过 42 字符,术语误译率降低 40%,校对工时减半,字幕组从“逐句翻译”转为“审校润色”。

Python 演示

python90 行
"""Transformer 翻译核心算法演示:束搜索解码 + BLEU 评估"""import mathfrom collections import Counter  def bleu_score(reference, hypothesis, max_n=4):    """计算 BLEU 分数    reference:  参考译文(标准答案)分词列表    hypothesis: 模型生成译文分词列表    """    bp = math.exp(1 - len(reference) / max(len(hypothesis), 1)) \        if len(hypothesis) <= len(reference) else 1.0     total_log, valid_n = 0.0, 0    for n in range(1, max_n + 1):        if len(hypothesis) < n or len(reference) < n:            continue        ref_ngrams = Counter()        for i in range(len(reference) - n + 1):            ref_ngrams[tuple(reference[i:i + n])] += 1        hyp_ngrams = Counter()        for i in range(len(hypothesis) - n + 1):            hyp_ngrams[tuple(hypothesis[i:i + n])] += 1        match = 0        for gram, count in hyp_ngrams.items():            match += min(count, ref_ngrams.get(gram, 0))        precision = match / max(len(hypothesis) - n + 1, 1)        if precision == 0:            return 0.0        total_log += math.log(precision)        valid_n += 1     if valid_n == 0:        return 0.0    return bp * math.exp(total_log / valid_n)  def beam_search_decoding(step_fn, beam_width=3, max_len=10):    """束搜索解码    step_fn: 输入已生成 token 列表,返回下一个 token 的概率分布 dict    """    vocab = ["我", "爱", "猫", "狗", "喜欢"]    end_token = "</s>"    beam = [(0.0, ["<s>"])]     for _ in range(max_len):        new_beam = []        for log_prob, seq in beam:            if seq[-1] == end_token:                new_beam.append((log_prob, seq))                continue            probs = step_fn(seq)            for token in vocab + [end_token]:                prob = probs.get(token, 1e-6)                new_beam.append((log_prob + math.log(prob), seq + [token]))        beam = sorted(new_beam, key=lambda x: x[0], reverse=True)[:beam_width]        if all(seq[-1] == end_token for _, seq in beam):            break     best = max(beam, key=lambda x: x[0])    return best[1][1:-1]  def main():    """模拟一个'训练好的解码器'做演示"""    def mock_step(seq):        last = seq[-1]        if last == "<s>":            return {"我": 0.6, "爱": 0.3, "猫": 0.1}        if last == "我":            return {"爱": 0.7, "喜欢": 0.3}        if last in ("爱", "喜欢"):            return {"猫": 0.6, "狗": 0.4}        return {"</s>": 1.0}     print("=== Beam Search 束搜索解码 ===")    for k in (1, 2, 3):        result = beam_search_decoding(mock_step, beam_width=k, max_len=6)        print(f"束宽={k}: 译文={' '.join(result)}")     print("\n=== BLEU 评估演示 ===")    ref = ["我", "爱", "猫"]    perfect = bleu_score(ref, ["我", "爱", "猫"])    scrambled = bleu_score(ref, ["猫", "爱", "我"])    print(f"完美译文 BLEU: {perfect:.4f}")    print(f"乱序译文 BLEU: {scrambled:.4f}")  if __name__ == "__main__":    main()
目的:不依赖任何深度学习框架,用纯 Python 实现 Transformer 翻译的两个核心算法——推理阶段的束搜索解码与评估阶段的 BLEU 计算,让你直观感受“解码选路”和“质量打分”是怎样运作的。
  1. bleu_score(reference, hypothesis, max_n=4)计算修正的 n-gram 精确率,n 从 1 到 4 加权平均,并用简洁惩罚压制过短译文。
  2. hyp_ngrams[gram] += 1统计模型译文的 n-gram 出现次数,用于和参考译文做匹配计数。
  3. match += min(count, ref_ngrams.get(gram, 0))关键的一行:对每个 n-gram 取“模型出现次数”和“参考出现次数”的较小值,防止重复刷分。
  4. beam_search_decoding(step_fn, beam_width=3, max_len=10)束搜索主逻辑:每一步扩展所有候选词,排序后只保留概率最高的 beam_width 条。
  5. probs.get(token, 1e-6)用极小概率兜底词表中未出现的 token,保证对数运算不崩溃。
  6. if all(seq[-1] == end_token for _, seq in beam)如果所有候选都已生成结束符,提前终止搜索,节省计算量。
  7. mock_step(seq)模拟一个训练好的解码器:根据已生成的最后一个词,返回下一个词的概率分布。

常见误区

误区BLEU 高就是译文好,所以开发时只盯着 BLEU 数字调优就够了,分数提到 50 就说明模型已经很棒了。

正解BLEU 衡量的是“词面重合度”,不是语义质量。一句通顺但换了同义词的译文(“我喜爱猫咪” vs “我爱猫”)会被 BLEU 打低分;而一句语法别扭但恰好用了相同词汇的译文反而可能得分不低。就像顾客打分时只对照“菜名”,却说不出“好不好吃”。工程上一定要配合人工评估或语义级指标(如 COMET)综合判断。

为何常见:BLEU 是机器翻译领域沿用最久的自动化指标,大家习惯了用它做 benchmark 排名,容易把“指标”直接等同于“质量”。

误区Beam Search 的 K 值越大,候选路径越多,肯定越能找到最优译文,所以 K 直接开到 16 甚至 32 准没错。

正解K 增大会带来两个问题:一是计算量线性上升,推理变慢;二是过大的束宽可能让模型偏向生成“平均化”的平淡句子,甚至出现长度偏差——多篇论文观察到 K 太大时译文反而变差,K=4~8 往往已是质量与速度的最佳平衡点。就像点菜时保留太多备选,厨房反而不知道该先做哪道。

为何常见:直观上“多试几条路”总是更优,但忽略了概率搜索中的长度偏差和过拟合现象,也忽略了实际部署对延迟的约束。

误区看到注意力权重可视化图,觉得每个目标词对应一个高亮的源词,注意力就是词典式的对应关系,“我” 只对应 "I"。

正解注意力是“软对齐”——每个目标词同时关注多个源词,权重是一个概率分布,不是 0/1 的硬选择。例如翻译 “我 爱 猫” 时,生成 “love“ 可能同时给 ”爱” 0.88、“猫” 0.07 的权重,因为“爱”的对象是“猫”,两个词都参与语义。硬对齐是早期 IBM 统计模型的思路,Transformer 的软对齐表达能力远超于此。

为何常见:热力图可视化时高亮区域被人眼简化成“唯一对应关系”,加上“对齐”这个翻译容易让人联想到逐词对照。

误区Transformer 是并行计算的,没有 RNN 那种逐步读入的过程,所以它根本不关心词的顺序,把句子打乱输入结果也一样。

正解Transformer 靠位置编码显式注入顺序信息。两个句子即使词完全一样、顺序不同,位置编码不同,注意力计算结果就不同。“猫咬狗”和“狗咬猫”在 Transformer 眼里是完全不同的两句话。并行处理只是说它同时计算所有词,而不是说它不分先后。

为何常见:人们拿 Transformer 和 RNN 对比时,容易把“不用循环”误解成“没有顺序概念”,忽视了位置编码这个关键组件。

误区编码器是一堆注意力层堆叠,解码器也是一堆注意力层堆叠,看起来差不多,是不是训练时可以互相替换?

正解解码器比编码器多了两个关键差异:一是自注意力带掩码,只能看已生成的词;二是多了交叉注意力层,专门查询编码器的输出。编码器是“通读理解”,解码器是“边写边查”,职责完全不同。就像接待员和出单员虽然都识字,但一个负责读菜单、一个负责写菜单,岗位不能互换。

为何常见:Transformer 结构图里编码器和解码器都是“多头注意力 + 前馈”的方块堆叠,视觉上对称,容易让人忽略掩码和交叉注意力的存在。

面试题

Q1. Transformer 中编码器和解码器各负责什么?

单选题 · easy

  • A.编码器理解源句,解码器负责生成译文← 正确答案
  • B.编码器生成译文,解码器负责理解源句
  • C.编码器解码器功能完全一致无分工
  • D.编码器解码器各自独立互不关联

答案:A。编码器的任务是读入源语言句子并生成语义表示,解码器则据此逐词生成目标语言译文,二者配合形成完整的翻译流水线。B 把职责说反了,C 忽略了职责分工,D 则否定了两者间的信息传递关系——解码器的交叉注意力依赖编码器输出。

Q2. 位置编码在 Transformer 翻译中的作用是什么?

单选题 · easy

  • A.为每个词标记它在句中的顺序← 正确答案
  • B.将词向量映射到更高维空间
  • C.对词向量加入随机噪声扰动
  • D.让解码器预测未来的目标词

答案:A。Transformer 没有循环结构,词序信息完全靠位置编码注入。正弦波位置编码为每个位置生成唯一的顺序信号,让模型能区分“猫咬狗”和“狗咬猫”。B 是维度变换的误述,C 是噪声,D 与位置编码无关。

Q3. 注意力机制中 Q、K、V 分别代表什么?

单选题 · mid

  • A.查询向量、键向量和值向量← 正确答案
  • B.质量向量、关键向量和值向量
  • C.查询向量、价值向量和键向量
  • D.三种向量作用完全相同

答案:A。Q(Query)是当前词的查询,K(Key)是被查询词的键,V(Value)是被查询词的内容。模型用 Q 与 K 算匹配度,再用匹配度加权提取 V。B 把 Query 翻译成“质量”是望文生义,C 颠倒了 V 和 K 的命名,D 否定了三者分工。

Q4. 解码器掩码自注意力中“掩码”的作用是什么?

单选题 · mid

  • A.让注意力只能看到已生成的词← 正确答案
  • B.让注意力只能看到未来的词
  • C.让词向量随机丢掉部分值
  • D.让编码器看不到输入内容

答案:A。掩码矩阵把未来位置的值设为负无穷,softmax 后权重为 0,使第 t 个词只能关注 1 到 t 已经生成的词。这保证了自回归生成的因果关系:不能偷看未来。B 正好说反,C 是 Dropout 的概念混淆,D 与解码器无关。

Q5. Beam Search 中束宽 K 代表什么?

单选题 · mid

  • A.每一步同时保留 K 条候选路径← 正确答案
  • B.词表只保留 K 个高频词汇
  • C.训练数据只使用 K 个句子
  • D.解码器只输出 K 个译文

答案:A。束搜索每扩展一步,对所有候选路径按分数排序,只留下前 K 条继续搜索,最终输出分数最高的一条。K=1 即贪心解码。B 发生在词表裁剪,C 是数据采样,D 误解了束搜索的输出形式——它只输出一条最优译文。

Q6. BLEU 指标主要衡量翻译的什么?

单选题 · mid

  • A.译文与参考译文的重合程度← 正确答案
  • B.译文生成的速度与效率
  • C.模型参数量的大小规模
  • D.训练数据的规模与质量

答案:A。BLEU 通过 n-gram 重合度来衡量模型译文与参考译文的相似程度,并用简洁惩罚抑制过短译文。它是“词面”指标,不衡量语义。B 是延迟指标,C 是模型容量,D 是数据质量,都不是 BLEU 的衡量对象。

Q7. 贪心搜索与束搜索的核心区别是什么?

单选题 · hard

  • A.贪心只保留一条路径,束搜索保留多条← 正确答案
  • B.束搜索只保留一条路径,贪心保留多条
  • C.贪心适合长句,束搜索适合短句
  • D.贪心用于训练,束搜索用于推理

答案:A。贪心解码每一步只选当前概率最高的词,相当于束宽 K=1,容易陷入局部最优;束搜索每步保留 K 条候选路径,在全局视角下选择,能显著改善译文整体性。B 说反了,C 没有依据,D 的错误在于贪心和束搜索都属于推理阶段的解码策略(训练用的是 Teacher Forcing)。

Q8. 解码器生成每个目标词时依赖哪些信息?

多选题 · mid

  • A.编码器输出的上下文表示← 正确答案
  • B.已生成的前置目标词序列← 正确答案
  • C.解码器自身的位置编码信息← 正确答案
  • D.目标句未来的完整内容

答案:ABC。解码器每一步的输入由三部分构成:编码器输出(经交叉注意力查询)、已生成的前置词序列(经掩码自注意力)、位置编码(标记当前生成位置)。D 是 decoding 时不可见的未来信息,掩码的作用就是阻止模型看到它。

Q9. 关于 BLEU 指标的局限,下列说法正确的是?

多选题 · hard

  • A.无法准确衡量语义等价性← 正确答案
  • B.难以识别同义词改写表达← 正确答案
  • C.参考答案质量直接影响评分← 正确答案
  • D.完全不需要参考译文即可计算

答案:ABC。BLEU 只看词面重合,一句语义正确但用词不同的译文会被低估;同义改写(如“喜爱”vs“爱”)也会被扣分。参考译文本身的质量和数量直接决定 BLEU 的可靠性——参考译文越差,分数越失真。D 错,BLEU 必须依赖参考译文,没有参考就无法计算。

Q10. 关于 Transformer 的自注意力机制,下列说法正确的是?

多选题 · hard

  • A.能同时建模任意两个词之间的依赖← 正确答案
  • B.计算复杂度随序列长度平方增长← 正确答案
  • C.可完全取代循环神经网络结构← 正确答案
  • D.只建立相邻词之间的关联

答案:ABC。自注意力让每个词同时与句子中所有词计算关联权重,因此长距离依赖天然可建模;但这是 O(n²) 的复杂度——序列越长计算量越大。Transformer 正是用自注意力取代了 RNN 的结构。D 错,自注意力恰恰突破了“相邻词”的限制,能关联任意距离的词对。