李宏毅深度学习——self-attention

写在前面

这个是李宏毅深度学习self-attention部分的内容,祝大家学习快乐!

笔记部分

引例

我们先来看这样一个例子:我现在在训练时想要表示一个句子,并将这个句子作为训练集,那么我们应该怎么做?

比如说,我就想“This is a cat”该怎么表示呢?

有些人可能有一种思路

将This is a cat 作为四个向量来分别输入,也就是说,如果全世界所有的英语词汇有10万个(假设),那么我们可以有这样一个方式:

理论上,这个的确是一个很好的思路,我们可以编写一个映射,把一本牛津词典里的所有词汇都映射成相应向量,不必说一定是单位向量,只要这些向量都线性无关都是可以的一种方案。并且,我们如果想要告知这个词的某些信息和某些相似信息我们甚至可以做一些类似于聚类的操作:

恭喜你成功发明了One-hot encoding 和 word embedding!

但是,如果就这样处理完的话,未免过于草率

我们来看这样一个例子:

这两个“saw”由于拼写,发音全部相同,我们在理解这个句子时往往需要根据词性来判断这个第二个“saw”的含义应该是作名词时的“锯子”而不是我们常常说的“see”的过去式。这种情况在英语甚至其他各个语言中都很常见。这种情况我我们该怎么办呢?

好了,我们现在知道了我们这个训练一个处理语言的模型遇到的第一个阻碍就是,输入应该怎么输入。

好了,我们假设以某种方式输入了这句话,我们可能需要这个模型输出一些什么。我们先不要管那些流行的chatGPT达到的那种自由交流的程度,这个输出甚至可以作为下一层的输入来做一些其他的更有意思的东西。我们可以总结一下一句话中每个词的词性,比如我们还是“I saw a saw”

这个就叫做POS Tagging

我们对于每个输入的词汇,都有一个输出的对应的词性,对于每一个词都会输出一个词性,我们称之为Label。

Label不一定是一一对应的,也有可能是这样的:

比如说,我们对一句话做情绪分析:“This is good (positive)”,这个就很类似于归类了

还有一种情况,就是label数是由这个模型自己决定的,一个典型的例子就是ai翻译,这个就是seq2seq(sequence to sequence)

总结一下这三种输出情况:

好了,对于我们的引例,我们现在可以知道我们今天的目标是输入什么,输出什么,那么我们现在最主要的问题就是怎么处理类似“I saw a saw”这种问题。对于这种问题,我们显然是要考虑上下文的?这就要引出我们的主角:self-attention

self-attention

如图:

对于每一个输入,我们更想让我们的模型看到的是附带与其他词汇关系的一个输入,就是说,我们可以让我们的模型知道,比如说I  saw a saw中,I 与saw的关系比如说很高,决定了它应该是主语。也就是说,我们想让我们这个self-attention层做这样的事情:

诶,看到这先别慌,这个图对于任何一个刚接触到这个图的人来说都是十分头疼的。我们来解释一下这个图:

我们先来说一下q和k,其中,q是query,k是key。我们构造出两个向量,这两个向量里面的所有参数都是weight,也就是说,这些参数都是我们要训练的。我们先取其中一个,比如如图,我们取第一个,我们计算出第一个的向量a1和q1,并且计算出其他的k2,k3,k4,然后相乘并且softmax,这个alpha‘就是我们想要的a1与其他三个词之间的关联性。

然后就是最“魔幻”的操作,也就是这个V(value)矩阵:

每一个都乘以value向量,然后乘以alpha‘,最后加起来,这个就相当于一个bias。

上面这一大堆过程用“Attention is all you need“中的话就是:

其中,这个根号dk就是一个缩放因子,为了输出的更好,但是现在比较流行的像是dot-product attention就没有用这个因子。

这个输出b就是我们要的结果,将这个结果传到后面的层

如果我们将矩阵I作为输入,矩阵O作为输出,则有:

其中,矩阵Wq,Wk,Wv三个为需要训练的参数。

multi-head self-attention

这个就是并行的多个W矩阵的更新,详细说来就是这个过程:

在多头注意力机制中,输入序列首先被转换为嵌入向量,然后通过不同的线性变换层生成查询(Query)、键(Key)和值(Value)向量。这些向量被分割成多个部分,每个部分对应一个注意力“头”。每个头独立地执行注意力计算,包括点积注意力、缩放、softmax归一化和加权求和。最后,所有头的输出被合并(通常是拼接),并通过一个额外的线性变换整合,得到最终的注意力输出向量。

如果不太严谨的理解的话,我们可以用李宏毅老师的这张图来表示:

这个就是self-attention的全部内容

拓展部分

Encode Position

简单来说,encode position就是另加一个向量来记录这个词的所在位置

我们先来说一下Transformer原文中提到的三角函数编码:

在原始的Transformer模型中,位置编码是通过正弦和余弦函数来生成的,这种方法被称为绝对位置编码(Absolute Positional Encoding)。每个位置的编码是唯一的,并且编码向量的每个维度都是通过正弦和余弦函数的值来计算的。具体来说,对于位置pos和维度i,位置编码的第i维度的值由以下公式给出:

如果i是偶数/奇数

其中,dmodel是模型的隐藏层大小,pos 是位置索引,i 是维度索引。这种编码方式使得模型可以通过位置编码来区分不同位置的元素,并且由于三角函数的周期性,模型能够处理比训练时使用的位置编码序列更长的序列。

李宏毅老师上课讲了一个比较新的方法FLOATER:

FLOATER的核心思想是使用常微分方程(Neural ODE)来描述位置编码的动态变化。在训练过程中,通过求解这个微分方程,可以得到每个位置的位置编码。这种方法允许模型在每一层都注入位置信息,而不会增加额外的参数量。

他那个微分方程长这样(我也不太理解):

他并且还提出这种编码方式与原来的transformer的编码方式有一定的兼容性。

原文链接:https://arxiv.org/pdf/2003.09229

X-former

在Transformer之后,又有许多科学家提出了改进版,也就被称为“X-former”,在“Efficient Transformers: A Survey”这篇综述论文里,他回顾了以往比较知名的改进版:

  1. Memory Compressed Transformer:通过局部注意力跨度和记忆压缩注意力来减少复杂度。
  2. Image Transformer:受到卷积神经网络的启发,将自注意力的感受野限制在局部邻域。
  3. Set Transformer:适应集合输入问题,通过稀疏高斯过程降低注意力复杂度。
  4. Transformer-XL:通过段级递归机制连接多个段和块。
  5. Sparse Transformer:使用固定模式的组合,如局部窗口和固定步长的块模式。
  6. Reformer:基于局部敏感哈希(LSH)的高效注意力模型。
  7. Performer:通过核方法避免显式计算N×N的注意力矩阵。
  8. Big Bird:使用全局记忆和滑动窗口注意力来处理长序列。

原文链接:https://arxiv.org/pdf/2009.06732

其他拓展

由于这部分没有讲RNN与CNN,所以我就把原文链接放在这,感兴趣的同学可自行阅读:

https://arxiv.org/pdf/2011.04006 (LONG RANGE ARENA: A BENCHMARK FOR EFFICIENT TRANSFORMERS)

https://arxiv.org/pdf/2006.16236 (Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention)

https://arxiv.org/pdf/2010.11929 (AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE)

https://arxiv.org/pdf/1911.03584 (ON THE RELATIONSHIP BETWEEN SELF-ATTENTION AND CONVOLUTIONAL LAYERS)

写在后面:

本期的内容就到这里了,祝大家学习愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值