1. Transformer 首次由论文 《Attention Is All You Need》 提出,在该论文中 Transformer 用于 encoder - decoder 架构。事实上 Transformer 可以单独应用于 encoder 或者单独应用于 decoder

    2. Transformer 相比较 LSTM 等循环神经网络模型的优点:

      • 可以直接捕获序列中的长距离依赖关系。
      • 模型并行度高,使得训练时间大幅度降低。
    1. 论文中的 Transformer 架构包含了 encoderdecoder 两部分,其架构如下图所示。

      • Transformer 包含一个编码器 encoder 和一个解码器 decoder

      • 编码器 encoder 包含一组 6 个相同的层 Layer ,每层包含两个子层 SubLayer

        • 第一个子层是一个多头自注意力 multi-head self-attention 层,第二个子层是一个简单的全连接层。

        • 每个子层都使用残差直连,并且残差直连之后跟随一个layer normalization:LN

          假设子层的输入为 ,则经过 LN 之后整体的输出为:一、Transformer - 图1

          为了 Add 直连,论文将内部所有层的输入、输出的向量维度设置为 维。

      • 解码器 decoder 也包含一组 6 个相同的层 Layer,但是每层包含三个子层 SubLayer

        • 第一个子层也是一个多头自注意力 multi-head self-attention 层。

          但是,在计算位置 一、Transformer - 图2self-attention 时屏蔽掉了位置 之后的序列值,这意味着:位置 一、Transformer - 图3attention 只能依赖于它之前的结果,不能依赖它之后的结果。

          因此,这种 self-attention 也被称作 masked self-attention

        • 第二个子层是一个多头注意力multi-head attention 层,用于捕获 decoder outputencoder output 之间的 attention

          第三个子层是一个简单的全连接层。

        • encoder 一样:

          • 每个子层都使用残差直连,并且残差直连之后跟随一个layer normalization:LN
          • decoder 所有层的输入、输出的向量维度也是 维。

      一、Transformer - 图4

    1.1.1 attention

    1. 编码器和解码器的 attention 都是采用 scaled dot attention

      设有 个 query 向量 一、Transformer - 图5 、 个 key 向量 一、Transformer - 图6 、 个 value 向量 一、Transformer - 图7 ,其中 query 向量和 key 向量的维度为 ,value 向量的维度为 一、Transformer - 图8 。经过 attention 之后,位置 的输出为:

      一、Transformer - 图9

      其中 表示位置 一、Transformer - 图10 与位置 之间的权重:

      一、Transformer - 图11

      • 除以 是为了降低 一、Transformer - 图12 的数值,防止它落入到 softmax 函数的饱和区间。

        因为 softmax 函数的饱和区梯度几乎为 0 ,容易发生梯度消失。

      • 如果使用了 Masked attention,则有:

      • 令:

        一、Transformer - 图13

        则有:

        令:一、Transformer - 图14,其中 softmax 沿着矩阵的行归一化。令:

        则有:一、Transformer - 图15 。即:

    一、Transformer - 图16

    1. 事实上,一组多个attention 的效果要优于单个 attention,这称作multi-head attention

      给定 query 矩阵 、key 矩阵 一、Transformer - 图17value 矩阵 ,multi-head attentionhead i 先通过一个线性映射然后再经过 attention,得到 head i 的输出 一、Transformer - 图18

      其中:

      • 一、Transformer - 图19 将 个 query 向量 一、Transformer - 图20 从 维降低到 一、Transformer - 图21 维。
      • 一、Transformer - 图22key 向量 从 一、Transformer - 图23 维降低到 维。
      • 一、Transformer - 图24 将 个 value 向量 一、Transformer - 图25 从 维降低到 一、Transformer - 图26 维。

      将多个 head i 的输出 进行拼接,并再经过一个线性映射即可得到多头attention 的结果:

      其中:

      • ahead 的数量,一、Transformer - 图27 是为了确保multi-head attention 前后的输入输出维度一致。

    2. 论文中选择 一、Transformer - 图28。为了保证 multi-head attention 的表达空间与 single-head attention 一致,论文中选择:

    3. 将整个 attention 空间拆分成多个 attention 子空间,其表达能力更强。

      从原理上看,multi-head 相当于在整体计算代价几乎保持不变的条件下,引入了更多的非线性从而增强了模型的表达能力。

    4. 在论文中,有三种方式使用多头注意力机制:

      • encoder-decoder attentionquery 来自前一个 decoder 层的输出,keys,values 来自 encoder 的输出。

        其意义是: decoder 的每个位置去查询它与 encoder 的哪些位置相关,并用 encoder 的这些位置的 value 来表示。

      • encoder self-attentionquery,key,value 都来自前一层 encoder 的输出。

        这允许 encoder 的每个位置关注 encoder 前一层的所有位置。

      • decoder masked self-attentionquery,key,value 都来自前一层 decoder 的输出。

        这允许 decoder 的每个位置关注 encoder 前一层的、在该位置之前的所有位置。

    1.1.2 全连接层

    1. encoderdecoder 还包含有全连接层。对 encoder/decoder 的每个 attention 输出,全连接层通过一个 ReLU 激活函数以及一个线性映射:

      一、Transformer - 图29

      • 对于同一个 multi-head attention 的所有 个输出,采用相同的参数;对于不同的 multi-head attention 的输出,采用不同的参数。
      • 输入和输出的维度保持为 一、Transformer - 图30,但是中间向量的维度是 2048 维,即 。这是为了扩充中间层的表示能力,从而抵抗 ReLU 带来的表达能力的下降。

    1.1.3 embedding 层

    1. 网络涉及三个 embedding 层:

      • encoder 输入 embedding 层:将 encoder 输入 token 转化为 一、Transformer - 图31 维的向量。
      • decoder 输入 embedding 层:将 decoder 输入 token 转化为 维的向量。
      • decoder 输出 embedding 层:将 decoder 输出 token 转化为 一、Transformer - 图32 维的向量。

      在论文中这三个 embedding 矩阵是共享的,并且论文中在 embedding 层将该矩阵乘以一个常量 来放大每个权重。

    1.1.4 position embedding

    1. attention 的计算公式 一、Transformer - 图33 可以看到:调整输入的顺序对 attention 的结果没有任何影响。即:attention 的输出中不包含任何顺序信息。

      事实上输入的顺序对于很多任务是非常重要的,比如 我喜欢喝牛奶,而不喜欢喝咖啡我喜欢喝咖啡,而不喜欢喝牛奶 的语义完全不同。

    2. 论文通过将位置编码添加到 encoderdecoder 底部的输入 embedding 来解决问题。即有:

      其中 一、Transformer - 图34 为位置 的position embedding一、Transformer - 图35 attention 权重与位置有关。

      对于同一个输入序列如果打乱序列顺序,则不同 tokenattention 权重发生改变使得 attention 的结果不同。

    3. 位置编码有两种选择:

      • 可以作为参数来学习,即:将 encoder 的每个输入的位置embeddingdecoder 的每个输入的位置embedding 作为网络的参数,这些参数都从训练中学得。

      • 也可以人工设定固定值。论文中使用:

        其中 一、Transformer - 图36 表示位置编号, 表示向量的维度。

        • 不同的维度对应不同的波长的正弦曲线,波长从 一、Transformer - 图37 到 。

        • 选择这样的函数是因为:不同位置之间的embedding 可以简单的相互表示。即:对于给定的偏移量一、Transformer - 图38 , 可以表示为 一、Transformer - 图39 的线性函数。

          这意味着模型可以捕获到位置之间的相对位置关系。

    4. 论文的实验表明:通过参数学习的position embedding 的效果和采用固定的position embedding 相差无几。

      另外,固定方式的 position embedding 可以在测试阶段处理那些超过训练序列长度的测试序列。

    1. 假设输入序列长度为 ,每个元素的维度为 一、Transformer - 图40: 。输出序列长度也为 一、Transformer - 图41 ,每个元素的维度也是 :一、Transformer - 图42

      可以从每层的计算复杂度、并行的操作数量、学习距离长度三个方面比较 TransformerCNNRNN 三个特征提取器。

        • 考虑到 nkeynquery 两两点乘,因此self-attention 每层计算复杂度为 一、Transformer - 图43
        • 考虑到矩阵(维度为 nxn) 和输入向量相乘,因此RNN 每层计算复杂度为
        • 对于 一、Transformer - 图44 个卷积核经过 次一维卷积,因此 CNN 每层计算复杂度为 。如果考虑深度可分离卷积,则计算复杂度下降为 一、Transformer - 图45

        因此:

        • 当 时,self attention 要比 RNNCNN 快,这也是大多数常见满足的条件。

        • 一、Transformer - 图46 时,可以使用受限 self attention,即:计算 attention时仅考虑每个输出位置附近窗口的 个输入。这带来两个效果:

          • 每层计算复杂度降为 一、Transformer - 图47
        • 最长学习距离降低为 ,因此需要执行 一、Transformer - 图48 次才能覆盖到所有输入。
      • 并行操作数量:可以通过必须串行的操作数量来描述。

        • 对于 RNN,其串行操作数量为 ,较难并行化。
      • 最长计算路径:覆盖所有输入的操作的数量。

        • 对于self-attention,最长计算路径为 一、Transformer - 图49;对于 self-attention stricted,最长计算路径为 。
        • 对于常规卷积,则需要 一、Transformer - 图50 个卷积才能覆盖所有的输入;对于空洞卷积,则需要 才能覆盖所有的输入。
        • 对于 RNN,最长计算路径为 一、Transformer - 图51
    2. 作为额外收益,self-attention 可以产生可解释性的模型:通过检查模型中的注意力分布,可以展示与句子语法和语义结构相关的信息。
    1. 训练包含两个训练数据集:

      • WMT 2014 English - German 数据集:包含 450万句子对,每个句子通过 byte-pair encoding:BPE 编码。

        • BPE 编码首先将所有文本转换为 Unicode bytes,然后将其中出现次数较高的、连续的一组bytes用一个 token 替代。
        • 源句和翻译句共享词汇表,包含 37000个 token
      • WMT 2014 English-French 数据集:包含 3600万句子对,每个句子通过 BPE 编码。

        源句和翻译句共享词汇表,包含 32000个 token

    2. 训练在 8 NVIDIA P100 GPU 上,相近大小的 句子对 放到一个batch 里,每个训练 batch 包含大约 25000个源 token 和 25000个 翻译 token

      • 优化器采用 Adam optimizer, 。学习率为:

        一、Transformer - 图52

        其中 。

      • 训练在基础版本上执行 10 万步约12个小时,在大型版本上(更大的参数)执行 30 万步约 3.5 天。

      • 通过两种方式进行正则化:

        • dropout:

          • residual dropout:在每个子层添加到 ADD & LN 之前执行 dropout一、Transformer - 图53
          • embedding dropout:在 encoderdecoder 添加position embedding 之后,立即执行 dropout , 。
        • label smoothing::训练期间使用 一、Transformer - 图54label smoothing

          虽然这会降低模型的困惑度,因为模型学到了更大的不确定性,但是这会提高 BLEU

    3. WMT 2014 English-German/ WMT 2014 English-French 翻译任务上,各种模型的效果如下图:

      • 训练参数:见后一个表的最后一行。

      • 超参数选择:使用beam size = 4 、长度惩罚因子 的 beam search,超参数在验证集上选择。

      • 训练代价 FLOPs :通过训练时间、训练 GPU 个数、每个 GPU 的单精度浮点计算能力三者相乘得到估计值。

      • 对于 base model,采用单个模型的最后 5 个 checkpoint 的平均(10分钟生成一个 checkpoint)。

        对于 big model,采用单个模型的最后 20个 checkpoint 的平均。

      一、Transformer - 图55

    4. 为了评估不同参数的影响,论文在 English-German 翻译任务中采用不同的模型,评估结果是 newstest2013 验证集上得到。

      • beam search 参数同前,但是并没有采用checkpoint 平均的策略。

      • PPL 困惑度是在 word-piece 上得到的。考虑到 BPE 编码,这和 word 级别的困惑度有所出入。

      • 为空的参数表示和 base 模型一致。

        • (A) 展示了不同 attention headattention key/value dimension 的影响。为了保持模型参数不变,二者需要满足一定条件。

          结果表明:单头的效果要比多头模型差,但是头数太多也会导致效果下降。

        • (B) 展示了不同的 attention key 的影响。

          结果表明:降低 会带来性能下降。因为降低 一、Transformer - 图56 会降低模型的 attention 矩阵 的容量,从而降低模型的整体表达能力。

        • (C) 展示了不同大小模型的影响。

          结果表明:模型越大,性能越好。

        • (E) 展示了通过学习 position embedding (而不是固定的 position embedding )的影响。

          结果表明:这两种 策略的效果几乎相同。

      一、Transformer - 图57