Transformer——Attention怎么实现集中注意力

0 阅读7分钟

Transformer系列文章:

一览Transformer整体架构

本文章是该系列的第二篇文章,在介绍Attention Block之前,我先介绍一下点积在衡量向量间的对齐度的作用和softmax。

从计算上看,点积是将所有的对齐分量相乘并累加;从几何上看,当向量指向相似方向时,点积为正,如果向量垂直,点积为0,当向量方向相反时则为负数。

假设我们用embedding(cats)-embedding(cat),我们主观的会认为得到了可以表示复数的向量,为了测试这一点,把这个结果向量和各种单复数名词进行点积,可以看到和复数的点积结果要比和单数的点积结果要高,并且在和one,two,three,four进行点积得到的结果是递增的。

transformer block最终得到一个数字序列作为概率分布,代表所有可能的下一个单词的分布,所有值都应该在 0 到 1 之间,并且加起来都应该为 1。然而,在深度学习中,我们所做的其实是矩阵向量积,得到的输出并不满足上面的条件。

Softmax 将任意数字列表转换为有效分布,这样最大值最终最接近 1,较小的值最终更接近 0。

它的工作原理是首先将输出向量中的每个数字进行e地幂次方,这会将所有的值变为正值,然后把所有这些新项的总和除以这个总和,这样就会把它归一化成一个总和为 1 的列表。

之所以称它为 softmax,是因为它不是简单地提取出最大值,而是生成一个分布,该分布为所有相对较大的值提供权重,与它们的大小相称,相对于max更加的soft。

下面我们就开始注意力的学习。

Transformer的论文名称叫做Attention__ is All You Need, 所以可以看出注意力机制起到了至关重要的作用。

我们看一下下面三个短句:

  • American shrew mole.
  • One mole of carbon dioxide.
  • Take a biopsy of the mole.

其中的mole意思都不相同,他们的含义取决于上下文,分别代表鼹鼠、摩尔和痣,但是在transformer的第一步将每个token变成embedding后他们的向量是相同的,只有在transformer的下一步中,也就是attention中,周围的embedding才会将信息进行传递并更新mole的embedding的值。

举一个例子,考虑单词 tower 的embedding。表示的大概率是空间中一些非常通用的、非特定的方向,与许多又高又大的名词相关联。

如果tower 前面还有Eiffel,那么向量应该指向一个更具体地表示埃菲尔铁塔的方向,可能与巴黎和法国相关的向量以及铁制的东西相关。

如果它前面还有单词 miniature,那么向量应该进一步更新,使它不再与大而高的事物相关。

我们先描述一个注意力头,之后再介绍注意力块是如何由并行运行的不同的头组成的。

同样我们还是举一个例子,我们的输入是

A fluffy blue creature roamed the verdant forest.

我们目前想让根据形容词调整相应的名词的embedding。

每个单词的初始embedding是一些高维向量,包含单词的编码和位置编码。我们用E表示这些向量。

如上图所示,我们的目标是经过计算产生一组新的embedding,这些新的embedding从前面的形容词中提取了相应的含义。

对于注意力块的第一步,我们可以想象每个名词都在问一个问题:“我前面有什么形容词吗?”,这些问题被编码为另一个向量,称为Query,这个Query是每个token的embedding和一个矩阵WQ 相乘得到的,查询向量记作Q。其中的WQ 是模型的参数,是在数据中学习的。

同时,每个embedding乘以矩阵Wk,得到我们成为Key的向量,这些Key是那些Query的潜在答案。

我们希望Query和Key对齐时进行匹配,我们衡量给定的一对 key 和 query 向量的对齐程度的方法就是我们在文章开头介绍的点积。较大的点积对应于更强的对齐。

在我们举的例子中,fluffyblue 生成的key与 creature 生成的query点积较大,所以他们的相关性更高。相比之下,其他单词(如 the)的key与单词 creature 的query之间的点积将是一些小值或负值,这反映出这些单词彼此无关。

在计算所有的key和value的点积之后,我们得到一个矩阵,其中的数值表示每个单词和其他的单词的相关性的大小。

接下来我们就要用到文章开头介绍的softmax函数了,将 softmax 应用于所有列,得到最终的相关性矩阵。

transformer论文中用了一个公式来表示注意力机制,在这里,变量Q和K分别表示查询向量和键向量的完整数组,即通过将embedding乘以WQ和Wk获得的较小向量。

在等式的右侧,softmax 函数中的分子KTQ是所有key-value对之间的点积。其中除以√dk是为了数值稳定性。

对于注意力机制,我们希望在进行计算时后面的单词不会影响前面的单词,因为在进行单词预测时前面的单词是看不到后面的单词的,为了防止这种情况,强制相关性矩阵下半部分为负无穷大。这样在应用 softmax 之后,所有这些点都变为零。这个过程成为masking。

至此我们就得到了描述哪些词与更新哪些其他词相关的注意力矩阵,下一步就要进行更新了。

这时候就引入了除了Query和Key之外的第三个向量,Value向量,同样我们用到了一个矩阵WV,我们将这个矩阵乘以前面单词的embedding,得到的就是Value向量,也就是我们更新第二个单词要用到的向量,在这个例子中,我们就要把fluffy编码到creature中。

WV乘以每一个embedding,产生一个Value向量集合,我们将每个Value向量乘以我们前面得到的目标列的相关性权重,累加得到我们想要进行的更改ΔE,添加ΔE到原始embedding中,得到一个优化的向量E′编码了上下文更丰富的含义。

这个操作应用于每一列生成优化的embedding。至此,我们的注意力模块中进行的操作就到此结束,可以看到注意力机制核心是三个不同的矩阵参数化,WQ,WK,WV

在实际应用中使用的是多头自注意力机制,多头自注意力中每个head都有自己的Query,Key和Value,并且并行运行

注意力机制的总体思路是,通过并行运行许多不同的 head,使模型能够学习上下文改变含义的许多不同方式。

以上就是Attention机制的所有学习内容啦,码字不易,点个关注吧~

关于深度学习和大模型相关的知识和前沿技术更新,请关注公众号算法coting

以上内容部分参考了

Visualizing Attention, a Transformer's Heart

非常感谢,如有侵权请联系删除!