编程与 AI16 分钟阅读更新于 2026-08-03

一条句子如何经过 Transformer 变成另一种语言:完整翻译流程

围绕词嵌入、位置编码、编码器、解码器和交叉注意力,完整梳理一条源句如何变成目标句。

相关工具

先把翻译任务说清楚

Transformer 最初被提出时,展示的就是序列到序列的机器翻译任务。输入是一句源语言文本,输出是另一种语言的目标文本。模型需要理解源句中各个词的关系,再按照目标语言的顺序逐步生成结果。

这个过程不是把源句中的词逐个替换成另一种语言,而是先把源句编码成一组上下文表示,再让解码器根据这些表示和已经生成的目标前缀选择下一个 token。编码器负责整理“输入说了什么”,解码器负责决定“输出接下来怎么说”。

资料 对 Transformer 的介绍正是沿着这条主线展开:词先变成向量,加上位置编码后进入编码器;编码器输出交给解码器;解码器通过注意力关注相关的源句位置,最后经线性层和 Softmax 产生目标词。

Transformer 从源语言输入到目标语言翻译输出的完整流程图
Transformer 机器翻译完整流程

源句经过分词、词嵌入和位置编码进入编码器,解码器结合源句记忆逐步生成目标句。

源句先经过分词和词嵌入

模型接收的不是原始字符串,而是分词器处理后的 token 序列。一个词可能对应一个 token,也可能被拆成多个子词 token。每个 token 先通过 Embedding 查表变成一个向量,资料 以 512 维词向量作为示例。

词嵌入只表达 token 本身的表示,不能告诉模型它在句子中的位置。同一个词出现在句首、句中或句尾,如果没有额外的位置线索,模型很难区分这些情况。

因此,嵌入向量还要与位置编码相加。相加后的形状不变,仍然是每个 token 一个 d_model 维向量,但每个位置携带了词信息和顺序信息,随后才能进入编码器堆栈。

编码器如何把源句变成上下文记忆

编码器的每一层先用多头自注意力让源句中的位置互相读取,再经过前馈网络做特征变换。多层堆叠后,每个位置的表示不再只是单个 token 的向量,而是融合了整句上下文的结果。

例如一个代词、动词或名词的含义,往往要结合句子中其他位置才能判断。自注意力提供了跨位置建立联系的方式,前馈网络则在每个位置对融合后的信息继续加工。残差连接和 LayerNorm 让多层结构更容易训练。

编码器最终输出一组上下文表示,常被称为 memory。它仍然与源句位置一一对应,但每个位置已经带有更丰富的语义,解码器可以在生成不同目标词时从中选择相关部分。

解码器输入的目标前缀从哪里来

推理开始时,解码器还没有生成任何目标词,通常先放入一个表示开始的特殊 token,例如 <BOS> 或 <SOS>。模型根据这个起点和编码器 memory 预测第一个目标 token。

生成第一个词后,它会被接到目标序列末尾,成为下一步解码器的输入。于是第二步看到的是“开始符号 + 第一个词”,第三步看到的是“开始符号 + 第一个词 + 第二个词”,不断向后扩展。

训练阶段有所不同。真实目标句子已经存在,可以把右移后的完整目标序列一次性送入解码器,这就是 Teacher Forcing。推理阶段没有真实答案,只能使用模型自己已经生成的前缀。

解码器自注意力为什么需要 Mask

在生成目标句时,当前位置只能使用已经出现的目标词,不能提前看到后面的真实答案。解码器自注意力中的 Sequence Mask 会遮挡未来位置,使第 t 个位置只能关注第 t 个位置以及之前的位置。

训练时虽然把整段目标前缀一次性放入模型,但掩码仍然生效。这样所有位置可以并行计算,却不会因为读取未来词而得到不真实的预测结果。并行计算解决速度问题,掩码保证顺序约束。

除了 Sequence Mask,还要处理 Padding Mask。不同目标句长度不一样,补齐位置不代表真实词,注意力和损失都需要排除它们。两种掩码分别解决未来泄漏和空位干扰。

交叉注意力如何连接源句和目标句

解码器自注意力只处理目标前缀,还需要知道源句中哪些位置与当前输出有关。这一步由 Encoder-Decoder Attention 完成。它的 Query 来自解码器当前表示,Key 和 Value 来自编码器输出的源句 memory。

如果目标序列长度是 target_seq,源序列长度是 source_seq,那么交叉注意力的分数矩阵形状通常是 [target_seq, source_seq]。每个目标位置都可以对所有源位置计算注意力,再把相关的源句信息加权汇入目标表示。

翻译时,当前要生成的词可能只与源句中的某几个位置关系密切。交叉注意力提供了动态选择机制,让不同目标位置在生成过程中关注不同的源句内容,而不是把整个源句压缩成一个固定向量后始终使用。

Transformer 翻译中解码器 Query 与编码器 Key Value 计算交叉注意力的流程图
解码器交叉注意力

目标前缀生成 Query,编码器输出生成 Key 和 Value,交叉注意力在目标位置与源位置之间建立联系。

输出层如何选择下一个 token

解码器最后一层会在当前目标位置产生一个隐藏状态向量。线性层把它映射到词表大小,得到每个候选 token 的 logits;Softmax 把 logits 变成概率分布;最后,模型根据贪心或采样策略选出一个 token。

如果选择的是“机器”,下一步就把“机器”接回目标前缀,再运行解码过程。这里的“输出一个词”通常更准确地说是输出一个 token,因为一个完整词可能被拆成多个子词,需要多个时间步才能生成完成。

生成过程会一直持续到模型输出 <EOS>,或者达到预设的最大长度。<EOS> 不是普通内容词,而是告诉解码器目标序列已经结束的特殊标记。

训练和推理是两条不同的路径

训练时,目标句子已知。右移后的目标序列作为解码器输入,所有位置可以在一次前向计算中产生预测,再分别与真实标签计算损失。由于有完整的真实前缀,训练可以充分利用并行矩阵计算。

推理时,目标句子未知。模型只能从 <BOS> 开始,一步得到一个 token,再把它放回输入继续计算。这个过程是自回归的,后一步依赖前一步的结果,因此不能像训练那样一次得到整句。

训练损失下降很快,不代表自由生成一定理想。训练使用真实前缀,推理使用模型自己的输出,二者之间存在差异。评估翻译质量时,除了看损失,还要观察完整生成结果、句子长度和特殊 token 的使用情况。

Transformer 翻译推理阶段从开始符号到结束符号逐步生成目标句的过程
机器翻译的自回归解码

推理从 <BOS> 开始,每一步预测一个 token 并追加到目标前缀,直到生成 <EOS>。

一次翻译中各模块分别负责什么

分词器负责把文本拆成模型能够处理的 token;Embedding 负责把 token ID 转成向量;位置编码补充顺序信息;编码器负责把源句变成上下文 memory;解码器自注意力负责整理目标前缀。

交叉注意力负责让目标位置读取源句 memory;前馈网络在每个位置继续加工融合后的信息;残差和 LayerNorm 为深层计算提供稳定路径;线性层和 Softmax 把最终表示转换成词表概率。

这些组件不是互相替代的。注意力不能直接替代分词,位置编码不能代替上下文交互,Softmax 也不能代替解码器。完整翻译效果来自这些步骤按照正确顺序协同工作。

如何阅读一张完整 Transformer 翻译图

先沿着源语言方向看:输入文本经过分词、嵌入和位置编码,进入编码器堆叠,最后得到一组 memory。再沿着目标语言方向看:目标前缀进入解码器,经过掩码自注意力、交叉注意力和前馈网络,得到当前输出位置的表示。

然后找两条关键连接。一条是编码器输出到解码器交叉注意力的 Key/Value 连接,另一条是解码器输出到线性层和 Softmax 的连接。前者说明源句信息如何进入目标侧,后者说明隐藏状态如何变成下一个 token。

最后区分图中哪些箭头代表训练时的整段并行输入,哪些箭头代表推理时的逐步回接。只要能找到输入、memory、目标前缀和词表概率,整张结构图就有了清晰的阅读顺序。

把一次翻译流程串起来

一条源句先被拆成 token,映射成词向量并加入位置编码。编码器通过多头自注意力和前馈网络反复加工这些表示,形成带有全句上下文的 memory。解码器从 <BOS> 开始,使用掩码自注意力处理目标前缀,再通过交叉注意力查询源句 memory。

当前目标位置的隐藏状态经过线性层得到词表 logits,再由 Softmax 形成概率分布。解码策略选择一个 token,追加到目标前缀,下一步继续重复。直到输出 <EOS>,模型才认为这次翻译完成。

这就是 Transformer 翻译的完整主线:输入先被编码成上下文,输出再在上下文约束下逐步生成。理解这条主线,之后再学习多头、Mask、位置编码或解码策略,就能把每个知识点放回它真正负责的位置。

常见问题

编码器输出为什么不能直接作为翻译结果?

编码器输出是源句的上下文表示,不是目标语言的 token 概率。解码器还需要结合目标前缀和交叉注意力逐步组织目标语言表达。

交叉注意力中的 Q、K、V 分别来自哪里?

Query 来自解码器当前目标表示,Key 和 Value 来自编码器输出的源句 memory。它让每个目标位置能够动态关注源句中的相关位置。

为什么训练可以并行,推理却要逐步进行?

训练时真实目标句已知,可以把右移后的目标序列一次性输入,并用 Mask 遮挡未来;推理时目标句未知,只能根据已生成的前缀逐个预测下一个 token。