本文以自注意机制为例,输入一个4*4的矩阵
如下:
input_data=torch.tensor([[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ],dtype=torch.float)
得到Q和K的转置如下。
此时,计算Q@K^T ,得到如下结果
第一行第一个位置就是第一条样本和第一条样本对应特征相乘再求和的结果
第一行第二列,就是第一条样本和第二条样本对应特征位置相乘再求和的结果
以此类推...
也就是每条样本分别于其它样本做点乘操作,这个过程的结果被叫做外积。
请注意,这个过程并不是叉乘,叉乘一般用于向量。
最后我们使用该结果做softmax操作,我们将得到如下矩阵。观察下面的矩阵,我们发现,在最后一列几乎都是1,在其它列无限接近0。
但是这并不是说每个样本的最后一个特征得分最高,而是表示,在单个特征位置,其每个样本的概率分布。
所以,如下矩阵表示,在每个特征维度上,最后一条样本的概率分布最高。
所以,我们使用注意力得分和V做点积操作,att @ V ,我们将得到如下输出。
我们会发现,每一行都变成了[13,14,15,16]
这不就是最后一条样本的数值吗?
所以这个过程发生了什么呢?在这个过程中,完成注意力计算后,由于在每个特征维度上,都是最后一条样本的概率分布最高,所以每条样本的每个特征都变成的最后一条样本的值。
但是,实际上并不都这么夸张,因为在实际深度学习中,我们会将样本归一化,使得每条样本的特征值都在0-1区间,这样就不会太受到大值样本的影响。
比如,我们进行如下归一化,将输入数据*0.01。
B=B*0.01 得到如下输出,我们会发现,最后注意力结果就不会都是最后一条样本的值了,只不过呢,最后一条样本的值占据更多数。![]()