文章目录
1. Summary
1.1 心理学背景
心理学框架:
你的面前有黑白色的报纸、A4纸、书本,和一个红色杯子
由于红色杯子很显眼,你一眼就会注意到它,不需要思考,所以它是不随意线索
如果你想看报纸,所以你看到了报纸,所以这个报纸是随意线索
1.2 注意力机制概述
- 卷积、全连接、池化层都只考虑不随意线索(直接把最大的值抽出来)
- 注意力机制考虑随意线索
- 随意线索被称为查询(query)
- 每个输入是一个值(value)和不随意线索(key)的对
- 通过注意力池化层,根据query,有偏向(权重)地去选择某些输入
- 一般写作 f ( x ) = ∑ i α ( x , x i ) y i f(x)=\sum_{i}\alpha(x, x_i)y_i f(x)=∑iα(x,xi)yi,此处的 α ( x , x i ) \alpha(x, x_i) α(x,xi)是注意力权重
1.3 非参注意力池化层
非参即不学习参数
首先给定数据(Xi,Yi)
最简单的方案是平均池化:f(x) = ΣYi/n
Nadaraya-Watson核回归:
更好的方案是Nadaraya-Watson核回归:K是衡量x和xi的函数,式子的目的是找出和y最相近的数字
使用高斯核: K ( u ) = 1 2 e x p ( − u 2 2 ) K(u)=\frac{1}{\sqrt 2}exp(-\frac{u^2}{2}) K(u)=21exp(−2u2)
则
f ( x ) = ∑ i = 1 n e x p ( − 1 2 ( x − x i ) 2 ) ) ∑ j = 1 n e x p ( − 1 2 ( x − x i ) 2 ) ) y i = ∑ i = 1 n s o f t m a x ( − 1 2 ( x − x i ) 2 ) y i f(x)=\sum_{i=1}^n\frac{exp\Big(-\frac{1}{2}(x-x_i)^2)\Big)}{\sum_{j=1}^nexp\Big(-\frac{1}{2}(x-x_i)^2)\Big)}y_i\newline=\sum_{i=1}^nsoftmax\Big(-\frac{1}{2}(x-x_i)^2\Big)y_i f(x)=i=1∑n∑j=1nexp(−21(x−xi)2))exp(−21(x−xi)2))yi=i=1∑nsoftmax(−21(x−xi)2)yi
1.4 参数化的注意力机制
在之前学习的基础上引入可以学习的w
f ( x ) = ∑ j = 1 n s o f t m a x ( − 1 2 ( ( x − x i ) w ) 2 ) ) y i f(x)=\sum_{j=1}^nsoftmax\Big(-\frac{1}{2}((x-x_i)w)^2)\Big)y_i f(x)=j=1∑nsoftmax(−21((x−xi)w)2))yi
2. 注意力分数
上述提到的 f ( x ) = ∑ i = 1 n s o f t m a x ( − 1 2 ( x − x i ) 2 ) y i f(x)=\sum_{i=1}^nsoftmax\Big(-\frac{1}{2}(x-x_i)^2\Big)y_i f(x)=∑i=1nsoftmax(−21(x−xi)2)yi,其中的 1 2 ( x − x i ) 2 \frac{1}{2}(x-x_i)^2 21(x−xi)2就是注意力分数
假设query q,有m对key-value(k,v)
则注意力池化层为:
f ( q , ( k 1 , v 1 ) , ⋅ ⋅ ⋅ , ( k m , v m ) ) = ∑ i = 1 m s o f t m a x ( α ( q , k i ) ) v i f\Big(q,(k_1,v_1),···,(k_m,v_m)\Big)=\sum_{i=1}^msoftmax\Big(\alpha(q, k_i)\Big)v_i f(q,(k1,v1),⋅⋅⋅,(km,vm))=∑i=1msoftmax(α(q,ki))vi,其中的 α ( q , k i ) \alpha(q, k_i) α(q,ki)就是注意力分数
Additive Attention
query、key长度不一致
可学参数: W k , W q , v W_k,W_q,v Wk,Wq,v
α ( q , k i ) = v T t a n h ( W k h + W q q ) \alpha(q, k_i)=v^Ttanh(W_kh+W_qq) α(q,ki)=vTtanh(Wkh+Wqq),h为激活函数
等价于把query和key合并起来后放入到一个隐藏大小为h,输出大小为1的单隐藏层MLP
Scaled Dot-Product Attention
query、key长度一致
长度为d,尖括号为内积,即求两个向量夹角余弦值
α ( q , k i ) = ⟨ q , k i ⟩ / d \alpha(q, k_i)=\langle q,k_i \rangle/ \sqrt d α(q,ki)=⟨q,ki⟩/d
向量版本:
α ( Q , K ) = Q K T d \alpha(Q, K)=QK^T\sqrt d α(Q,K)=QKTd
3. 使用注意力机制的seq2seq
seq2seq详见我的另一个文章
在机器翻译中,每个生成的词可能相关与源句子中不同的词
而seq2seq模型中,解码器的初始隐状态是编码器最后时间步的隐状态,看不到前面词语的输入,因此不能直接建模,所以需要向其中加入注意力机制
- 编码器对每次词的输出作为key和value
- 解码器RNN对上一词的输出是query
- 注意力的输出和下一个词的词嵌入合并进入RNN
因为RNN的输出都是在同一个语义空间中,key和value是RNN的输出,所以用解码器RNN的输出而不是embedding的输入
4. self-attention自注意力
给定序列 x 1 , ⋅ ⋅ ⋅ , x n x_1,···,x_n x1,⋅⋅⋅,xn
自注意力池化层将 x i x_i xi又当key,又当value,又当query来对虚列抽取特征得到 y 1 , ⋅ ⋅ ⋅ , y n y_1,···,y_n y1,⋅⋅⋅,yn,其中 y i = f ( x i , ( x 1 , x 1 ) , ⋅ ⋅ ⋅ , ( x n , x n ) ) y_i=f\Big(x_i,(x_1,x_1),···,(x_n,x_n)\Big) yi=f(xi,(x1,x1),⋅⋅⋅,(xn,xn))
CNN、RNN和自注意力都可以用于处理序列
CNN:把序列当作一维的数据
CNN | RNN | 自注意力 | |
---|---|---|---|
计算复杂度 | O ( k n d 2 ) O(knd^2) O(knd2) | O ( n d 2 ) O(nd^2) O(nd2) | O ( n 2 d ) O(n^2d) O(n2d) |
并行度 | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) | O ( n ) O(n) O(n) |
最长路径 | O ( n / 2 k ) O(n/2k) O(n/2k) | O ( n ) O(n) O(n) | O ( 1 ) O(1) O(1) |
位置编码
跟CNN、RNN不同,自注意力不记录位置信息,想要加入位置信息,则需要位置编码
位置编码将位置信息注入到输入中
假设位置编码矩阵为P,序列为X,则X+P作为自编码输入