Attention Is All You Need

Abstract

论文地址:Attention Is All You Need

代码地址:https://github.com/tensorflow/tensor2tensor

亮点:1. 完全基于Attention的模型架构,区别于传统的RNN/CNN;2. 支持并行化,训练高效;3. 实际表现优异。

1 Introduction

从RNN引入,指出了RNN由于天生的顺序时间依赖所带来的训练代价,借此引出了经常一起使用的Attention机制,并提出一种新的模型框架——Transformer,仅仅基于Attetention,能够实现更高效、更优秀。

2 Backgrounnd

谈到了同样可以实现并行的CNN,但是CNN只能获取局部信息,通常要通过层叠来扩大感受野。相比之下,Attention一步到位,能够直接获取全局信息,更加高效。

3 Model Architecture

image-20190729222035894

Transformer整体框架如上图,分为左侧的Encoder和右侧的Decoder,都堆叠了多层。下面就模型中涉及的细节进行介绍。

3.1 Encoder and Decoder Stacks

有两点值得注意,其一是Encoder和Decoder都是堆叠设计(重复多层),其二是Decoder引入了区别于Encoder的mask机制。

3.2 Attention

3.2.1 Scaled Dot-Product Attention

论文使用的Attention是Scaled Dot-Product Attention,公式如下:

Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V

另外一种常见的Attention是Additive attention,是通过一个前馈神经网络来计算softmax里的分数值。两者理论复杂度接近,Dot-Product Attention实践更高效,矩阵优化比较好。当d_k很大时,会导致softmax初始值落在梯度极小的区域(d_k很大,假定qk是互相独立的0均值1方差的随机变量,此时q\cdot k为0均值d_k方差),难以优化,为了消除该负面影响而引入上式的\frac{1}{\sqrt{d_k}},这也正是Scaled的名称来源。

3.2.2 Multi-Head Attention

image-20190730211137674

可以看到Multi-Head Attention就是先将Q/K/V经过不同的head矩阵W转换到不同表达子空间,分别做Scaled Dot-Product Attention,得到结果再拼接在一起,最后过一个非线性转换得到最后的输出。从公式理解更加直观,如下:

MultiHead(Q,K,V)=Concat(head_1,...,head_h)W^O \\ where \ head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) \\ W_i^Q \in R^{d_{model} \times d_k},\ W_i^K \in R^{d_{model} \times d_k}, \ W_i^V \in R_{d_{model}\times d_v}, \ W^O\in R^{hd_v\times d_{model}}

注:这里的多头注意力还带来一个好处,相比在原本d_{model}的高维空间,每个head都经过了降维,计算效率更高。

3.2.3 Applications of Attention in our Model

Transformer框架中主要有3处利用到了Multi-head Attention机制,

  1. 解码层中,decoder对encoder的注意力(attention)
  2. encoder中的自注意力(self-attention)
  3. decoder中的掩码自注意力(masked self-attention)

3.3 Position-wise Feed-Forward Networks

对Attention子模块的输出再经过变换,公式如下:

FFN(x)=max(0,xW_1+b_1)W_2+b_2

变换矩阵在不同位置共享(可以通过卷积实现),在不同层之间独立。

3.4 Embeddings and Softmax

  1. Encoder和Decoder共享词向量矩阵V,作者特别提到在embedding层时要将这些权值乘上\sqrt{d_{model}} 🤔
  2. softmax层前的线性转换矩阵U也是与1的词向量矩阵共享权值的(相当于令V=U,不过有额外的bias)

3.5 Positional Encoding

为了让Transformer也能利用到序列的次序信息,引入了位置编码。设计上比较巧妙,主要利用了正余弦函数,有点傅立叶变换的意思(维度保持在d_{model}以便和词向量相加,每一维有不同的变化周期,从2\pi1000\cdot 2\pi),公式如下:

PE_{(pos,2i)}=sin(pos/10000^{2i/d_{model}}) \\ PE_{(pos, 2i+1)}=cos(pos/10000^{2i/d_{model}})

另外可以证明,对于任意kPE_{pos+k}可以表示为PE_{pos}的线性函数。实践表明这种预设位置向量效果与让模型自己学的位置向量效果相当,却让模型可以推断比训练期间遇到的更长的序列。

4 Why Self-Attention

为什么要使用自注意力呢?作者给出了3个指标对比,如下:

image-20190802153125022

  1. 每层计算复杂度,这里首先介绍矩阵相乘的时间复杂度,

    O(MN)=O(m\cdot n \cdot d), \\ while\ M\in R^{m\times d}, N\in R^{d\times n}

    因此,Self-Attention对应的(1)式的计算复杂度为O(n^2\cdot d)。Convolutional则是n个位置,每个位置有dR^{k\times d}的filter,则计算复杂度为O(n\cdot k \cdot d^2)。Recurrent的计算公式H_t=\phi (...+H_{t-1}W_{dd}+b_d),计算复杂度O(n\cdot d^2)。Self-Attention (restricted)是指只对邻近r个token进行attention。由于n通常远小于d,所以实际上Self-Attention优势很大。

  2. 可并行的运算量,用需要的最少的顺序操作的数量来衡量,即列2。

  3. 长距离依赖的最长路径(越短越容易学习),Self-Attention因为任意两点间直接关联,所以路径为O(1)。Recurrent中序列首尾路径最长为O(n)。Self-Attention (restricted)首尾两个节点不能直接相连,只能通过中间一些节点间接联系在一起,路径长度O(n/r)。普通Convolutional同Self-Attention (restricted),需要O(n/k),如果采用空洞卷积(dilated convolutions),可以跳得更快些,为O(log_k(n))

    另外一个好处是,self-attention具有更好的可解释性。通过可视化手段,可以让我们看到模型的关注焦点分布。

    5 Training

    训练数据是翻译数据(English-German/English-French),优化器采用Adam,训练过程的学习率变化遵循下式(注意到有一个热身过程-warm-up,该过程中学习率通常先逐步增大,使得学习过程加速,然后再逐步减小,不太确定是不是这样,欢迎看客在评论区讨论):🤔

    lrate=d_{model}^{-0.5}\cdot min(step\_num^{-0.5}, step\_num\cdot warmup\_steps^{-1.5}), \ warmup\_steps=4000

    采用了两种正则化手段,其一是Residual Dropout,即对进入Add & Norm的子层输出先进行dropout(注意embedding+pos-encoding后是加了dropout),其二是Label Smoothing,这可能会让困惑度增大,但是实验表明能提升准确率和BLEU打分。

    6 Results

    image-20190802195239021

    可以看到在两个任务上都超越了之前的结果,并且训练代价也大为降低。论文细致分析了不同超参数设置对于模型性能的影响(分析思路值得借鉴):

    image-20190802201644650

    红框的几组实验是控制变量的,比较容易分析,可以看到层数N和键大小d_k影响比较大(越大越好),加了dropout后提升明显,label smoothing确实提升了BLEU(但也增大了PPL),位置编码两种方式基本没有差异。蓝框和绿框是一些相关的组合参数,注意保持关系d_{model}=h\cdot d_k,绿框提示我们使用更高的维度,模型可以有更好的容量,蓝框告诉我们要综合权衡hd_k,最终得到big模型。

    论文Appendix中给出了一些可视化例子,

    image-20190802204835036

    making聚焦学习到了”making … more difficult”

    image-20190802205047625

    单头和多头的对比,多头能够从不同的表示子空间里学习相关信息

Published by

admin

天空没有翅膀的痕迹,但我已飞过

One thought on “Attention Is All You Need”

  1. 前段时间在斗鱼直播看了亚马逊AI应用科学家 Aston Zhang 的一个讲座:「动手学深度学习」番外篇——注意力机制,本来想写一篇文章总结总结的。但是,其实内容和最近的系列文章区别不大,就作罢了。不过,讲座中有几个很有意思的点,特意在这篇文章的留言评论里分享给大家。

    讲座从注意力(attention出发),介绍了其基本原理、具体应用,最后还略带介绍了一下模型压缩。有一个很有趣的新颖视角——注意力机制是一种对输入分配偏好的通用池化方法,和图像领域热门已久的pooling技术联系了起来。下面是讲座中的一些笔记。

    1. 注意力是什么?从《大西洋月刊》人类平均每次注意力集中时间:12秒(2000年)到8秒(2013年),不如金鱼的9秒引入——注意力是一种稀缺资源,需要合理仔细分配使用!
    2. 注意力池化的几种形式(查询项:q,键项:k,值项:v)

      最大池化:max(v_i)

      平均池化:\sum_{i=1}^{n} \frac{1}{n}v_i

      注意力机制:\sum_{i=1}^{n}a(q,k_i)v_i

      注意力机制通常是含参数的,但也可以带来非参数模型(例如最大池化、平均池化就是两种特殊形式;注:非参数模型不是指没有参数,只是不对数据分布做假设,通常当前预测需要依赖于之前见过的数据)。Zhang举了俩个非参数模型的例子,例1,非参数回归,公式为g(x)=E(y_i|X_i=x),对数据要求高,需要训练集中出现大量相同的x,才可使用期望进行预估,这在离散分布还有可能,连续分布基本无解。例2,Nadaraya-Waston 核回归(1964),利用xX_i的距离(核函数)作为对y_i进行权重平均池化,公式为g(x)=\frac{\sum_{i=1}^{n}k(\frac{X_i-x}{h})y_i}{\sum_{i=1}^{n}{k(\frac{X_i-x}{h})}},这个思想和注意力机制就十分相似了,不过这里是非参数的,因为核函数是预先选定的,现在说的注意力权重一般是学习出来的。

      更多内容请移步https://www.bilibili.com/video/av57405195/看视频,😂

Leave a Reply

Your email address will not be published. Required fields are marked *