
Transformer
Transformer是NLP的顛覆者,它創造性地用非序列模型來處理序列化的資料,而且還獲得了大成功,更重要的是,NLP真的可以“深度”學習了,各種基于transformer的模型層出不窮,如BERT、GPT-2、T-NLG,而且模型引數量呈指數級增長,
Transformer之前,大家的思路都是在改進序列模型,從RNN到LSTM、GRU、Seq2Seq,如果你看過我之前寫的深入淺出RNN就會知道,序列模型要靠遍歷seq_len來處理data,效率低是顯而易見的,不僅如此,深層網路很難收斂,因此,即使像google這樣的大公司也只能堆疊10層左右的LSTM,
就在大家都認為“NLP本該如此”時,Transformer橫空出世,它通過self-attention實作了對序列化資料的并行處理,不僅提高了計算效率,還打開深度學習的潘多拉魔盒,放出后“大魔王”BERT,從某種程度上說,Transformer的意義比BERT更重大,

Attention
self-attention是attention的進階版,后者最早出現在機器翻譯模型--Seq2Seq中,Figure 2是英文 to 德文的seq2seq模型,encoder和decoder都是RNN(LSTM或GRU),decoder主要是靠encoder提供的hidden state來生成output,
我們知道,RNN的hidden state會隨著time step的遞進而變化,一旦time step數量較多,也就是seq_len較大時,那么當前的hidden state -- \(h_t\)和早先的hidden state -- \(h_1\),它們的值可能會相差甚遠甚至截然相反,這種情況稱為記憶遺忘,LSTM雖然在一定程度上能夠減輕這種遺忘,但這樣還不夠,

RNN的每個time step都會有一個output,但它們都沒有被用到decoder的訓練中,attention的作用就是為了能讓這些output能夠物盡其用,

如果將encoder的所有output一股腦兒丟給decoder,那效果肯定不好,最好的辦法是能知道對于當前這個time step來說,哪些output有用哪些沒用,然后取其精華去其糟粕,
attention的做法是給每個output一個權重,然后對所有的output做個加權求和,其計算結果--\(C_t\)將作為引數傳給decoder,
Figure 3中最關鍵的地方就是\(a_t\)的計算,也就是如何為output添加權重,Effective Approaches to Attention-based Neural Machine Translation這篇paper給出了下面三條公式,其中任一條公式都能夠用來計算權重,請你記住\(dot\ product\)這條公式,后面會用到,

Multi-Head Attention

Transformer的那篇論文--attention-is-all-you-need是用大白話來寫的,沒什么難度,如果你能它通讀一遍,再搭配代碼--The Annotated Transformer學習,那基本上你對它的理解就差不多了,因此,本文只分析它的核心模塊--Multi-Head Attention,其他內容不再贅述,
如Figure 4所示,Multi-Head指的是將data均分成N份,再對每個sub-data分別做scaled dot-product attention,最后將所有的計算結果拼接起來,實驗表明,multi-attention效果比single attention的效果要好,
\(dk\)是單個attention的隱層神經元數量,等于d_model / n_heads,而d_model是multi-head attention的總的隱層神經元數量,它不需要和hidden_size一致,可以通過linear layer來進行hidden_size和d_model之間的轉換,
前面提過,attention layer的重點是為encoder的output添加權重,Scaled dot-product attention,顧名思義,就是以dot-product的方式來計算權重:\(h^T_th^-_s\),既然Transformer是非序列模型,那就可以并行計算每個time step的attention權重,即:\(QK^T\),
\(dk\)越大,dot-product的值就越大,而softmax的導數則會越小,這樣不利于模型訓練,因此,Transformer會將attention的權重不僅要乘以scale -- \(1/\sqrt {d_k}\),
除了不能太大外,\(dk\)太小也不行,\(dk\)小了,就意味著head數量少了,這樣一來,每個attention要處理的seq_len就會變長,實驗表明,attention處理短seq_len的精度更高,因此,head數不宜過小,
Q、K、V雖然是三個不同數值的矩陣,但它們都是由同一個data(x或y)分別經過三個不同的Linear layer得到的,因此scaled dot-product attention也稱為self-attention,不僅如此,它還可以應用于encoder中,

End
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/14687.html
標籤:其他
下一篇:Python中的資料結構
