【學習筆記】Self-attention

最近想學點NLP的東西,開始看BERT,看了發現transformer知識丟光了,又來看self-attention;看完self-attention發現還得再去學學word embedding...

推薦學習順序是:word embedding、self-attention / transformer、BERT(後面可能還會補充新的)

我是看的李宏毅老師的課程+pdf,真的很愛他的課...!講的非常清楚又很風趣餒!

下面是學習筆記,是我簡化提取的對自己有用的信息,適合有一定基礎的人閱讀,大家如果看了哪裏不懂的可以評論區留言,或者去看原視頻~

input

  • a vector
  • a set of vectors

vector set as input

  • text: one-hot encoding(不包含語義信息) ; word embedding (包含語義信息)
  • speech: choose a frame as a vector
  • graph: consider each node as a vector

output

  • each vector has a label (POS tagging詞性標註
  • whole sequence has a label (sentiment analysis情感分析
  • model decides the number of lables (seq2seq - translation機器翻譯

self-attention

FC(全連接層)可以用window來考慮上下文信息;但如何考慮整個sequence?

sequence長度不確定的情況下用window並不好!(window只能設置成最大的sequence長度,佔據內存空間)

於是,鐺鐺!出現了self-attention:

那麼對於當前輸入的某個vector,如何在序列中找到和它相關的vectors?

計算相關性!(這裏用的是算點積)

這裏的q可以理解成query,k理解成key,打個比方就是拿着一把鑰匙(這裏是query)去試不同房間的鎖(這裏是key),看看和哪個更匹配!

相關性分數α'和對應的v (value)相乘後取和,得到加權和b,也就是self-attention的輸出

這裏的value我的理解是,拿着一把鑰匙去開不同的鎖,如果匹配度高就能打開房間門,房間裏的東西就可以看作是這個value

最後我們能拿到的就是所有打開了的房間門裏面的東西,也就是相關性分數作爲權重,所有value的加權和!

 這邊每個b的計算都是並行的

 怎麼做到並行呢?很自然想到矩陣運算:

Muti-head Self-attention

如果vector之間不止一種想被學習到的相關性呢?

引入多頭機制 - 不同的head學習不同的相關性!

positional encoding

self-attention裏沒有位置信息!

給每個位置一個獨特的編碼向量

  • hand-crafted
  • learned from data

Applications

  • Transformer
  • BERT

Self-attention v.s. CNN

  • CNN的感受野是人爲設計的(卷積窗口);self-attention是可學習的(投影矩陣學習相關性
  • CNN是存在限制的self-attention;self-attention是更復雜更靈活的CNN

更flexible的模型需要更多的數據,否則容易overfitting!

數據量小的時候,用CNN更合適;數據量足夠大的時候,self-attention表現更好

self-attention v.s. RNN

  • RNN需要上一時刻的輸出作爲當前時刻的輸入,因此是nonparallel的;而self-attention是parallel
  • RNN裏如果想要考慮兩個很遠的vector很難 (一層層傳遞會丟失信息);self-attention天涯若比鄰

筆記就到這裏結束啦,如果大家有錯誤或者想法歡迎提出,一起討論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章