What is attention?
先簡單描述一下attention機制是什么。相信做NLP的同學對這個機制不會很陌生,它在Attention is all you need可以說是大放異彩,在machine translation任務中,幫助深度模型在性能上有了很大的提升,輸出了當時最好的state-of-art model。當然該模型除了attention機制外,還用了很多有用的trick,以幫助提升模型性能。但是不能否認的時,這個模型的核心就是attention。
attention機制:又稱為注意力機制,顧名思義,是一種能讓模型對重要信息重點關注並充分學習吸收的技術,它不算是一個完整的模型,應當是一種技術,能夠作用於任何序列模型中。
為什么Transformer中K 、Q不能使用同一個值
既然K和Q差不多(唯一區別是W_k和W_Q權值不同),直接拿K自己點乘就行了,何必再創建一個Q?創建了還要花內存去保存,不斷去更新,多麻煩。
想要回答這個問題,我們首先要明白,為什么要計算Q和K的點乘。
現補充兩點
- 先從點乘的物理意義說,兩個向量的點乘表示兩個向量的相似度。
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/319339652/answer/1617993669