Self Attention
https://speech.ee.ntu.edu.tw/~hylee/ml/ml2021-course-data/self_v7.pdf
引入
目前说的DNN都是输入一个vector,经过网络得到一个output,但通常也会遇到一些其他场景,输入的vector个数并不固定,比如输入是一段句子、一段声音、一个社交网络或者是图结构的其他形态,不同场景下的输出也有不同要求:
1)每个输入vector对应一个class/scalar,i.e., N to N
如:词性标注、语音领域的音标(phonetic)辨识、推荐任务下对每个样本推荐一个商品
2)多个输入vector输出一个class/scalar,i.e., N to 1
如:情感极性分析
3)多个输入vector输出多个class/scalar,i.e., N to N’
如:翻译任务
Self Attention
着重于解决N to N
的问题,这类问题也被成为Sequence Labeling.
网络架构
要解决Sequence Labeling的问题,最容易想到的就是将被一个Sequence使用FC得到需要的class/scalar,但这没有考虑到Sequence的上下文,比如词性标注任务中 I saw a saw,对于FC来说两个saw是同一个词汇 没有理由输出不同的结果,但我们期待第一个saw是动词 而第二个saw是名词,这会是FC非常的混乱。
考虑上下文语义的信息,最直接的方式可以将Sequence前后的若干vector都输入到一个FC中,在某些场景下(如词性标记)就足以取的比较好的效果。那如果需要考虑一整个sequence的信息的话,就得把整个sequence都输入到FC,但sequence中vector的个数是未知的,需要看整个训练集才能知晓输入到FC的vector数目,这会使FC的参数极其庞大,运算效率低且容易过拟合。
Self Attention可以完美解决这种问题,input vector经过selft attention 变换得到充分考虑sequence信息的输出vector,经过FC输出需要的结果,self attention也可以进行多次变换、对sequence信息进行多次提炼。
self attention会考虑每个输入vector和其他vector的相关性,基于向量之间的相关性来决定输出vector中其他输入vector的比重。首先根据相关性衡量算法获取vector和其他vector的attention score,通过soft max将score做变换,将变换后的结果与对应的vector相乘,得到输入vector经过self attention变换之后的结果。在self attention中通常有三个超参需要学习。
1)attention score
self attention中attention score的方法有两类,dot product和additive,两类方法没有特别的优劣势。方法如下,不做特别赘述
2)self attention变换
设input vector set = ( a 1 , a 2 , a 3 , a 4 ) (a^1,a^2,a^3,a^4) (a1,a2,a3,a4), output vector set = ( b 1 , b 2 , b 3 , b 4 ) (b^1,b^2,b^3,b^4) (b1,b2,b3,b4),以 a 1 − > b 1 a^1-> b^1 a1−>b1为例:
a. 对input vector set 做矩阵变换,计算 a 1 a^1 a1与其他vecoter的相关性
q 1 = W q a 1 q^1=W^q a^1 q1=Wqa1
k 1 = W k a 1 k^1=W^k a^1 k1=Wka1 k 2 = W k a 2 k^2=W^k a^2 k2=Wka2 k 3 = W k a 3 k^3=W^k a^3 k3=Wka3 k 4 = W k a 4 k^4=W^k a^4 k4=Wka4
其中 W q , W k W^q, W^k Wq,Wk是超参,需要网络学习优化。根据变换后的vector,使用dot product计算相关性attention score
α 1 , 1 = q 1 . k 1 \alpha_1,_1=q^1.k^1 α1,1=q1.k1 α 1 , 2 = q 1 . k 2 \alpha_1,_2=q^1.k^2 α1,2=q1.k2 α 1 , 3 = q 1 . k 3 \alpha_1,_3=q^1.k^3 α1,3=q1.k3 α 1 , 4 = q 1 . k 4 \alpha_1,_4=q^1.k^4 α1,4=q1.k4
b. softmax变换,将attention score经过softmax得到 α 1 ′ , i \alpha'_1,_i α1′,i
α 1 ′ , i = exp ( α 1 , i ) / ∑ j exp ( α 1 , j ) \alpha'_1,_i=\exp(\alpha_1,_i)/\sum_{j}\exp(\alpha_1,_j) α1′,i=exp(α1,i)/∑jexp(α1,j)
c. 基于attention score抽取不同向量之间相关性,得到output vector
v i = W v a 1 v^i=W^v a^1 vi=Wva1
b 1 = ∑ i α 1 ′ , i . v i b^1=\sum_{i}\alpha'_1,_i.v^i b1=∑iα1′,i.vi
其中
W
v
W^v
Wv是网络学习优化的超参。
d. 矩阵运算。self attention操作的都是向量之间的运算,因此在gpu可以使用矩阵加速运算。
设input vector set = I,
W
q
,
W
k
,
W
v
W^q,W^k,W^v
Wq,Wk,Wv是超参,self 变换的矩阵操作如下:
Multi-Head Self Attention
Multi-head self attention在self attention的基础上考虑向量之间的不同类型的关系。在对input vector set中不同vector生成多个 q i , k i , v i q^i,k^i,v^i qi,ki,vi, 分别计算出 b i , j b^i,^j bi,j,然后增加一个超参 W o W^o Wo,将 b i , j b^i,^j bi,j合并为统一的 b i b^i bi.
Position Encoding
self attention虽然能够表达不同输入向量之间的相互关系,但没有记录向量之间的位置信息,然而vector之间的顺序在某些场景是非常重要的。为了弥补这个缺陷,通过postional encoding的技术在self attention中加入位置信息。具体做法是,构造一个表示顺序的向量 e i e^i ei,与inpout vector相加,在self attention中加入句子的顺序。
e i e^i ei 可以通过hand crafted,也可以通过从数据中学习得到。
selft attention vs CNN
先说结论:self attention是复杂版本的CNN,后续待补充
selft attention vs RNN
self attention相对于RNN更具优势,一方面来说self attention包含对其他所有vector的相关性信息,另一方面对于相关信息的计算可以实现并行,效率更优。RNN的优势在于天然包含顺序信息,这个优势在self attention加入positional encoding之后也不复存在