Transformer综述


Transformer由一个encoder和一个decoder组成。

在这里插入图片描述

1 encoder

对于通常的seq2seq的结构,每一个encoder内部,由若干个block组成,每一个block包含一个self-attention的结构和fc层。
在这里插入图片描述
对于transformer:

  1. 首先将每一个Block增加了residual的结构,即将输入和输出加在一起作为新的输出。
  2. 然后再输出之后加入layer norm。注意到batch norm是对于不同feature的同一个dimension归一化,而这里的layer norm则是对于同一个feature不同的dimension进行归一化。
  3. 对于layer norm的输出作为fc的输入,并且在fc层同样加入residual的结构。
  4. 最后再输入一个layer norm层

在这里插入图片描述
对比transformer给出的图,其中的add&norm指的就是residual&layer norm

在这里插入图片描述
transformer给出的结构是最原始的,但并不一定是最好的。以下的两篇论文分别:

  1. 改变了layer norm的位置
  2. 将layer norm改为power norm

并取得了更好的效果,改变后的结构如下:

在这里插入图片描述

2 decoder

对比transformer的encoder和decoder的结构可以看出,decoder相比于encoder:

  1. 将每一个block开头的self-attention替换为masked self-attention,它的输入就是decoder先前的输出
  2. 在每一个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:

  1. Copy mechanism:例如在做摘要的时候,从原文中复制一些句子。
  2. Guided attention:在训练的时候增加一些限制,强迫机器按照需要的方式学习(Monotonic Attention / location aware attention等)
  3. Beam search:避免贪婪算法错过的最优解
  4. Scheduled Sampling:由于训练时输入的是ground truth,但是测试的时候输入的是预测的结果(可能有错误),因此在训练的时候,有时候在输入一些Noise可能会效果更好。

课程链接:不会还有人没听【2022】最新 李宏毅大佬的深度学习与机器学习吧???


版权声明:本文为weixin_44579633原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。