transformer中decoder和encoder是非常像的。
先假设decoder是一个独立的块,研究它的输入和输出。
一、Autoregressive(自回归)
如果把decoder当成一个黑匣子,这个黑匣子先接受一个特殊符号begin,说明预测开始,第一个输出的字符为“机”,那么A再输入进decoder在输出"器",以此类推。在最后的时候用另一个特殊符号end结尾。这样把输出当成输入的学习称为AT(自回归)。
二、ATvsNAT
非自回归,顾名思义,输入不再是上一时刻的输出。那么这时候就会引出一些思考。
1.如何确定非自回归的长度?
可以用一个预测网络预测输出的长度,再进行句子的输出。也可以一直进行输出,然后通过end来把句子截断。
2.非自回归有什么优势?
平行化的,也就是计算是可以并行的。如图所示,输入都是begin,完全可以一起输入,然后一起进行输出。它的输出长度也是可以控制的,输入几个begin就输出几个begin,如果我想让声音的输出变慢,我就可以多一倍的begin。
3.NAT效果往往没有AT好。这一点我认为非常直观,缺少了时间的信息,效果当然会差一些。
实际上decoder并不是一个独立的块,它是与encoder连起来的,下面研究它是怎么连接起来的。
三、与encoder的连接
可以看到,有两个箭头是来自于encoder,有一个箭头是来自于decoder自己的输入。具体细节如下。
所谓的两个箭头+一个箭头,实际上就是六个encoder输出之后的向量
k
e
y
,
v
a
l
u
e
key,value
key,value与带掩膜的self-attention的
q
i
q_{i}
qi进行相似度计算(dot-product)得到
v
i
v_{i}
vi。简单说一句带掩膜的self-attention就是每一次输入只看前面的信息不看后面的信息。当然事实上不一定要六个encoder再进入decoder,这个地方是flexible的,只不过这篇论文是这样做的
得到很多
v
v
v之后再通过全连接网络变成向量输入到下一个self-attention。
总结来讲,以语音转文字为例。transformer输入一段语音信号,然后转化为向量表示,通过encoder对这些向量进行编码(特征提取),然后输入进decoder好几次每次输出一个文字,最终的句子就是结果。