李宏毅機器學習課程筆記-14.4 Seq2Seq:Transformer

transformer最知名的應用就是BERT,BERT就是無監督訓練的transformer,transformer就是具有Self-attention的Seq2Seq模型。

RNN常用於處理輸入和輸出都是sequence的任務,因爲RNN是通過遍歷輸入的sequence而逐步輸出一個sequenc,所以RNN很難被並行化。因爲CNN可以並行化,所以有人提出用CNN處理輸入和輸出是sequence的任務:每個卷積核將sequence中的一部分作爲輸入並輸出一個sequence、多個卷積核就可以生成多個sequence。層數較少的CNN不能看到long-term的信息,層數很多的CNN才能看到long-term的信息,如果在淺層(比如第一層)就需要看到long-term的信息怎麼辦呢?

有人提出用Self-Attention Layer代替RNN,其輸入和輸出和RNN一樣都是sequence,它的特別之處是和Bidirectional RNN一樣在輸出時就已經看過了輸入的整個sequence,並且可以並行計算。

Self-Attention

Self-Attention來自於谷歌的paper:《Attention is all you need》。

  1. 假設現在有輸入序列\(x^1,x^2,x^3,x^4\)

  2. 進行embedding:\(a^i=Wx^i\)

  3. \(a^i\)輸入到Self-Attention Layer得到\(q^i,k^i,v^i\)

    \(q\)代表query,它是要去和key進行match的,\(q^i=W^qa^i\)

    \(k\)代表key,它是要被query進行match的,\(k^i=W^ka^i\)

    \(v\)代表value,我們要通過attention從中進一步提取information,\(v^i=W^va^i\)

  4. 使用每個query對每個key做attention

    \(q^i\)爲例,使用\(q^i\)和4個key得到\(\alpha_{i,1},\alpha_{i,2},\alpha_{i,3},\alpha_{i,4}\),可以使用Scaled Dot-Product Attention:\(\alpha_{i,j}=\frac{q^i\cdot k^j}{\sqrt d}\),其中\(d\)\(q^i\)\(k^j\)的維數,除以\(\sqrt d\)是因爲\(q^i\cdot k^j\)的大小會受\(d\)的大小的影響;再使用softmax函數得到\(\hat\alpha_{i,1},\hat\alpha_{i,2},\hat\alpha_{i,3},\hat\alpha_{i,4}\)

  5. \(b^i=\sum\limits_j\hat\alpha_{i,j}v^j\),這樣在計算\(b^i\)時就是可以看到輸入的整個sequence

Self-Attention如何並行化計算

Self-Attention是如何實現並行化計算的呢?上述Self-Attention的計算其實都是一些矩陣運算,因此可以使用GPU加速。

  1. 輸入爲\(I\)
  2. \(Q=W^qI,K=W^kI,V=W^vI\)
  3. \(A=K^TQ\)
  4. \(\hat A=softmax(A)\)
  5. 輸出爲\(O=V\hat A\)

Multi-head Self-attention

Self-attention有一種變形是Multi-head Self-attention,現以2個head的情況爲例介紹Multi-head Self-attention。

Multi-head的作用在於不同head關注的東西可能不一樣。

  1. 假設現在有輸入序列\(x^1,x^2,x^3,x^4\)

  2. 進行embedding:\(a^i=Wx^i\)

  3. \(a^i\)輸入到Self-Attention Layer得到\(q^{i,1},q^{i,2},k^{i,1},k^{i,2},v^{i,1},v^{i,2}\)

    這裏體現了Multi-head。

    \(q\)代表query,它是要去和key進行match的,\(q^{i,1}=W^{q,1}a^i,q^{i,2}=W^{q,2}a^i\)

    \(k\)代表key,它是要被query進行match的,\(k^{i,1}=W^{k,1}a^i,k^{i,2}=W^{k,2}a^i\)

    \(v\)代表value,我們要通過attention從中進一步提取information,\(v^{i,1}=W^{v,1}a^i,v^{i,2}=W^{v,2}a^i\)

  4. 使用每個query對每個key做attention

    這裏體現了Multi-head。

    \(q^{i,1},q^{i,2}\)爲例,\(q^{i,1}\)只會和\(k^{i,1}\)做attention,\(q^{i,2}\)只會和\(k^{i,2}\)做attention

  5. 最終得到\(b^{i,1},b^{i,2}\),將兩者直接concat,如果需要還可以通過乘以\(W^O\)修改維度

Positional Encoding

上面講的Self-Attention並沒有考慮sequence中元素之間的順序,所以需要Positional Encoding。

Positional Encoding即每個position都有一個獨一無二的positional vector \(e^i\),這些vector並不是從數據中學習到的,在將\(x^i\)embedding得到\(a^i\)後再加上\(e^i\),然後再輸入到Self-Attention Layer。

Seq2Seq with Attention

如何將Self-Attention應用到一個Seq2Seq模型中呢?

一般的Seq2Seq模型中包括2個RNN分別作爲Encoder和Decoder,我們可以使用Self-Attention Layer代替這2個RNN。

Transformer

以中文翻譯爲英文的任務爲例,假如要把“機器學習”翻譯爲“Machine Learning”。

Transformer也分爲Encoder和Decoder,Encoder的輸入是“機器學習”,先給Decoder一個輸入<BOS>代表句子的開始(begin of sentence),然後Decoder會輸出一個“Machine”,在下一個時刻把“Machine”輸入到Decoder得到“Learning”,直到Decoder輸出“句點”。

下面介紹Transformer的具體結構,如下圖所示。

img

如上圖所示,在Encoder中,首先將輸入進行embedding,然後加上positional encoding,然後進入多個相同的Block。每個Block中首先是一個Multi-head Attention,然後再將Multi-head Attention的輸入和輸出加起來,然後做Layer Normalization,然後進入Feedforward Layer,再將Feedforward Layer的輸入和輸出加起來,然後做Layer Normalization。

如上圖所示,在Decoder中,Decoder的輸入是Decoder在前一個時刻的輸出,然後加上positional encoding,然後進入多個相同的Block。每個Block中首先是一個Masked Multi-head Attention(Masked指Decoder在做Self-Attention時只會attend已經生成的sequence),然後將Masked Multi-head Attention的輸入和輸出加起來,再做Layer Normalization,然後將Layer Normalization的輸出和Encoder的輸出輸入到一個Multi-head Attention中,然後將Multi-head Attention的輸入和輸出詳見並做Layer Normalization,然後進入Feedforward Layer,再將Feedforward Layer的輸入和輸出加起來,然後做Layer Normalization。多個相同的Block結束以後,進入Linear層,然後進入Softmax層得到最終的輸出。

如果一個任務可以用Seq2Seq模型完成,那就可以用Transformer。


Github(github.com):@chouxianyu

Github Pages(github.io):@臭鹹魚

知乎(zhihu.com):@臭鹹魚

博客園(cnblogs.com):@臭鹹魚

B站(bilibili.com):@絕版臭鹹魚

微信公衆號:@臭鹹魚

轉載請註明出處,歡迎討論和交流!


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