Self-Attention学习笔记
嗯!我已经看过了关于Self-Attention的讲解视频与论文,现在,我想基于李宏毅老师的视频,再仔仔细细地把知识整理一遍!
1. 先来看看自注意力机制概况。
我之前跟刘二大人学习时,已经了解了one-hot独热编码 ,但是独热编码无法看出来向量之间的关系 。现在,word embedding词嵌入 解决了这样的问题。
我们之前学习的回归、分类任务,都是输入的大小与输出相同的 。这里引入seq2seq任务 ,这种任务的模型会自己决定输出label的长度大小。
注意哦,接下来的“自注意力”课程是关注sequence labeling 任务的,输入和输出长度相等。
先回忆,全连接层(FC层)有什么缺点? 全连接层想要观察不同输入vector之间的关系时,必须要扩大同时接入FC层的Windows ,显然在windows很大时是不合适的,会出现过拟合的问题。因此,引入自注意力机制来解决。
self-attention会吃一整个sequence,针对每个向量,input几个vector就输出几个vector,输出的vector可以理解为对于每个原来的vector,考虑了一整个sequence之后,成为了with context的vector 。
self-attention是可以叠加的。
2. self-attention是这样运作的:
第一步,根据a1,找到sequence里面与a1相关的向量。
关联程度α是不同的,计算方法有这样一些:
可以对两个向量乘上不同的矩阵Wq和Wk,得到q和k后,求点积。(要算谁的α,谁就是q)
另一种方法是
接下来的讨论,都用点积 的方法。
所以,self-attention的过程就是:
其实,q1也会和自己算,这是很重要的。
然后,加上softmax 来normalization ,李老师说用其他的层似乎也行。
现在,根据α来抽取重要信息。(注意,相乘的是α’,是已经经过softmax层的α’)
v(value)是a与Wv相乘得到的向量。
简单说,谁的α得分越大,抽出来的越相关。
3. 真实的过程
现在,看看真实的过程。事实上,把所有的q视为矩阵Q,所有的a视为矩阵I(input),就有
同理,对于k,v,
实际上,Wv经常会用两个矩阵的相乘来得到,看起来像:
对于求α1,就是右侧的形式
那么,考虑整个α1、α2、α3……,并通过softmax,过程就是
那对于b的计算,就是矩阵O
完整的过程就是
由此可知,self-attention layer里面唯一需要学习的参数是Wq、Wk和Wv。在GPT-3里,它们占据了全部权重的1/3(总共175,181,291,520个权重,Q、K、两种V含有57,982,058,496个权重)。接下来,我要学习Multi-head Self-attention了。
4. Multi-head Self-attention
李老师讲解Multi-head Self-attention时,以2 heads作为例子。我们是用q去找相关的k,但是“相关”应该有很多种不同的形式。那么,对于一个input vector,就不应该只有一个q。不同的q负责不同种类的相关性。如何得到?用原来的qi乘上另外两个矩阵,得到qi1、qi2。既然有两个q,那k、v也相应应该有两个。方法都是乘上矩阵得到。
接下来的多头self attention操作和刚刚是一样的,得到了bi1、bi2等:
现在把bi1与bi2接起来,与Wo相乘,得到bi。
5. Positional Encoding
然而,self attention还是少了一个很重要的资讯:向量的位置信息。对于刚刚的操作,input1与input4的距离和input1与input2的距离“一样”。一个例子是POS tagging任务中,某种词性可能不会出现在句首,但这个信息在刚才的操作中无法得到。
我们用Positional Encoding来处理这个问题。为每一个input设定一个专属的vector ei,再把它加到ai上去。
注意,右图展示了每个位置的ei。ei不是训练出来的,而是人为设置的,通过规则产生。
其中,在原始的 Transformer 论文《Attention is All You Need》中,位置编码是通过正弦和余弦函数生成的,具体形式为:
$$
对于每个位置 pos 和每个维度 i,位置编码 PE 由正弦和余弦函数生成:
$$
$$
PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)
$$
$$
PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)
$$
$$
其中: pos 是词在序列中的位置(例如,第一个词的位置是 0,第二个是 1,依此类推)。
$$
$$
i 是位置编码的维度索引。 d 是位置编码的总维度(即每个词的表示维度)。
$$
此外,还有很多关于position encoding的新方法论文。而接下来,李老师讨论了一些自注意力的应用。
6. 应用
1. 语音
在做语音的self attention时,为了防止矩阵过大,利用Truncated Self-attention来优化计算和内存消耗。不要看“一整句话”,看一小部分即可,就是:
至于要看的范围有多大,是人设定的。
2.图像
self-attention也可以应用在图像上。我们将一张图片看成一个vector set。这个例子:
把图片看成大小为5×10×3的tensor,然后,
把一个像素看成一个三维的向量。整张图就是5×10个这样的向量。有这样两个例子利用self-attention来处理图片:
回顾一下图像处理常用的CNN,并与self-attention作比较,有这样的总结:
- CNN是简化版的self-attention的特例,因为在CNN中,只考虑filter里的信息,但是self-attention考虑全局信息。
- 也可以说,self-attention 是 with learnable receptive field 的 CNN,意思是说卷积核不是固定的,不再人工划定receptive field。
- 在这篇论文里,作者告诉我们,设定特定的自参数注意力,它可以做到和CNN一模一样的事。
但是,self-attention作为比CNN更flexible的model,就需要更多的data进行训练,否则会比CNN更加overfitting。ViT的论文指出,在不同数据量的data下,CNN与self-attention的效果不同。
3. 与RNN比较
回顾一下RNN,并与self-attention作比较。
对于RNN,最右侧的难以考虑到最左边的input,但self-attention就没有这个问题。还有,RNN不是平行处理的,要等前面的先算完,但可以平行处理。
self-attention也可以用在Graph上。其中,attention matrix可以不用机器自己去找了。根据我的算法知识,右图的attention matrix是在一个邻接矩阵上扩展出来的。
这是一种GNN。