本文是之前如何从公式和矩阵操作中理解自注意力机制?(上)的下半部分,为了便于理解,建议先阅读上半部分。
如何获得注意力权重?
上一步,我们获得了矩阵,其一行可以理解为某个字与各个字的关系得分。得分显然是一个具体的数值,我们希望将其转化为某个字与各个字关系的“概率”。
现在假设有一个色子,我们反复丢一百次。然后记录点数出现的次数,将次数写在一行。那么如何计算不同点数出现的概率呢?显然,是用每个点数出现的次数除以总的次数,结果作为概率。最终将一行不同点数出现的次数,转化为了一行不同点数出现的概率。
在计算注意力权重中,原理类似,只是使用了softmax函数。
- 是输入向量,包含 个元素。对应矩阵的一行。
- 是输入向量 的第 个元素。
- 是输入向量 的第 个元素经过 Softmax 函数转换后的值。
- 是输入向量 的所有元素的指数和
的值总是正数,适合表达概率。
理解了softmax函数的作用后,再来看公式。其中需要除以一个,这一步的操作是将矩阵中的所有元素除以这个值,结果是每个元素绝对值变小,这有利于避免后续训练中梯度的消失。与原理无关。
下一步就是进行softmax操作了,softmax的操作对象是矩阵的一行,套在每一行上。最后得到一个概率的矩阵,一行可以认为是一个字与其他字(包含自己)的某种关联的概率。比如第1行第3个值,代表的就是第一个字与第三个字相比其他字更有关联的概率。第2行第3个值,代表第2个字对第三个字的概率。以此类推。
需要注意的是,在训练的过程中Q和K的参数矩阵的值并没有提前赋予意义,其值完全是训练的结果。所以这里的概率值到底代表了什么,在参数很多的情况下,可能已经完全说不清了。反正训练结果显示,值是怎么多的情况下,结果挺好。
获得注意力
算出注意力的权重后,下一步就可以计算最终的注意力了。注意力权重是一个矩阵,从上面的过程中可以知道softmax并不会改变矩阵的维度,所以维度保持不变依然是。
需要与注意力权重矩阵相乘的是值矩阵V。它的维度是,两个矩阵的维度满足矩阵乘法。将结果用矩阵Z来表示,则其维度为。通常在模型中,会让和相同,方便工程上的处理。
那么这里有什么含义吗?可以理解为这里的注意力权重在对V中的值进行“取舍”,取舍的依据是之前算出的概率。概率越大,“取”的越多。许许多多的"取舍“最终达到了目的。
获得多头注意力
自注意力机制中,还有最后一部分内容--多头注意力。
多头注意力就是将上面的操作多做几次,然后将结果整合起来作为输出。三个臭皮匠,顶个诸葛亮。“一头”的注意力可以想象成一个只从某个角度来思考事情的臭皮匠。多头就是从多个角度来思考问题,然后将结果汇总得到一个更好的结果。
那么在矩阵操作层面是如何来实现的呢?做法如下
用Z来代表注意力矩阵。将h个单头注意力的结果沿着轴=1,也就是沿着列(水平方向)来拼接成一个矩阵,
- 输入矩阵:多个 𝑛×𝑑_m 的矩阵。
- 输出矩阵:一个 𝑛×(ℎ⋅𝑑_m) 的矩阵。
如图:
以上是第一步还要引入一个参数矩阵,维度是。将拼接出来的矩阵乘上输出参数矩阵,最终得到一个维度为的矩阵。可以看出,在对原始的数据矩阵X,进行许多矩阵操作之后,最终获得了一个维度相同的矩阵。它将作为Transformer模型中下一层的输入,继续进行矩阵的变换,至于这些变具体是如何影响最终结果的,没人说得清了。
到此,Transformer中的自注意力机制的矩阵操作就结束了。如果喜欢本文,希望看到Transformer中其他部分的具体操作细节,欢迎关注点赞评论,点赞越多更的越快。:)