如何从公式和矩阵操作中理解自注意力机制?(下)

170 阅读1分钟

本文是之前如何从公式和矩阵操作中理解自注意力机制?(上)的下半部分,为了便于理解,建议先阅读上半部分。

如何获得注意力权重?

上一步,我们获得了QKT\mathbf{Q}\mathbf{K}^T矩阵,其一行可以理解为某个字与各个字的关系得分。得分显然是一个具体的数值,我们希望将其转化为某个字与各个字关系的“概率”。

现在假设有一个色子,我们反复丢一百次。然后记录点数出现的次数,将次数写在一行。那么如何计算不同点数出现的概率呢?显然,是用每个点数出现的次数除以总的次数,结果作为概率。最终将一行不同点数出现的次数,转化为了一行不同点数出现的概率。

在计算注意力权重中,原理类似,只是使用了softmax函数。

Softmax(z)i=ezij=1Cezj\text{Softmax}(\mathbf{z})_i = \frac{e^{z_i}}{\sum_{j=1}^{C} e^{z_j}}

  • z\mathbf{z} 是输入向量,包含 CC 个元素。对应QKT\mathbf{Q}\mathbf{K}^T矩阵的一行。
  • ziz_i 是输入向量 z\mathbf{z} 的第 ii 个元素。
  • Softmax(z)i\text{Softmax}(\mathbf{z})_i 是输入向量 z\mathbf{z} 的第 ii 个元素经过 Softmax 函数转换后的值。
  • j=1Cezj\sum_{j=1}^{C} e^{z_j} 是输入向量 z\mathbf{z} 的所有元素的指数和

ex\mathbf{e^x} 的值总是正数,适合表达概率。

理解了softmax函数的作用后,再来看公式。其中QKT\mathbf{Q}\mathbf{K}^T需要除以一个dk\mathbf{\sqrt{d_k}},这一步的操作是将矩阵中的所有元素除以这个值,结果是每个元素绝对值变小,这有利于避免后续训练中梯度的消失。与原理无关。

下一步就是进行softmax操作了,softmax的操作对象是矩阵的一行,套在每一行上。最后得到一个概率的矩阵,一行可以认为是一个字与其他字(包含自己)的某种关联的概率。比如第1行第3个值,代表的就是第一个字与第三个字相比其他字更有关联的概率。第2行第3个值,代表第2个字对第三个字的概率。以此类推。

需要注意的是,在训练的过程中Q和K的参数矩阵的值并没有提前赋予意义,其值完全是训练的结果。所以这里的概率值到底代表了什么,在参数很多的情况下,可能已经完全说不清了。反正训练结果显示,值是怎么多的情况下,结果挺好。

获得注意力

算出注意力的权重后,下一步就可以计算最终的注意力了。注意力权重是一个矩阵,从上面的过程中可以知道softmax并不会改变矩阵的维度,所以维度保持不变依然是n×nn\times n

需要与注意力权重矩阵相乘的是值矩阵V。它的维度是n×dvn\times d_v,两个矩阵的维度满足矩阵乘法。将结果用矩阵Z来表示,则其维度为n×dvn\times d_v。通常在模型中,会让dvd_vdmd_m相同,方便工程上的处理。

那么这里有什么含义吗?可以理解为这里的注意力权重在对V中的值进行“取舍”,取舍的依据是之前算出的概率。概率越大,“取”的越多。许许多多的"取舍“最终达到了目的。

获得多头注意力

自注意力机制中,还有最后一部分内容--多头注意力。

多头注意力就是将上面的操作多做几次,然后将结果整合起来作为输出。三个臭皮匠,顶个诸葛亮。“一头”的注意力可以想象成一个只从某个角度来思考事情的臭皮匠。多头就是从多个角度来思考问题,然后将结果汇总得到一个更好的结果。

那么在矩阵操作层面是如何来实现的呢?做法如下

用Z来代表注意力矩阵。将h个单头注意力的结果沿着轴=1,也就是沿着列(水平方向)来拼接成一个矩阵,

  • 输入矩阵:多个 𝑛×𝑑_m 的矩阵。
  • 输出矩阵:一个 𝑛×(ℎ⋅𝑑_m) 的矩阵。

如图:

Screenshot 2024-10-11 at 4.45.41 PM.png

以上是第一步还要引入一个WOW^O参数矩阵,维度是hdv×dmhd_v \times d_{m}。将拼接出来的矩阵乘上输出参数矩阵,最终得到一个维度为n×dmn \times d_{m}的矩阵。可以看出,在对原始的数据矩阵X,进行许多矩阵操作之后,最终获得了一个维度相同的矩阵。它将作为Transformer模型中下一层的输入,继续进行矩阵的变换,至于这些变具体是如何影响最终结果的,没人说得清了。


到此,Transformer中的自注意力机制的矩阵操作就结束了。如果喜欢本文,希望看到Transformer中其他部分的具体操作细节,欢迎关注点赞评论,点赞越多更的越快。:)