Attention

2019/08/05

Attention

attention的通用定义如下:

  • 给定一组向量集合values,以及一个向量query,attention机制是一种根据该query计算values的加权求和的机制。
  • attention的重点就是这个集合values中的每个value的“权值”的计算方法。
  • 有时候也把这种attention的机制叫做query的输出关注了(或者说叫考虑到了)原文的不同部分。(Query attends to the values)

attention机制就是一种根据某些规则或者某些额外信息(query)从向量表达集合(values)中抽取特定的向量进行加权组合(attention)的方法。简单来讲,只要我们从部分向量里面搞了加权求和,那就算用了attention。

针对attention的变体主要有两种方式:

  1. 在attention 向量的加权求和计算方式上进行创新
  2. 在attention score(匹配度/权值)的计算方式上进行创新

Attention向量计算方式变体

  • Soft attention、global attention、动态attention
  • Hard attention
  • “半软半硬”的attention (local attention)
  • 静态attention
  • 强制前向attention

在encoder的过程中保留每个RNN单元的隐藏状态(hidden state)得到(h1……hN)。假设第 t 步的(根据上一步隐藏状态输出与当前输入得到的)隐藏状态为,在每个第 t 步利用 进行 dot 点积得到 attention score,也称为“相似度“或者“影响度”,或者“匹配得分

Soft attention/global attention/动态attention

这三个其实就是Soft attention,也就是我们上面讲过的那种最常见的attention,是在求注意力分配概率分布的时候,对于输入句子 X 中任意一个单词都给出个概率,是个概率分布,把attention变量(context vecor)用 表示,attention 得分在经过了 softmax 过后的权值用 表示(利用 softmax 函数将 attention scores 转化为概率分布)

论文:Neural machine translation by jointly learning to align and translate

Hard attention

Soft是给每个单词都赋予一个单词match概率,那么如果不这样做,直接从输入句子里面找到某个特定的单词,然后把目标句子单词和这个单词对齐,而其它输入句子中的单词硬性地认为对齐概率为0,这就是Hard Attention Model的思想。

local attention

Soft attention 每次对齐的时候都要考虑前面的 encoder 的所有 hi,所以计算量会很大,因此一种朴素的思想是只考虑部分窗口内的encoder隐藏输出,其余部分为0,在窗口内使用softmax的方式转换为概率。

这个 local attention 相反概念的是 global attention,global attention其实就是softmax attention,这里不多赘述global attention了。

论文:Effective Approaches to Attention-based Neural Machine Translation

在这个模型中,对于是时刻t的每一个目标词汇,模型首先产生一个对齐的位置 pt(aligned position),context vector 由编码器中一个集合的隐藏层状态计算得到,编码器中的隐藏层包含在窗口[pt-D, pt+D]中,D的大小通过经验选择。

上式之中,大S指的是源句子的长度,Wp和vp是指的模型的参数,通过训练得到,为了支持pt附近的对齐点,设置一个围绕pt的高斯分布,其中小s是在以pt为中心的窗口中的整数,pt是一个在[0,S]之间的实数。小Sigma σ 一般取窗口大小的一半。

静态 attention

静态attention:对输出句子共用一个 St 的attention就够了,一般用在BiLSTM的首位hidden state输出拼接起来作为st(在图所示中为u)

论文:Teaching Machines to Read and Comprehend 以及 Supervised Sequence Labelling with Recurrent Neural Networks

这个前面的每个hidden state 不应该都和这里的 u 算一次attention score吗,怎么这里只有一个r和u进行了交互?

其实 r 表示的是加权平均的self attention,这个权就是attention 向量,这个图里面把attention 的计算过程省略了。直接跳到了 计算真正的s’t的部分。他这个里面用的实际的attention score的计算并不是用点积,是additive attention。

什么是additive attention呢?这个下面就会讲根据按照attention score计算的不同的attention model变体。

Attention score计算方式变体

讲完了在加权向量αi(注意,此处这个αi指的是得分softmax之后的向量的第i个分量)的计算上面的各种attention变体,我们现在再回到原始的soft attention公式上面来。在 softmax 的 Attention 向量的计算总是依赖于权重求和,而权重往往是 attention score 的 softmax。

已有 的情况下,计算 query 的 attention 向量 a(很多时候也称作上下文向量,context vector)使用的公式为: 式子中的变量e代表的就是 attention score, 是attention的权重,a就是context vector

根据 attention score 的计算方式不同,我们可以将 attention 进一步细分分类。attention score 的计算主要有以下几种:

  • 点积 attention score(Basic dot-product attention):

​ 注意点积attention score这里有个假设,就是s和h的维数要一样才能进行点积

  • 乘法 attention score(multiplicative attention):

​ W矩阵是训练得到的参数,维度是d2 x d1,d2是s的hidden state输出维数,d1是hi的hidden state维数

  • 加法 attention score(Addictive attention):

​ 对两种hidden state 分别再训练矩阵然后激活过后再乘以一个参数向量变成一个得分。W1 = d3xd1,W2 = d3*d2,v = d3x1 ,d1,d2,d3分别 为h和s还有v的维数,属于超参数。

特殊Attention

Self Attention

Self attention也叫做 intra-attention 在没有任何额外信息的情况下,我们仍然可以通过允许句子使用 self attention 机制来处理自己,从句子中提取关注信息。

  1. 当前的隐藏状态去计算和前面的隐藏状态的得分,作为当前隐藏单元的attention score,例如:

  2. 当前状态本身去计算得分作为当前单元 attention score,这种方式更常见,也更简单,例如:

公式一,其中是参数,通过训练得到,维数dxd,维数dx1,维数dx1。

公式二,前面的是dx1的向量,是dx1,b是(1,)

  1. 针对 2,有矩阵变形:令矩阵 表示句子的隐藏状态矩阵,每个隐藏状态为 2u 维:

上面的式子中,使用的向量是一个通用的向量,每个隐藏状态并没有区分,如果我们对不同状态计算的时候学习不同的向量,也就是一个矩阵,得到的就是一个attention矩阵A。

是nx2u(双向lstm的结果拼接,每个单向LSTM的hidden units是u),是dx2u,是rxd,得到的attention矩阵 A 是 rxn。 C = rx2u,按论文意思来看就是把一句话编码成了一个 r x 2u 的矩阵(sentence embedding

在实际操作的过程中,我们也可能在学习时候给A一个 F2范式约束项 来避免过拟合

Key-value attention

这种 attention 就是比较新的了,简单来说 Key-value attention 是将 拆分成了两部分, 然后使用的时候只针对 key 部分计算 attention 权重,然后加权求和的时候只使用 value 部分进行加权求和。

公式如下,attention权重计算如下: 论文:Daniluk, M., Rockt, T., Welbl, J., & Riedel, S. (2017). Frustratingly Short Attention Spans in Neural Language Modeling. In ICLR 2017.

其中呢,这个 L 是 attention 窗口长度 , 是一个的向量 是一个的向量 最后得到 一起参与下一步的运算

multi-head attention

最后简单讲一下 google 的 attention is all you need 里面的 attention,这一段基本上是摘抄的苏剑林的科学空间的博文了。

Google 在 attention is all you need 中发明了一种叫 transformer 的网络结构,其中用到了multi-head attention。

首先,google 先定义了一下 attention 的计算,也是定义出 key,value,query 三个元素(在 seq2seq 里面,query 是,key 和 value 都是 )。

在self 里面,query 是当前要计算的,k 和 v 仍然一样,是其他单元的 hidden state。

在 key-value attention 里面 key 和 value 则是分开了的。

然后除以了一下 ,为了让内积不至于太大(太大的话 softmax 后就非 0 即 1 了,不够 “soft” 了)

这里我们不妨假设,Q 是 ,K 是 ,V 是 ,忽略归一化和 softmax 的话就是三个矩阵相乘,得到的是 的矩阵。

我们可以说,通过这么一个 attention 层,就将一个 的序列Q,提取信息编码成 的序列了。

用来先在算 attention 对三个矩阵做不同的矩阵变换映射一下,变成 ,mxdk’,mxdv’维度。

最后做并联,有点类似于inception 里面多个卷积核的feature map并联的感觉。 从一个向量出发

总结

总的来说,attention的机制就是一个加权求和的机制,只要我们使用了加权求和,不管你是怎么花式加权,花式求和,只要你是根据了已有信息计算的隐藏状态的加权和求和,那么就是使用了attention。

而所谓的self attention就是仅仅在句子内部做加权求和(区别与seq2seq里面的decoder对encoder的隐藏状态做的加权求和)。

self attention我个人认为作用范围更大一点,而key-value其实是对attention进行了一个更广泛的定义罢了,我们前面的attention都可以套上key-value attention,比如很多时候我们是把k和v都当成一样的来算,做self的时候还可能是quey=key=value。

Reference

Post Directory