本文以自注意機制為例,輸入一個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 得到如下輸出,我們會發現,最后注意力結果就不會都是最后一條樣本的值了,只不過呢,最后一條樣本的值占據更多數。![]()