训练的时候并行,预测的时候串行
训练阶段所有encoder的正确的输入输出都是已知的,所以可以并行执行,因为我们拿ground truth进行训练,预测阶段我们并不能知道decoder会输出什么,所以只能逐个生成。
以翻译为例,训练阶段我是知道decoder最终输出是“我爱中国”,所以decoder的【输入】在训练阶段分别为(1)起始符(2)起始符+我(3)起始符+我+爱(4)起始符+我+爱+中国,因为我们知道正确的最终输出是什么,所以这4个阶段是可以并行执行的
但是预测阶段,我们是不知道decoder的输出的,所以我们只能decoder的输入只能逐步进行(1)起始符(2)起始符+decoder预测单词1(3)起始符+decoder预测单词1+decoder预测单词2,这样
原文链接:https://www.zhihu.com/question/337886108/answer/770243956
正好最近在学习Transformer,回答一下,可能有误,欢迎指正
要弄清楚Decoder的输入输出,关键在于图示三个箭头的位置:


以翻译为例:
- 输入:我爱中国
- 输出: I Love China
因为输入(“我爱中国”)在Encoder中进行了编码,这里我们具体讨论Decoder的操作,也就是如何得到输出(“L Love China”)的过程。
Decoder执行步骤
Time Step 1
- 初始输入: 起始符</s> + Positional Encoding(位置编码)
- 中间输入:(我爱中国)Encoder Embedding
- 最终输出:产生预测“I”
Time Step 2
- 初始输入:起始符</s> + “I”+ Positonal Encoding
- 中间输入:(我爱中国)Encoder Embedding
- 最终输出:产生预测“Love”
Time Step 3
- 初始输入:起始符</s> + “I”+ “Love”+ Positonal Encoding
- 中间输入:(我爱中国)Encoder Embedding
- 最终输出:产生预测“China”
【图示】

操作:整体右移一位(Shifted Right)


细心的同学会发现论文在Decoder的输入上,对Outputs有Shifted Right操作。
Shifted Right 实质上是给输出添加起始符/结束符,方便预测第一个Token/结束预测过程。
正常的输出序列位置关系如下:
- 0-"I"
- 1-"Love"
- 2-"China"
但在执行的过程中,我们在初始输出中添加了起始符</s>,相当于将输出整体右移一位(Shifted Right),所以输出序列变成如下情况:
- 0-</s>【起始符】
- 1-“I”
- 2-“Love”
- 3-“China”
这样我们就可以通过起始符</s>预测“I”,也就是通过起始符预测实际的第一个输出。
【总结】
Transformer Decoder的输入:
- 初始输入:前一时刻Decoder输入+前一时刻Decoder的预测结果 + Positional Encoding
- 中间输入:Encoder Embedding
- Shifted Right:在输出前添加起始符,方便预测第一个Token
参考文献:
【维度笔记】



