Attention

注意力机制的演化

RNN

N vs N

输入输出等长

img $$ h_i = f(ax_i + bh_{i-1} + c) $$

N vs 1

输入 N 输出 1

img

1 vs N

输入 1 输出 N

img img

N vs M / Encoder-decoder / Seq2seq(变长)

输入 N 输出 M,如翻译问题,输入输出的单词不等长。

Encoder 将输入编码为 c,再作为输入传入 decoder。

img

LSTM

LSTM 为了解决 RNN 梯度消失问题,在 RNN 结构的基础上:

img

增加了遗忘门,一定概率遗忘上一层隐藏层的状态:

img

GRU

RNN + Attention (Encoder-decoder)

Attention机制通过在每个时间输入不同的c来解决问题

下图是带有 attention 机制的 decoder

img

以 encoder-decoder 翻译任务为例,输入的序列是“我爱中国”,因此,Encoder中的 h1h_1h2h_2h3h_3h4h_4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。在翻译成英语时,第一个上下文 c1c_1 应该和“我”这个字最相关,因此对应的 a11a_{11} 就比较大。c2c_2 应该和“爱”最相关,因此对应的 a22a_{22} 就比较大。最后的 c3c_3h3h_3h4h_4 最相关,因此 a33a_{33}a34a_{34} 的值就比较大。

img

Attention QKV

以下是 attention 机制单独使用的例子。

输入 qq,Memory 中以 (k,v)(k,v) 形式存储需要的上下文,其中 kk 是 question,vv 是 answer,qq 是新来的 question,根据与 qq 相似的历史 kk,带权 vv 求和,输出 cc

计算步骤

  1. 在 Memory 中寻找相似 k(score function):ei=a(q,ki)e_i = a(q,k_i),其中 aa 是打分函数(注意力分布),可选:
    1. 加性模型 a(q,ki)=vTtanh(Wki+Uq)a(q,k_i)=v^T\tanh (Wk_i + Uq)
    2. 点积模型 a(q,ki)=kiTqa(q,k_i)=k_i^Tq
    3. 缩放点积模型 a(q,ki)=kiTqda(q,k_i)=\frac{k_i^Tq}{\sqrt{d}}
    4. 双线性模型 a(q,ki)=xiTWqa(q,k_i)=x_i^TWq
  2. 归一化(alignment function):α=softmax(e)\alpha = softmax(e)
  3. 读取内容(context vector function):c=iαivic = \sum_i \alpha_i v_i

数化简成一个公式:(打分函为缩放点积模型)

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

其中 Attention(Q,K,V)Rn×dv,QRn×dk,KRm×dk,VRm×dvAttention(Q,K,V)\in \mathbb R^{n\times d_v},Q\in\mathbb R^{n\times d_k},K\in\mathbb R^{m \times d_k}, V\in\mathbb R^{m\times d_v}

Self-attention

Q K V 均来自统一输入

Traditional Attention

Attention(Q)=softmax(WTUTQ)QAttention(Q)=softmax(W^T U^T Q)\cdot Q

Attention 总结

img

计算区域

Soft attention:对所有key求权重,进行加权

Hard attention:对一个 key 权重为 1,其余权重为 0。无法求导,因此需要用强化学习。

Local attention:用 hard 方法定位到一个区域,区域内用 soft 方法

所用信息

Genreal attention:

Local attention:

Self attention:如 AutoInt

结构层次

单层 attention:常用方法,用一个 query 对一段原文进行一次 attention

多层 attention:一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务。

多头 attention:《Attention is All You Need》用到了多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention

模型

CNN + attention:

LSTM + attention:

相似度计算

点乘:s(q,k)=qTks(q,k)=q^T k

矩阵相乘:s(q,k)=qTks(q,k)=q^T k

cos 相似度:s(q,k)=qTkqks(q,k)=\frac{q^T k}{|q|\cdot|k|}

串联方式:s(q,k)=concat(q,k)s(q,k)=concat(q,k)

MLP:s(q,k)=vTtanh(aq+bk)s(q,k)=v^T \tanh(aq + bk)

参考

https://zhuanlan.zhihu.com/p/91839581

https://zhuanlan.zhihu.com/p/85038315

蘑菇街推荐算法之迷——Self Attention不如Traditional Attention? https://mp.weixin.qq.com/s/3nTevkiLLaZ6eX7nZWzvTg

本文有帮助?