原文:
towardsdatascience.com/multi-headed-self-attention-by-hand-d2ce1ae031db
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/33b7fa037663f6ea75bd085f9a3780a3.png
“Focus” By Daniel Warfield using MidJourney. All images by the author unless otherwise specified. Article originally made available on Intuitively and Exhaustively Explained.
多头注意力可能是机器学习中最重要的架构范式。本总结涵盖了多头自注意力中的所有关键数学运算,使您能够从基本层面理解其内部工作原理。如果您想了解更多关于这个主题背后的直觉,请查看 IAEE 文章。
Transformer – 直观且详尽地解释
第 1 步:定义输入
多头自注意力(MHSA)在多种环境中使用,每种环境可能以不同的方式格式化输入。在自然语言处理环境中,人们可能会使用词到向量的嵌入,配以位置编码,来计算表示每个单词的向量。通常,无论数据类型如何,多头自注意力都期望一个向量序列,其中每个向量表示某物。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a09c0a145268bb7bd927dfaec463d0d0.png
在语言建模环境中应用 MHSA 时可能期望的输入示例。
第 2 步:定义可学习的参数
多头自注意力本质上学习了三个权重矩阵。这些用于构建“查询”、“键”和“值”,这些在后续机制中使用。我们可以定义一些权重矩阵来使用在这个例子中,这些代表模型的学到的参数。这些参数最初是随机定义的,然后在训练过程中更新。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/076cbc177cfcc9a85f5b1b790618cb11.png
第 3 步:定义查询、键和值
现在我们已经为我们的模型有了权重矩阵,我们可以将它们与输入相乘以生成我们的查询、键和值。回想一下,在矩阵乘法中,第一个矩阵的每一行的每个值都与第二个矩阵的相应列中的值相乘。这些乘积值相加以表示输出中的一个值。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ea3ac738904b60f4ef7fe701ec7ae662.png
使用相同的操作来构建键和值矩阵,因此我们已经构建了查询、键和值
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5ec283f26b566989a02813ddf93e5d25.png
第 4 步:分割成头
在这个例子中,我们将使用两个自注意力头,这意味着我们将使用输入的两个子表示进行自注意力。我们将通过将查询、键和值分成两部分来设置它。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/75ba1e3709168b914b5c17604a3e25f5.png
带有标签 1 的 Query、Key 和 Value 将传递到第一个注意力头,带有标签 2 的 Query、Key 和 Value 将传递到第二个注意力头。本质上,这允许多头自注意力并行以各种不同的方式对相同的输入进行推理。
第 5 步:计算 Z 矩阵
为了构建注意力矩阵,我们首先将查询和键相乘以构建通常称为 “Z” 矩阵的内容。我们只为注意力头 1 做这件事,但请记住,所有这些计算也在注意力头 2 中进行。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/39d569fd2db08f05bd3566d6493a6ef7.png
由于数学计算的方式,“Z” 矩阵的值随着查询和键的大小增长而增长。通过将 “Z” 矩阵中的值除以序列长度的平方根来抵消这一点。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/19e90eb55c853f98b9d0b6d8fb1d1991.png
第 6 步:遮罩
遮罩的方式取决于注意力机制的应用。在语言模型中,它预测文本序列中的下一个单词,我们应用一个遮罩,使得注意力机制将单词与前面的单词相关联,而不是与未来的单词相关联。这很重要,因为如果语言模型试图预测序列中的下一个单词,那么在训练时它不应该能够看到那个单词。因为模型是在有遮罩的情况下训练的,所以我们用遮罩进行推理。这是通过将键值替换为 -∞ 来实现的。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4b17c1a61ed592404e1837002319b56b.png
第 7 步:计算注意力矩阵
计算矩阵 “Z” 并应用 -∞ 遮罩的整个目的是创建一个注意力矩阵。这可以通过对遮罩 “Z” 矩阵中的每一行应用 softmax 来完成。计算 softmax 的方程如下:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a1b1aa833b0681300ab8bf09b37ad3e8.png
意味着行中的值等于 e 的该值次幂除以该行中所有值 e 的次幂之和。我们可以对第一行应用 softmax:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f2d6ee0fdbfb342fbedb20911ee47713.png
这一点有些微不足道,因为只有一个值不是 -∞。让我们对第二行应用 softmax。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2f2d4fca6508a6b84d0285c4f2ab9992.png
注意:我在这里将数值四舍五入到两位小数,这可能会使您的数学计算略有不同,具体取决于您如何四舍五入您的数值。
以这种方式计算每一行的 softmax,从而计算注意力矩阵
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/37c32795c96e4b657c7478368b3b3777.png
第 8 步:计算注意力头的输出
现在我们已经计算出了注意力矩阵,我们可以将它与值矩阵相乘来构建注意力头的输出。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9ea5bfaa4152347c0f9ec30e51813d7b.png
第 9 步:连接输出
两个注意力头都创建了一个独特的输出,这些输出被连接起来以产生多头自注意力机制的最终输出。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f18a1efa64d3b014f5ed9d173e3dddc9.png
结论
就这样。在这篇文章中,我们涵盖了计算多头自注意力输出的大致步骤:
定义输入
定义机制的可学习参数
计算查询、键和值
深入多个头
计算 Z 矩阵
遮蔽
计算注意力矩阵
计算注意力头的输出
连接输出
如果你感兴趣于理解理论,请查看 IAEE 的文章:
Transformer – 直观且全面解释
加入 IAEE
在 IAEE 你可以找到:
长篇内容,就像你刚刚读到的文章
基于我的数据科学家、工程总监和企业家经验的思想碎片
一个专注于学习 AI 的 discord 社区
每周由我进行的讲座
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/ef4a7e20d17e142820e42e1f30187537.png
加入 IAEE