Transformer中K 、Q、V的設置以及為什么不能使用同一個值


What is attention?

先簡單描述一下attention機制是什么。相信做NLP的同學對這個機制不會很陌生,它在Attention is all you need可以說是大放異彩,在machine translation任務中,幫助深度模型在性能上有了很大的提升,輸出了當時最好的state-of-art model。當然該模型除了attention機制外,還用了很多有用的trick,以幫助提升模型性能。但是不能否認的時,這個模型的核心就是attention。

attention機制:又稱為注意力機制,顧名思義,是一種能讓模型對重要信息重點關注並充分學習吸收的技術,它不算是一個完整的模型,應當是一種技術,能夠作用於任何序列模型中。

Attention機制的實質其實就是一個尋址(addressing)的過程,給定一個和任務相關的查詢 Query向量 q,通過計算與 Key的注意力分布並附加在 Value上,從而計算 Attention Value,這個過程實際上是 Attention機制緩解神經網絡模型復雜度的體現:不需要將所有的N個輸入信息都輸入到神經網絡進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網絡

為什么Transformer中K 、Q不能使用同一個值

既然K和Q差不多(唯一區別是W_k和W_Q權值不同),直接拿K自己點乘就行了,何必再創建一個Q?創建了還要花內存去保存,不斷去更新,多麻煩。

想要回答這個問題,我們首先要明白,為什么要計算Q和K的點乘。

現補充兩點

  1. 先從點乘的物理意義說,兩個向量的點乘表示兩個向量的相似度。

2. Q,K,V物理意義上是一樣的,都表示同一個句子中不同token組成的矩陣。矩陣中的每一行,是表示一個token的word embedding向量。假設一個句子"Hello, how are you?"長度是6,embedding維度是300,那么Q,K,V都是(6, 300)的矩陣

簡單的說,K和Q的點乘是為了計算一個句子中每個token相對於句子中其他token的相似度,這個相似度可以理解為attetnion score,關注度得分。比如說 "Hello, how are you?"這句話,當前token為”Hello"的時候,我們可以知道”Hello“對於” , “, "how", "are", "you", "?"這幾個token對應的關注度是多少。有了這個attetnion score,可以知道處理到”Hello“的時候,模型在關注句子中的哪些token。

這個attention score是一個(6, 6)的矩陣。每一行代表每個token相對於其他token的關注度。比如說上圖中的第一行,代表的是Hello這個單詞相對於本句話中的其他單詞的關注度。添加softmax只是為了對關注度進行歸一化。

雖然有了attention score矩陣,但是這個矩陣是經過各種計算后得到的,已經很難表示原來的句子了。然而V還代表着原來的句子,所以我們拿這個attention score矩陣與V相乘,得到的是一個加權后結果。也就是說,原本V里的各個單詞只用word embedding表示,相互之間沒什么關系。但是經過與attention score相乘后,V中每個token的向量(即一個單詞的word embedding向量),在300維的每個維度上(每一列)上,都會對其他token做出調整(關注度不同)。與V相乘這一步,相當於提純,讓每個單詞關注該關注的部分。

好了,該解釋為什么不把K和Q用同一個值了。

經過上面的解釋,我們知道K和Q的點乘是為了得到一個attention score 矩陣,用來對V進行提純。K和Q使用了不同的W_k, W_Q來計算,可以理解為是在不同空間上的投影。正因為有了這種不同空間的投影,增加了表達能力,這樣計算得到的attention score矩陣的泛化能力更高。這里解釋下我理解的泛化能力,因為K和Q使用了不同的W_k, W_Q來計算,得到的也是兩個完全不同的矩陣,所以表達能力更強。

但是如果不用Q,直接拿K和K點乘的話,你會發現attention score 矩陣是一個對稱矩陣。因為是同樣一個矩陣,都投影到了同樣一個空間,所以泛化能力很差。這樣的矩陣導致對V進行提純的時候,效果也不會好。

=========================================================

在attention中,主要分為兩部分,一部分是相似度矩陣的計算,也就是softmax(kq^T),另一部分是利用相似度矩陣將原v值映射到一個新的空間

那接下來我們需要考慮一點:在已知輸入x的情況下,如何建立相似度矩陣?

  • 最簡單的方式就是自身點乘也就是xx^T,其可以表征在本空間內的相似度。
  • 但通常原空間的相似度是不夠的,為了使得模型有更強的表征能力,我們需要其在其他空間映射的相似度,這一點可以參考核函數的設計思想。這時一個最標准的做法就是xWx^T(參考馬氏距離)。如果對其進行拆解就是xW1(xW2)^T,可以看到此時kq已經有所不同了。
  • W1,W2如果保持相同,那么這個距離是對稱自反的,也就是d(x1,x2)=d(x2,x1)。但是在attention中,這種對稱自反其實是不必要的,想象一下“我是一個男孩”這句話,男孩對修飾我的重要性應該要高於我修飾男孩的重要性。

假設有一個詞庫,這里面有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的翻譯結果。

 

 

來源:
https://www.zhihu.com/question/325839123/answer/1527018599
https://www.zhihu.com/question/319339652/answer/1617993669
https://www.zhihu.com/question/319339652/answer/730848834
https://www.zhihu.com/question/68482809/answer/597944559

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM