文章目录
- 1 encoder
- 2 decoder
- 2.1 masked self-attention
- 2.2 cross attention
- 3. Training
Transformer由一个encoder和一个decoder组成。
1 encoder
对于通常的seq2seq的结构,每一个encoder内部,由若干个block组成,每一个block包含一个self-attention的结构和fc层。
对于transformer:
- 首先将每一个Block增加了residual的结构,即将输入和输出加在一起作为新的输出。
- 然后再输出之后加入layer norm。注意到batch norm是对于不同feature的同一个dimension归一化,而这里的layer norm则是对于同一个feature不同的dimension进行归一化。
- 对于layer norm的输出作为fc的输入,并且在fc层同样加入residual的结构。
- 最后再输入一个layer norm层
对比transformer给出的图,其中的add&norm指的就是residual&layer norm
transformer给出的结构是最原始的,但并不一定是最好的。以下的两篇论文分别:
- 改变了layer norm的位置
- 将layer norm改为power norm
并取得了更好的效果,改变后的结构如下:
2 decoder
对比transformer的encoder和decoder的结构可以看出,decoder相比于encoder:
- 将每一个block开头的self-attention替换为masked self-attention,它的输入就是decoder先前的输出
- 在每一个block的中间新加了一个self-attention,它的输入是encoder和masked self-attention的输出,因此它是和encoder和decoder的连接,称为cross attention。
2.1 masked self-attention
decoder输入除了encoder的输出之外,还有自己先前的输出。
self-attention的输出与每一个输入相关,而masked self-attention的输出只与之前的输入有关。这样做的原因是因为,之后的输入是之前输出的结果,也就是先产生之前的输出,后面的输入才能输入,因此必须去掉它们之间的关联:
2.2 cross attention
cross attention的运作过程如下:首先,输入第一个token为begin:
输入的第二个向量为之前输出的第一个结果:
注意到encoder和decoder都有很多block,那么是否每一个block都采用encoder的最后一层的输出结果作为输入呢?答案是不一定。如下的论文中就研究了decoder不同的block采用encoder的不同层的输出结果作为输入,说明这也是一个值得研究的问题。
3. Training
讲完了encoder和decoder的结构,接下来介绍transformer是如何训练的。
Transformer的训练中,实际上就是将decoder每输出一个向量,都与标签计算cross entropy损失。但是要注意的是,decoder的输出不再是之前的输入(在test的时候采用),而是ground truth。这一技术称为teacher forcing。
一些训练的tips:
- Copy mechanism:例如在做摘要的时候,从原文中复制一些句子。
- Guided attention:在训练的时候增加一些限制,强迫机器按照需要的方式学习(Monotonic Attention / location aware attention等)
- Beam search:避免贪婪算法错过的最优解
- Scheduled Sampling:由于训练时输入的是ground truth,但是测试的时候输入的是预测的结果(可能有错误),因此在训练的时候,有时候在输入一些Noise可能会效果更好。