Attention?Attention!

下文主要是结合自己的理解翻译自:Attention?Attention!

注意力(Attention)在近些年成为深度学习领域一个极其受欢迎的概念,同时作为一个强有力的工具也被集成到了各种模型中来处理相应的任务。下面将介绍注意力的起源、不同的注意力机制、各种使用注意力机制的模型,例如transformer、SNAIL。

从某种程度上看,注意力是人在处理过载信息的一种手段,具体表现为我们如何对图像的不同区域或一句话中的相关单词关注度会有所区别,通常对于感兴趣的部分往往会分配大量的注意力。


Attention?Attention!

source : https://www.instagram.com/mensweardog/?hl=en

如上图所示,当看到一张????的图像时,人们的视觉注意力会专注于图像中某些高分辨率的地方,如图中框中所示的部分,可能会关注狗尖尖的耳朵或是圆圆的鼻子,而不太关注背景中的雪地和树木。如果将图像中关于狗的重要特征部分挡住的话,我们就无法通过图中的毛衣、毯子、雪地等一些特征来判断出挡掉的部分是一个什么物体,进一步表现了人类注意力分配的合理性。

同样当我们看到一个句子时,往往是根据某个词它的上下文来理解它所想表达的意思。例如当看到eatingeating时,人会很自然的认为句子后面的部分必然会出现一个和食物相关的词,还可能在此之前存在一些对于食物进行修饰的部分词。


Attention?Attention!

简而言之,注意力在深度学习中可以大致理解为对于某一个向量关注的程度如何,这个向量可能表示的是图像中的某一局部区域或是句子中的某个词,我们使用注意力向量来估计关注的部分和其他元素之间的关系强弱,并将不同部分的值的和用注意力向量加权得到的结果作为目标的近似值。

What’s Wrong with Seq2Seq Model?

在大范围的使用注意力机制之前,Seq2Seq模型已经得到了广泛的应用。它最初用于语言建模型领域,简要来说,它的目标就是希望将一个输入序列转换为一个新的目标序列,并且输入序列和目标序列的长度可以是不固定的,Seq2Seq模型的应用领域有机器翻译、生成问答对话、句法分析等。

Seq2Seq模型主要是一种Encoder-Decoder的架构,它包括:

  • Encoder:它主要所做的事将输入序列数据的信息压缩到一个固定长度的上下文向量(context vector)[也可称为sentence embedding、thought vector]中,希望得到的表示向量可以较好的包含整个输入的信息
  • Decoder:它主要所做的是使用上下文向量初始化,然后输出转换后的向量。早期的工作仅使用Encoder的最后状态来初始化Decoder

Encoder和Decoder是一个循环神经网咯模型,通常可选择LSTM、GRU做为基本单元。例如在下面机器翻译的例子中,我们将She is eating a green apple输入到Encoder中,希望Decoder输出她在吃一个绿苹果。通常我们关注的并不是某一次具体的翻译任务,而是希望中间的Context vector可以学到关于输入的重要信息的表示。


Attention?Attention!

这种使用固定长度的上下文向量的一个关键的不足是它不能记住长的句子,一旦完成了对于某个输入的处理,它就会忘记之前已经学到的部分。为了解决这个问题,注意力机制应时而生。

Born for Translation

注意力机制最初主要是用来帮助机器翻译的神经网络模型来记忆长句子的信息,它和从Encoder的最后一个隐状态构建单个的上下文向量方法不同,Attention会对整个输入和上下文向量计算注意分数,而且不同的输出元素的注意分数是不同的。虽然上下文向量可以访问整个输入序列,但我们也不必担心会遗忘信息。源序列和得到的目标序列之间的对齐(alignment)由上下文向量来学习和控制。从本质上来说,上下文向量主要处理以下的三条消息:

  • encoder的隐藏状态
  • decoder的隐藏状态
  • 源输入和目标输出之间的对齐,[我的理解是输入序列中的词和目标序列中的词在一定程度上是相对应的]

    Attention?Attention!

source:https://arxiv.org/pdf/1409.0473.pdf

Definition

假设我们的输入为长度为nn的序列数据xx,目标是输出长度为mm的序列数据yy
x=[x1,x2,,xn]y=[y1,y2,,ym] % <![CDATA[ \begin{aligned} \mathbf{x} &= [x_1, x_2, \dots, x_n] \\ \mathbf{y} &= [y_1, y_2, \dots, y_m] \end{aligned} %]]>
encoder这里是一个双向的RNN,当然你也可以根据自己的需要选择不同的RNN,每个时刻都有前向隐藏状态hi\overrightarrow{\boldsymbol{h}}_i和后向隐藏状态hi\overleftarrow{\boldsymbol{h}}_i两个状态,将它们简单的连接(concatenation)形式做为encoder的某时刻的具体状态。例如当我们处理一个句子时,这样的方式可以确保可以通过某个词前后的词来理解它。
hi=[hi;hi],i=1,,n \boldsymbol{h}_i = [\overrightarrow{\boldsymbol{h}}_i^\top; \overleftarrow{\boldsymbol{h}}_i^\top]^\top, i=1,\dots,n
decoder在输入tt位置的词时的隐状态为st=f(st1,yt1,ct)t=1,...,m\boldsymbol{s}_t=f(\boldsymbol{s}_{t-1}, y_{t-1}, \mathbf{c}_t),t=1,...,m,其中上下文向量ctc_{t}是输入序列对应隐状态的总和,按照对齐分数(alignment scores)加权,计算公式如下所示:
ct=i=1nαt,ihi; Context vector for output ytαt,i=align(yt,xi); How well two words yt and xi are aligned.=exp(score(st1,hi))i=1nexp(score(st1,hi)); Softmax of some predefined alignment score.. % <![CDATA[ \begin{aligned} \mathbf{c}_t &= \sum_{i=1}^n \alpha_{t,i} \boldsymbol{h}_i & \small{\text{; Context vector for output }y_t}\\ \alpha_{t,i} &= \text{align}(y_t, x_i) & \small{\text{; How well two words }y_t\text{ and }x_i\text{ are aligned.}}\\ &= \frac{\exp(\text{score}(\boldsymbol{s}_{t-1}, \boldsymbol{h}_i))}{\sum_{i'=1}^n \exp(\text{score}(\boldsymbol{s}_{t-1}, \boldsymbol{h}_{i'}))} & \small{\text{; Softmax of some predefined alignment score.}}. \end{aligned} %]]>
其中αt,i\alpha_{t,i}的值取决于输入序列中ii位置的元素和输出tt位置元素的配对数据,(yt,xi)(y_{t},x_{i})取决于它们的匹配程度。αt,i\alpha_{t,i}中的权重值定义了输入中的每个元素对于源输入的每个隐状态的关注程度。在Bahdanau的论文中得分α由只有一个隐藏层的参数化的前馈网络得到,而且前馈网络与模型的其他部分一起训练。score的计算公式如下所示:
score(st,hi)=vatanh(Wa[st;hi]) \text{score}(\boldsymbol{s}_t, \boldsymbol{h}_i) = \mathbf{v}_a^\top \tanh(\mathbf{W}_a[\boldsymbol{s}_t; \boldsymbol{h}_i])
其中vav_{a}WaW_{a}是需要模型学习的权重矩阵。对齐分数矩阵可以显式地显示源词和目标词之间的相关性。


Attention?Attention!

A Family of Attention Mechanisms

在注意力机制的的帮助下,源序列和目标序列之间的依赖关系不再受中间距离的限制!由于注意力机制大幅的提升了机器翻译模型的效果,它很快就扩展到了计算机视觉领域,人们开始探索各种其他形式的注意力机制。下面是几种常见的注意力机制和相应的对齐评分功能的汇总表:


Attention?Attention!

下面是对注意力机制更概括性的介绍


Attention?Attention!

Self-attention

自我注意力(Self-attention),也被称为intra-attention,是一种将单个序列的不同位置联系起来的注意力机制,它用来计算相同序列的表示,在机器阅读、摘要生成和图像描述生成领域取得了很好的效果。

例如在《Long Short-Term Memory-Networks for Machine Reading》中就是用Self-attention做机器阅读的。在下面的例子中,Self-attention使我们能够学习到当前单词和句子中前一部分之间的相关性。


Attention?Attention!

如上所示,红色标注的词为当前单词,蓝色阴影的大小表示当前词对于它的关注程度。

另外self-attention也被应用到图像中,生成合适的描述。首先用卷积神经网络对图像进行编码,然后用一个自我注意力的递归网络利用卷积特征图逐帧生成描述词。如下所示,注意权重的可视化清晰地显示出模型对图像不同区域的观察情况,最后输出对应的单词。


Attention?Attention!

Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

Soft vs Hard Attention

如果基于注意力是可以访问整个图像还是只能访问一个patch,我们可以将注意力机制分为软注意力硬注意力

  • Soft Attention:用来学习对齐权值,优点:模型比较平滑并且可微;缺点:当输入数据很大时,计算开销将很大
  • Hard Attention:每次只能关注图像中的一块(patch),优点:计算量小;缺点:模型不可微,需要例如方差规约(variance reduction)或强化学习等技术来帮助训练

Global vs Local Attention

《Effective Approaches to Attention-based Neural Machine Translation》提出了局部注意力全局注意力的概念。全局注意力类似于软注意力,而局部注意力可以看作是软注意力和硬注意力的一种混合形式,尝试解决硬注意力中模型不可微的不足。该模型首先预测一个与当前目标单词对齐的位置,以及一个以源位置为中心的窗口,然后用它们来计算上下文向量。


Attention?Attention!

Neural Turing Machines

这部分内容我并不是很有兴趣,有兴趣的可见源博文。

Transformer

《Attention is all you need》是2017年最有影响力和最有趣的论文之一。它对Soft Attention进行了大量的改进,使得在不需要循环神经网络单元的情况下进行Seq2Seq建模成为可能。文章中提出的transformer模型完全建立在Self-Attention机制的基础上,没有使用顺序对齐的循环网络架构。

Key,Value and Query

Transformer的主要使用了多头注意力机制(Multi-head Self-attention)。Transformer将输入的编码表示看作一组键值对(K,V)(K,V),它们的维度大小都为nn(输入序列长度),key和value都是编码器的隐状态。在decoder中,前一个输出被压缩为一个维度大小为mm的query Q(Q),下一个输出通过映射该query 和一组键值对生成。

Transformer采用一种scaled dot-product attention的方式进行注意力分数的计算,输出为value的加权和,每个value的权重由query和所有key的点积确定,计算公式如下所示:
Attention(Q,K,V)=softmax(QKn)V \text{Attention}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) = \text{softmax}(\frac{\mathbf{Q}\mathbf{K}^\top}{\sqrt{n}})\mathbf{V}

Multi-Head Self-Attention

Transformer中的多头注意力层


Attention?Attention!

多头注意力机制不是只计算一次注意力分数,而是并行地多次执行按比例缩放的dot-product注意力。每个独立的注意力计算输出被简单地连接起来,并线性地转换成预期的维度。在原始paper中,作者认为:“多头注意力使得模型能够在不同的位置共同关注来自不同表示子空间的信息,如果只有一个注意力头,平均就会抑制这种情况。”

multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.

多头注意力机制的计算公式如下所示:
MultiHead(Q,K,V)=[head1; ;headh]WOwhere headi=Attention(QWiQ,KWiK,VWiV) % <![CDATA[ \begin{aligned} \text{MultiHead}(\mathbf{Q}, \mathbf{K}, \mathbf{V}) &= [\text{head}_1; \dots; \text{head}_h]\mathbf{W}^O \\ \text{where head}_i &= \text{Attention}(\mathbf{Q}\mathbf{W}^Q_i, \mathbf{K}\mathbf{W}^K_i, \mathbf{V}\mathbf{W}^V_i) \end{aligned} %]]>
其中的WiQW_{i}^{Q}WiKW_{i}^{K}WiVW_{i}^{V}WOW^{O}都是需要学习的参数矩阵

Encoder

Encoder架构图


Attention?Attention!

encoder部分用于生成基于注意力的表示,它能够从潜在的无穷大的上下文中定位特定的信息片段

  • encoder由6个相同的层堆叠而成
  • 每一层都有一个多头注意力层和一个简单的position-wise类型的全连接前馈网络层
  • 每个子层采用残差连接和层归一化( layer normalization),所有子层输出的维度相同dmodel=512d_{model}=512

Decoder

Decoder架构图


Attention?Attention!

Decoder能够从经过Encoder编码的表示中检索。

  • decoder由6个相同的层堆叠而成
  • 每一层都有两个sub-layer的多头注意力机制和一个sub-layer的全连接前馈网络
  • 它与encoder类似,每个子层采用残差连接和层归一化
  • 第一个多头注意力子层被修改以防止位置对后续位置的注意,因为我们在预测当前位置时不希望看到目标序列的后面的部分。

Full Architecture

下图为是Transformer的完整结构图:


Attention?Attention!

  • 源序列和目标序列都先经过嵌入层(embedding layer)生成相同维度dmodel=512d_{model}=512的数据
  • 为了保存位置信息,采用了 sinusoid-wave-based的位置编码,并与嵌入层的输出进行了求和
  • decoder最后的输出需要经过softmax层和线性层

Transformer的一个实例:https://github.com/lilianweng/transformer-tensorflow

应用

在Transformer提出后出现了很多基于它的模型,如BERT、SNAIL、GPT……,将Transformer中的Self-attention和GAN结合起来就提出了Self-Attention GAN,下图是SNAIL的示意图


Attention?Attention!

References

[1] “Attention and Memory in Deep Learning and NLP.” - Jan 3, 2016 by Denny Britz

[2] “Neural Machine Translation (seq2seq) Tutorial”

[3] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. “Neural machine translation by jointly learning to align and translate.” ICLR 2015.

[4] Kelvin Xu, Jimmy Ba, Ryan Kiros, Kyunghyun Cho, Aaron Courville, Ruslan Salakhudinov, Rich Zemel, and Yoshua Bengio. “Show, attend and tell: Neural image caption generation with visual attention.” ICML, 2015.

[5] Ilya Sutskever, Oriol Vinyals, and Quoc V. Le. “Sequence to sequence learning with neural networks.” NIPS 2014.

[6] Thang Luong, Hieu Pham, Christopher D. Manning. “Effective Approaches to Attention-based Neural Machine Translation.” EMNLP 2015.

[7] Denny Britz, Anna Goldie, Thang Luong, and Quoc Le. “Massive exploration of neural machine translation architectures.” ACL 2017.

[8] Ashish Vaswani, et al. “Attention is all you need.” NIPS 2017.

[9] Jianpeng Cheng, Li Dong, and Mirella Lapata. “Long short-term memory-networks for machine reading.” EMNLP 2016.

[10] Xiaolong Wang, et al. “Non-local Neural Networks.” CVPR 2018

[11] Han Zhang, Ian Goodfellow, Dimitris Metaxas, and Augustus Odena. “Self-Attention Generative Adversarial Networks.” arXiv preprint arXiv:1805.08318 (2018).

[12] Nikhil Mishra, Mostafa Rohaninejad, Xi Chen, and Pieter Abbeel. “A simple neural attentive meta-learner.” ICLR 2018.

[13] “WaveNet: A Generative Model for Raw Audio” - Sep 8, 2016 by DeepMind.

[14] Oriol Vinyals, Meire Fortunato, and Navdeep Jaitly. “Pointer networks.” NIPS 2015.

[15] Alex Graves, Greg Wayne, and Ivo Danihelka. “Neural turing machines.” arXiv preprint arXiv:1410.5401 (2014).

P.S.关于BERT等模型后面看了再总结吧~