0%

Self-Attention学习笔记

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

1

self-attention是可以叠加的。

屏幕截图 2025-04-09 230013


2. self-attention是这样运作的:

第一步,根据a1,找到sequence里面与a1相关的向量。

屏幕截图 2025-04-09 230419

关联程度α是不同的,计算方法有这样一些:

可以对两个向量乘上不同的矩阵Wq和Wk,得到q和k后,求点积。(要算谁的α,谁就是q)

屏幕截图 2025-04-09 230739

另一种方法是

屏幕截图 2025-04-09 230857

接下来的讨论,都用点积 的方法。

所以,self-attention的过程就是:

屏幕截图 2025-04-09 231156

其实,q1也会和自己算,这是很重要的。

屏幕截图 2025-04-09 231243

然后,加上softmaxnormalization ,李老师说用其他的层似乎也行。

屏幕截图 2025-04-09 231317

现在,根据α来抽取重要信息。(注意,相乘的是α’,是已经经过softmax层的α’)

v(value)是a与Wv相乘得到的向量。

屏幕截图 2025-04-09 231539

简单说,谁的α得分越大,抽出来的越相关。


3. 真实的过程

现在,看看真实的过程。事实上,把所有的q视为矩阵Q,所有的a视为矩阵I(input),就有

屏幕截图 2025-04-10 100334

同理,对于k,v,

屏幕截图 2025-04-10 100607

实际上,Wv经常会用两个矩阵的相乘来得到,看起来像:

屏幕截图 2025-04-11 193042

对于求α1,就是右侧的形式

屏幕截图 2025-04-10 101120

那么,考虑整个α1、α2、α3……,并通过softmax,过程就是

屏幕截图 2025-04-10 101709

那对于b的计算,就是矩阵O

屏幕截图 2025-04-10 102436

完整的过程就是

屏幕截图 2025-04-10 102617

由此可知,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也相应应该有两个。方法都是乘上矩阵得到。

屏幕截图 2025-04-10 103943

接下来的多头self attention操作和刚刚是一样的,得到了bi1、bi2等:

屏幕截图 2025-04-10 104634

现在把bi1与bi2接起来,与Wo相乘,得到bi。


5. Positional Encoding

然而,self attention还是少了一个很重要的资讯:向量的位置信息。对于刚刚的操作,input1与input4的距离和input1与input2的距离“一样”。一个例子是POS tagging任务中,某种词性可能不会出现在句首,但这个信息在刚才的操作中无法得到。

我们用Positional Encoding来处理这个问题。为每一个input设定一个专属的vector ei,再把它加到ai上去。

屏幕截图 2025-04-10 110142

注意,右图展示了每个位置的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来优化计算和内存消耗。不要看“一整句话”,看一小部分即可,就是:

20

至于要看的范围有多大,是人设定的。

2.图像

self-attention也可以应用在图像上。我们将一张图片看成一个vector set。这个例子:

21

把图片看成大小为5×10×3的tensor,然后,

22

把一个像素看成一个三维的向量。整张图就是5×10个这样的向量。有这样两个例子利用self-attention来处理图片:

23

回顾一下图像处理常用的CNN,并与self-attention作比较,有这样的总结:

  • CNN是简化版的self-attention的特例,因为在CNN中,只考虑filter里的信息,但是self-attention考虑全局信息。
  • 也可以说,self-attention 是 with learnable receptive field 的 CNN,意思是说卷积核不是固定的,不再人工划定receptive field。
  • 这篇论文里,作者告诉我们,设定特定的自参数注意力,它可以做到和CNN一模一样的事。

24

但是,self-attention作为比CNN更flexible的model,就需要更多的data进行训练,否则会比CNN更加overfitting。ViT的论文指出,在不同数据量的data下,CNN与self-attention的效果不同。

25

3. 与RNN比较

回顾一下RNN,并与self-attention作比较。

26

对于RNN,最右侧的难以考虑到最左边的input,但self-attention就没有这个问题。还有,RNN不是平行处理的,要等前面的先算完,但可以平行处理。

27

self-attention也可以用在Graph上。其中,attention matrix可以不用机器自己去找了。根据我的算法知识,右图的attention matrix是在一个邻接矩阵上扩展出来的。

28

这是一种GNN。