注意力機制(顯示考慮隨意線索)
隨意線索:查詢query
每個輸入是一個value和不隨意線索key的對
透過注意力池化層偏向性選擇某些輸入
歷史演變:
- 非參注意力池化層:60年代提的Nadaraya-Watson核迴歸,類似於knn
- 如果使用高斯核,fx 函式類似於softmax和y(y是一個value)的乘積
- 引數化注意力機制:在這基礎上引入可以學習的w(w是個標量),就是在softmax裡面加入w
批次矩陣乘法:torch.bmm
注意力分數(query和key的相似度)
- 回顧:注意力分數是softmax裡面的函式a,和softmax一起整體就是注意力權重alpha(大於等於0,加起來等於1,是分數的softmax結果)
- 討論注意力分數函式a:
1)Additive Attention(加性注意力):等價於將key和query合併起來放入到一個隱藏大小為h輸出大小為1的單隱藏層MLP,好處是key、value、query可以是任意長度
2) Scaled Dot-Product Attention(縮放點積注意力):query和key都是同樣長度,q和ki作內積再除以根號d,d是query的維度,d的作用是使得對引數不那麼敏感(如果下一次輸入很長,計算的注意力分數a會很大) - 程式碼實現時注意:
遮蔽softmax(masked_softmax):invalid數要設定為很小:1e-6,不能是0,為了解決padding後只考慮valid的值
使用注意力機制的seq2seq
- 加入注意力:
1)編碼器對每次詞的輸出作為key和value(它們是一樣的,就是每次rnn最後的輸出)
2)解碼器rnn對上一個詞的預測輸出是query
3)注意力輸出和下一個詞的詞嵌入合併進入rnn - Seq2seq中透過隱狀態在編碼器和解碼器中傳遞資訊
- 注意力機制根據解碼器rnn的輸出匹配合適的編碼器rnn輸出更有效的傳遞資訊(如何更有效的使用encode的資訊)
延伸:影像attention:會去扣patch,扣很多子圖出來,一個子圖就是一個key-value
自注意力和位置編碼
自注意力:
- 自注意力池化層將xi當作key、value、query來對序列抽取得到y1,…,yn
- 自注意力適合很長的序列,因為能看的比較長,最長路徑是o(1)
- 完全並行、最長序列為1、但對長序列計算複雜度高
位置編碼: - 跟CNN/RNN不同,自注意力並沒有記錄位置資訊
- 位置編碼將位置資訊注入到輸入裡(假設序列是X,使用位置編碼矩陣P來輸出X+P作為自編碼輸入,P有點類似於計算機二進位制編碼,使用sin、cos函式,表示相對位置-類似於旋轉投影線性變換),使得自注意力能夠記憶位置資訊
self-attention就是一個layer(網路層)
Transformer
架構:
- 基於編碼器-解碼器架構處理序列對
- 與使用注意力的seq2seq不同,Transformer是純基於注意力(注意力是類似於self-attention)
多頭注意力: - 對同一key、value、query,希望抽取不同的資訊:例如使用短距離關係和長距離關係
- 多頭注意力使用h個獨立的注意力池化:合併各head輸出得到最終輸出
有掩碼的多頭注意力: - 解碼器對序列中一個元素輸出時,不應考慮該元素之後的元素
- 可以透過掩碼來實現,即設定valid長度
基於位置的前饋網路: - 將輸入形狀由(b,n,d)變換成(bn,d)
- 作用2個全連線層
- 輸出形狀由(bn,d)變化回(b,n,d)
- 等價於2層和視窗為1的1維卷積層
殘差和層歸一化: - 殘差為了做很深
- 批次歸一化對特徵/通道里元素進行歸一化:不適合序列長度會變的nlp應用
- 層歸一化對每個樣本里的元素進行歸一化
資訊傳遞: - 將編碼器中輸出y1,…,yn作為解碼器中第I個Tranformer塊中多頭注意力的key和value:它的query來自目標序列
- 意味著編碼器和解碼器中塊的個數和輸出維度都是一樣的
預測: - 預測第t+1個輸出時,解碼器中輸入前t個預測值
- 在自注意力中,前t個預測值作為key和value,第t個預測值還作為query
總結: - Tranformer是一個純使用注意力的編碼-解碼器
- 編碼器和解碼器都有n個Transformer塊
- 每個塊裡使用多頭(自)注意力,基於位置的前饋網路和層歸一化