1.训练流程
比如我们想做一个中译英的机器翻译任务,现在我们已经准备好了数据集,例如{‘chinese’:我爱吃梨,‘english’: i love eating pears} ,那么模型的输入和输出以及标签分别是什么呢?
首先我们会先根据数据集创建中文词表和英文词表,假如数据集中只有{‘chinese’:我爱吃梨,‘english’: i love eating pears} 这一条样本,那么中文词表为{‘我’:0,‘爱’:1,‘吃’:2,‘梨’:3},英文词表为{‘PAD’:0,‘BOS’:1,‘EOS’:2,‘i’:3,‘love’:4,‘eating’:5,‘pears’:6}。为什么英文词表中还多了一些特殊字符呢?首先’PAD’字符是填充的意思,在进行输入的时候为了保持一个batch中的句子长度一样,会将句子填充到一样的长度,所以如果句子的长度过短,会在其后面增加填充符。’BOS‘字符是开始符号,解码器的输入中的第一个字符便是’BOS’字符;’EOS‘字符为结束字符。
创建好此表后,我们根据词表将中英文输入映射成数字。如下所示:

使用encoder编码“我爱吃梨”是一次性把四个字全部输入encoder的,在这里不使用掩码来屏蔽后续词,encoder一次性并行处理整个输入序列,生成一组富含上下文信息的表示(通常称为记忆或上下文向量)。
这组向量(和输入句子的词数相同),后续将会用于decoder的第二个注意力中,encoder只编码一次。
可以看到,编码器的输入是一整个句子,解码器的输入和输出也是完整的一个句子,最后根据解码器输出的句子去和标签去算loss。因此transformer在训练的时候是并行的。
在decoder中,第一次输入‘BOS’作为q,整个句子作为k和v,但是为了避免使用后续文章的信息,所以使用掩码机制‘BOS’把后面的屏蔽掉,第一次输出‘i’。
第二次输入‘i’作为q,整个句子作为k和v,但是为了避免使用后续文章的信息,所以使用掩码机制把‘i’后面的词屏蔽掉,第二次输出‘love’
第三次输入‘love’作为q,整个句子作为k和v,但是为了避免使用后续文章的信息,所以使用掩码机制把‘love’后面的词屏蔽掉,第三次输出‘eatting’
后续同理。
由于一次训练只更新一次参数,所以在一轮训练的多次输出可以并行执行,提升了训练速度。
2.预测流程
预测过程的详细步骤
阶段一:Encoder处理输入(一次性完成)
- 输入处理:将源语言句子 "I love you" 进行Tokenize和位置编码。
- 前向传播:这个序列被送入Encoder。Encoder通过自注意力机制和前馈网络进行处理。
- 输出:Encoder输出一组高维向量(
EncoderOutput),这组向量可以看作是源句子的一个深度、上下文相关的“表示”或“记忆”。这个EncoderOutput将在解码的每一步都被使用。
至此,Encoder的工作就结束了。
阶段二:Decoder自回归生成(循环进行)
现在,Decoder开始工作,生成目标语言(中文)的序列。初始输入通常只有一个开始符 <sos>。
第1个循环:生成第一个词
- Decoder初始输入:
<sos>(一个Token) - Decoder自注意力:Decoder对当前输入
<sos>进行** masked self-attention**(掩码自注意力)。掩码确保每个位置只能关注它之前的位置(包括自己)。由于目前只有一个Token,它只能关注自己。 - Encoder-Decoder注意力:这是关键一步!Decoder利用上一步输出的表示作为 Query,去交叉注意力Encoder最终输出的
EncoderOutput(作为 Key 和 Value)。这可以理解为Decoder在问:“基于我当前生成的状态(<sos>),我应该从源句子(‘I love you’)的哪个部分汲取信息来生成下一个词?” - 前馈网络与输出:经过交叉注意力和前馈网络后,Decoder输出一个向量,对应
<sos>位置。 - 预测分布:将这个输出向量通过线性层和Softmax,得到整个中文字汇表上的概率分布。
- 选择Token:通过某种策略(如束搜索),从分布中选择概率最高的词。假设我们选择了 “我”。
- 更新输入:将“我”追加到Decoder的输入中,现在输入变为:
<sos> 我。
第2个循环:生成第二个词
- Decoder新输入:
<sos> 我 - Decoder自注意力(掩码):模型处理这个序列。在计算“我”这个位置的表示时,它只能关注
<sos>和 “我” 自己,不能看到未来的词。 - Encoder-Decoder注意力:再次进行!Decoder用“我”的表示作为Query,去查询
EncoderOutput,思考:“基于我已经生成了‘我’,现在应该从源句子的哪里找信息来生成下一个词?” - 预测与选择:得到输出分布,选择下一个词。假设选择了 “爱”。
- 更新输入:输入序列变为:
<sos> 我 爱。
第3个循环:生成第三个词
- Decoder新输入:
<sos> 我 爱 - 重复过程:同样经过掩码自注意力、交叉注意力和前馈网络。
- 预测与选择:从分布中选择下一个词。假设选择了 “你”。
- 更新输入:输入序列变为:
<sos> 我 爱 你。
第4个循环:生成结束符
- Decoder新输入:
<sos> 我 爱 你 - 重复过程:模型可能预测到句子已经完整,于是从分布中选择结束符
<eos>。 - 停止:生成结束符,预测过程终止。
最终输出序列为:我 爱 你。