文章目录

  • 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层。

能否使用归一化代替激活函数_归一化_02


对于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_03


对比transformer给出的图,其中的add&norm指的就是residual&layer norm

能否使用归一化代替激活函数_自然语言处理_04


transformer给出的结构是最原始的,但并不一定是最好的。以下的两篇论文分别:

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

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

能否使用归一化代替激活函数_归一化_05

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

能否使用归一化代替激活函数_transformer_06

2.1 masked self-attention

decoder输入除了encoder的输出之外,还有自己先前的输出。

能否使用归一化代替激活函数_能否使用归一化代替激活函数_07


self-attention的输出与每一个输入相关,而masked self-attention的输出只与之前的输入有关。这样做的原因是因为,之后的输入是之前输出的结果,也就是先产生之前的输出,后面的输入才能输入,因此必须去掉它们之间的关联:

能否使用归一化代替激活函数_transformer_08

2.2 cross attention

cross attention的运作过程如下:首先,输入第一个token为begin:

能否使用归一化代替激活函数_归一化_09


输入的第二个向量为之前输出的第一个结果:

能否使用归一化代替激活函数_归一化_10


注意到encoder和decoder都有很多block,那么是否每一个block都采用encoder的最后一层的输出结果作为输入呢?答案是不一定。如下的论文中就研究了decoder不同的block采用encoder的不同层的输出结果作为输入,说明这也是一个值得研究的问题。

能否使用归一化代替激活函数_自然语言处理_11

3. Training

讲完了encoder和decoder的结构,接下来介绍transformer是如何训练的。

Transformer的训练中,实际上就是将decoder每输出一个向量,都与标签计算cross entropy损失。但是要注意的是,decoder的输出不再是之前的输入(在test的时候采用),而是ground truth。这一技术称为teacher forcing。

能否使用归一化代替激活函数_归一化_12


一些训练的tips:

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