self-attention
应用场景
self-attention也是一个常见的neural network框架,用来解决输入是一组向量并且向量的个数是不确定的问题。例如:
- 文本处理
- 语音识别
- Drug discovery
self-attention的输出有以下3种情况:
- 每个向量都有一个标签,即输出跟输入数目一样。具体应用:词性标注、推荐系统。
- 整个sequence只输出一个标签。具体应用:语义分析、说话人识别、图片(分子结构图)识别。
- 输出的标签个数不确定。具体应用:机器翻译。
为什么要使用Self-attention?
对于输出与输入数目相同的情况,这种问题也称作Sequence Labeling问题。例如对句子I saw a saw
中的单词进行词性标注,在这句话中,第一个saw
是动词,第二个saw
是名词。如果使用全连接网络来处理,有两种方法:
- 逐个向量处理。这种方法的缺陷是,它无法利用序列的上下文信息,全连接网络对于任意位置
saw
的词性预测结果必然是一样的。 - 考虑上下文信息,即在对
saw
进行词性标注时,设置一个window同时将前面几个单词和后面几个单词考虑进来。但是由于句子长度的不确定性,window设置过小,则不能将长句子中的所有单词考虑进来;window设置过大,又会使得网络参数太多,导致过拟合。
为了将整个句子的信息考虑进来,就要用到self-attention技术。self-attention网络结构:
self-attention对于每个向量都会考虑整个sequence的信息后输出一个向量。
Self-attention计算过程
计算两个向量相关性的方法:
- 点乘运算(dot product)。最常用的方法。输入向量分别乘上两个不同的矩阵 W q W_{q} Wq 和 W k W_{k} Wk 得到向量 q q q 和 k k k ,再把 q q q 和 k k k 做点乘。 a i a_{i} ai 和 a j a_{j} aj 的相关度 α i , j = ( a i W q ) . ( a j W k ) \alpha_{i,j} = (a_{i}W_{q}) . (a_{j}W_{k}) αi,j=(aiWq).(ajWk) 。
- 加性运算(additive)。不对 q q q 和 k k k 做点乘,而是串联起来后使用 t a n h tanh tanh 函数激活。 a i a_{i} ai 和 a j a_{j} aj 的相关度 α i , j = t a n h ( ( a i W q ) + ( a j W k ) ) \alpha_{i,j} = tanh((a_{i}W_{q}) + (a_{j}W_{k})) αi,j=tanh((aiWq)+(ajWk)) 。
在self-attention中,计算attention的步骤:
- 计算 q u e r y query query,即当前向量与 W q W_{q} Wq 的乘积。计算方法 : q i = W q a i q_{i} = W_{q}a_{i} qi=Wqai。
- 计算 k e y key key,即其他向量与 W k W_{k} Wk 的乘积 。计算方法: k j = W k a j , k ∈ [ 1 , n ] k_{j} = W_{k}a_{j}, k\in[1, n] kj=Wkaj,k∈[1,n]。
- 计算attetion score ( α \alpha α),即当前向量与其他向量的相关性。计算方法: α i , j = q i . k j \alpha_{i, j} = q_{i}.k_{j} αi,j=qi.kj。通常情况下,也需要计算向量和自己的相关性 。
- 分数正则化(normalization)。使用softmax函数激活 α \alpha α得到 α ′ \alpha' α′(也可以使用其他激活函数)。$\alpha’{i, j} = softmax(\alpha{i, j})。
- 计算 v a l u e value value 。根据 α ′ \alpha' α′抽取sequence中重要信息。计算方法 : v j = W v a j v_{j} = W_{v}a_{j} vj=Wvaj
- 计算输出向量 b i b_{i} bi。计算方法 : b i = ∑ j = 1 n α i , j ′ . v j b_{i} =\sum_{j=1}^n\alpha'_{i, j}.v_{j} bi=∑j=1nαi,j′.vj。
self-attention中输出向量是同时计算出来的,不需要按序计算。
以上步骤使用矩阵操作的方式可以简单描述为:
- 根据输入向量
I
计算Q、K、V
。 - 计算分数及正则化。
- 计算输出向量
O
。
从这个计算过程可以看出,self-attention需要训练的参数只有
W
q
、
W
k
和
W
v
W_{q}、W_{k}和W_{v}
Wq、Wk和Wv。
Positional Encoding
到目前为止,self-attention中没有位置信息,它不知道每个向量在sequence中的位置是什么,也不知道两个向量间的距离是多少,但是位置信息有时候也是比较重要的。例如,在词性标注问题中,也许动词在句首出现的可能性比较低。
因此,当你认为你处理的问题中,位置信息比较重要,就需要用到positional encoding
技术,也就是为每一个输入向量
a
i
a_i
ai 加上一个代表位置的向量
e
i
e_i
ei ,告诉self-attention位置的信息。
位置变量的设计:
- 人工设计(hand-crafted)。
- 从数据中学习(研究中)。
【相关论文】
Self-attention的变体
Multi-head Self-attention
在要解决的实际问题中,计算相关性时可能会需要计算多个种类的相关性,这个时候就需要设置多个q
,每个q
负责一个种类的相关性,相应的k、v
也需要多个。这里q、k、v
的个数即head
的个数。
attention计算过程:
- 计算
Q、K、V
后,分别乘上另外n
(n表示head个数)个矩阵,得到 Q 1 , n 、 K 1 , n 、 V 1 , n Q_{1, n}、K_{1, n}、V_{1, n} Q1,n、K1,n、V1,n。 - 计算分数和正则化。对每个
Q、K、V
的计算过程与self-attention相同。 - 计算输出。将得到的
n
个O
乘以向量 W o W_o Wo得到最终输出。
Truncated Self-attention
适用于计算attention
时不需要考虑整个sequence,只需要考虑sequence中的一个小范围的问题。这个时候使用Truncated Self-attention
可以加快运算速度。
【相关论文】
- self-attention各种变体的比较:Long Range Arena: A Benchmark for Efficient Transformers_2011
- self-attention各种变体的介绍:Efficient Transformers: A Survey
Self-attention与其他神经网络的比较
Self-attention v.s. CNN
CNN的每个神经元只考虑一个感受野(receptive field)中的信息,Self-attention考虑的整张图片的信息。
- CNN是简化版的Self-attention。
- Self-attention是复杂化的CNN。
【相关论文】
- Self-attention与CNN的关系: On the Relationship between Self-Attention and Convolutional Layers_1911
- Self-attention与CNN模型的比较:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale_2010
Self-attention v.s. RNN
不同点:
- RNN在输出一个向量时需要考虑的向量必须在memory(记忆)中,Self-attention只需要一个
q
和一个k
就可以了。 - RNN在处理输入的多个向量时不能并行处理,Self-attention可以并行处理所有输出。
【相关论文】
Self-attention v.s. GNN
to do…
Self-attention的其他应用
图像(image)处理
【相关论文】
- Self-attention GAN。Self-Attention Generative Adversarial Networks_1805
- DEtection Transformer(DETR)。End-to-End Object Detection with Transformers_2005
比较self-attention与CNN
图(graph)结构数据处理
比较self-attention与GNN