找了各種資料,也讀了論文原文,都是詳細介紹了怎麼把Q,K,V通過什麼樣的運算得到輸出結果,始終沒有一個地方有解釋Q,K,V是從哪來的?一個layer的輸入不就是一個tensor嗎,為什麼會有Q,K,V這三個tensor?


我自己用了一個比較通俗的思維去理解這個QKV,但是不一定對,僅供參考

假設你有一個詞庫,這裡面有100個詞,現在有兩個詞,他們的詞向量是A和B

現在你有一個訓練任務,假設是翻譯,那麼attention機制就是將詞向量根據你的訓練任務細分成了三個屬性,即QKV,這3個屬性變換需要的矩陣都是訓練得到的。

Q(query)可以理解為詞向量A在當前訓練語料下的注意力權重,它保存了剩下99個詞與A之間的關係。

K(key)是權重索引,通過用別的詞(比如B)的注意力索引K(key)與A的注意力權重(Query)相乘,就可以得到B對A的注意力加權

V(value)可以理解為在當前訓練語料下的詞向量,是在原有詞向量的基礎上,利用當前訓練語料進行強化訓練後得到的詞向量

這樣一來通過QK就可以計算出一句話中所有詞對A的注意力加權,然後將這個注意力加權與各自對應的新詞向量(value)相乘,就可以得到這句話中所有詞對A詞的注意力加權詞向量集,接下來我們就可以通過這個向量集作為輸入,預測A的翻譯結果。


Transformer用到了兩個attention模塊:一個模塊被用於encoder,一個模塊位於decoder。

encoder中的attention叫做self-attention,此時QKV分別為這個模塊的輸入(第一層為詞嵌入,第二層及以後為上一次層的輸出)分別乘上三個矩陣得到的結果分別為QKV,這三個矩陣是在訓練的時候學習。

decoder中的attention叫做encoder-decoder attention,這個attention的KV來自encoder的最後一層輸出,繼續乘以不同的矩陣。至於Q就是decoder上一層的輸出乘以一個矩陣。


SDPA 的數據流圖表示和矩陣形式的計算示例
MHA 的矩陣形式計算示例

我在手機上,公式複製完全都不顯示了。具體內容,看看我這篇文章是否能幫助到,後面畫了一堆瓶瓶罐罐那部分

https://zhuanlan.zhihu.com/p/353423931?

zhuanlan.zhihu.com圖標

以encoder為例:

Q,K,V是什麼?

query,key,value。

Q,K,V的來源?

Q,K,V來源於input的embedding。

Q,K,V的生成方式?

embedding通過三個不同的線性層生成Q,K,V。

Q,K,V的意義?

Q,K,V表示的意義都是相同的,通過與學習到的參數矩陣相乘,可以說生成了不同的表達方式。

為什麼可以這麼生成?

大抵是神經網路的哲學。而且我記得,在self-attention之前的attention score function中就有類似通過線性層計算score的方法。(general?


我覺得你可能想要Q K V的基本概念性含義,可以看看我寫的這個理解:

viper:transfomer裡面self-attention的Q, K, V的含義?

zhuanlan.zhihu.com圖標

Self-attention 是 Attention 裡面的一種目前比較流行的 Attention,但也是 Attention 框架下的一種特殊情況。

所以要了解 Q,K,V,肯定要從還不 ALL YOU NEED 之前的世界觀來理解,比如

Neural Machine Translation by Jointly Learning to Align and Translate?

arxiv.org

QKV 不同的情況來理解


三個神經網路,對同一輸入進行三次不同變換,生成了Q,K,V


我說是你自己定義的,愛怎麼定義怎麼定義你肯定不信我。不過事實就是這樣的


通俗點說,我們要做一個任務,現在有一組不同的&對,我們需要輸入一個Query,來計算得到最終的Value值。

Attention機制中的Q,K,V即是,我們對當前的Query和所有的Key計算相似度,以這個相似度為基準通過Softmax層進行歸一化得到一組權重,根據這組權重與對應Value的乘積求和得到Attention下的Value值。

和這個圖表現出的一樣。QKV這種可以算作Attention機制中最基本的思想。


看一眼代碼不就秒懂麼。 都是一個東西啊,就是輸入的embedding啊 。


推薦閱讀:
相關文章