天天看點

Seq2Seq -- Attention -- Transformer

Seq2Seq – Attention – Transformer

文章目錄

    • Seq2Seq -- Attention -- Transformer
      • 1.前言
      • 2.Seq2Seq模型
      • 3.Attention模型
        • 3.1簡介
        • 3.2模型架構
        • 3.3其他
      • 4.Transformer
        • 4.1為什麼使用Transformer?
        • 4.2模型架構
          • 4.2.1 Self-Attention
          • 4.2.2 Multi-headed Attention
          • 4.2.3 位置編碼
        • 4.3訓練過程
          • 4.3.1 輸入
          • 4.3.2 Encoders
          • 4.3.3 Decoders
      • Reference

1.前言

Transformer是谷歌在2017年的論文 Attention Is All You Need 中提出的一種模型,可以很好地處理序列相關的問題,如機器翻譯。在此之前,對于機器翻譯問題一般使用CNN或RNN作為encoder-decoder的模型基礎,如使用RNN的Seq2Seq模型。

機器翻譯一些模型的提出過程如下[3]:

Seq2Seq -- Attention -- Transformer
  • RNN對于序列問題有很好的效果,最早是使用基于RNN的Seq2Seq模型處理機器翻譯問題,但其序列循環使得在訓練時非常緩慢
  • Facebook将Seq2Seq的RNN替換成CNN,用多個CNN疊加放大上下文,重新整理了兩項翻譯任務記錄,并将訓練速度大大提高
  • Transformer基于Attention機制實作,沒有使用CNN或RNN結構,可高度并行,訓練快,準确率高

本文将通過對Seq2Seq模型、Attention模型的簡單介紹,引入并重點介紹Transformer模型,加深自己對各個模型的了解。

2.Seq2Seq模型

Seq2Seq模型,Sequence-to-Sequence,即序列到序列的過程。

典型的Seq2Seq模型如下,包含編碼器Encoder和解碼器Decoder兩個部分。

Seq2Seq -- Attention -- Transformer

Encoder是一個RNN/LSTM模型,将輸入的句子編碼得到context vector,即

(1) C = F ( x 1 , x 2 , . . . , x m ) C=F(x_1,x_2,...,x_m)\tag{1} C=F(x1​,x2​,...,xm​)(1)

Decoder是Encoder的逆過程,每個狀态由之前的狀态和context vector決定,即

(2) y i = G ( C , y 1 , y 2 , . . . , y i − 1 ) y_i=G(C,y_1,y_2,...,y_{i-1})\tag{2} yi​=G(C,y1​,y2​,...,yi−1​)(2)

在這種模型下,所有輸入被壓縮在一個向量中,導緻——

  • 無法表達序列資訊
  • 當句子長度較大時,容易丢失資訊

3.Attention模型

3.1簡介

2015年提出的Attention模型,使用多個context vector,有效地解決了使用Seq2Seq模型難以處理長句子的問題。

注意力機制(Attention Mechanism)源于對人類視覺的研究。在認知科學中,由于資訊處理的瓶頸,人類會選擇性地關注所有資訊的一部分,同時忽略其他可見的資訊。上述機制通常被稱為注意力機制。

在機器翻譯中,注意力機制衡量輸出單詞與每個輸入單詞的關聯程度,關聯程度更大的輸入單詞具有更大的權重,使得輸出單詞可以更關注其對應的語義。比如,當翻譯

I eat an apple

時,輸出

時應該重點關注

eat

這個單詞,即

eat

的權重應該比其他單詞更高。

3.2模型架構

最先的Attention模型[5]架構如下:

Seq2Seq -- Attention -- Transformer
  • 輸入:待翻譯的句子
  • Encoder:雙向的RNN或LSTM,計算得到每個位置的隐狀态,下面隻用 h i h_i hi​ 表示
  • Decoder:對目前輸出位置 t t t,使用上一個隐狀态 s t − 1 s_{t-1} st−1​ 與Encoder的結果計算,如下:
    • 衡量輸出位置 i i i 與輸入位置 j j j 之間的比對程度, a a a 可以是點積或其他運算——

    (3) e i j = a ( s i − 1 , h j ) e_{ij}=a(s_{i-1},h_j)\tag{3} eij​=a(si−1​,hj​)(3)

    (4) α i j = e x p ( e i j ) ∑ k e x p ( e i k ) \alpha_{ij}=\frac{exp(e_{ij})}{\sum_k exp(e_{ik})}\tag{4} αij​=∑k​exp(eik​)exp(eij​)​(4)

    • 權重求和得到context vector——
    (5) c i = ∑ j = 1 T α i j h j c_i=\sum_{j=1}^{T}\alpha_{ij}h_j\tag{5} ci​=j=1∑T​αij​hj​(5)
    • 使用上一個隐狀态、上一個輸出、context vector更新目前狀态——
    (6) s t = f ( s t − 1 , y t − 1 , c t ) s_t = f(s_{t-1},y_{t-1},c_t)\tag{6} st​=f(st−1​,yt−1​,ct​)(6)
    • 根據目前狀态、上一個輸出、context vector計算目前輸出——
    (7) y t = g ( y t − 1 , s t , c t ) y_t=g(y_{t-1},s_t,c_t)\tag{7} yt​=g(yt−1​,st​,ct​)(7)

通過為每個輸出位置計算一個context vector,使得每個位置的輸出可以關注到輸入中最相關的部分,效果比傳統模型更好。

3.3其他

Attention模型提出後,出現了許多Attention模型的變體,包括——

  • Soft Attention、Global Attention、動态 Attention
    • 三者是同一種Attention,即上述結構,對輸入的每個位置都計算對齊機率
  • Hard Attention
    • 同樣對每個位置計算對齊機率,但隻将最高的一個置為1,其餘置為0
  • local Attention
    • 隻計算一個視窗内的位置的對齊機率,減少計算量

另外,上述模型計算 c t c_t ct​ 時使用的是前一個狀态 s t − 1 s_{t-1} st−1​,也有一些模型中直接使用目前狀态 s t s_{t} st​,如下[4]:

Seq2Seq -- Attention -- Transformer

計算過程為:

(8) s t = f ( s t − 1 , y t − 1 ) s_t=f(s_{t-1},y_{t-1})\tag{8} st​=f(st−1​,yt−1​)(8)

(9) α t j = a ( s t , h j ) ∑ k a ( s t , h k ) \alpha_{tj}=\frac{a(s_t,h_j)}{\sum_k a(s_t,h_k)}\tag{9} αtj​=∑k​a(st​,hk​)a(st​,hj​)​(9)

(10) c t = ∑ j = 1 T α t j h j c_t=\sum_{j=1}^T \alpha_{tj}h_j\tag{10} ct​=j=1∑T​αtj​hj​(10)

(11) y t = g ( y t − 1 , s t , c t ) y_t=g(y_{t-1},s_t,c_t)\tag{11} yt​=g(yt−1​,st​,ct​)(11)

4.Transformer

4.1為什麼使用Transformer?

RNN:其結構使得其天然适合處理NLP領域的問題,但最大的瓶頸是難以并行化,盡管有一些并行化思路,但仍然隻能并行很小一部分。

CNN:卷積核抽取類似n-gram的特征,但難以處理長距離依賴問題,且pooling層會丢失位置資訊。通過将CNN層數加深可以提高其處理長距離依賴問題的能力,同時去除pooling層保留位置資訊,使得CNN可以更适合處理NLP問題。在并行能力上,CNN各個卷積核之間沒有依賴,非常适合并行,是以速度比RNN快得多。

摘錄來自[6]中的關于RNN、CNN、Transformer的對比。(此處的RNN和CNN指在RNN和CNN基礎上增加Attention機制等改進版)

  • 語義特征提取能力:RNN與CNN能力相近,而Transformer要超過兩者4-8個百分點
  • 長距離特征捕獲能力:RNN與Transformer能力相近,CNN則弱得多(盡管已經加深了層數)
  • 任務綜合特征抽取能力:Transformer 顯著強于 RNN 和 CNN,CNN略強于RNN
  • 并行計算能力及運作效率:Transformer 和 CNN 差不多,都遠遠遠遠強于 RNN

從上面的對比可以看出,Transformer在效果和速度上都具有很好的表現。

4.2模型架構

Transformer模型架構如下[1]:

Seq2Seq -- Attention -- Transformer

Encoders由N個Encoder組成,Decoders由N個Decoder組成,圖示為 N = 6 N=6 N=6 。每個Encoder和Decoder内部簡化結構如下:

Seq2Seq -- Attention -- Transformer

在了解其内部具體流程之前,先了解下論文中提出的一些概念。

4.2.1 Self-Attention

Attention的目的是要算出一個context vector,原始的Attention模型使用①輸出目前位置的隐狀态與②輸入所有位置的隐狀态計算比對程度,并根據比對程度對③輸入所有位置的隐狀态進行權重求和得到context vector。

在Self-Attention中,輸入輸出都是句子本身,對原始Attention做一個轉化——

  • 把目前位置看成輸出,其映射後的隐狀态記為query(上面的①)
  • 把目前位置看成輸入,其映射後的隐狀态記為key(上面的②)
  • 把目前位置看成輸入,其用于權重求和的隐狀态記為value(上面的③)
在NLP的領域中,Key, Value通常就是指向同一個文字隐向量[7],即key=value。

有了上述了解,Self-Attention的過程也就跟原始的Attention模型基本相同,如下[2]:

Seq2Seq -- Attention -- Transformer
  1. Self-Attention對每個輸入(句子)的embedding,計算得到3個向量,分别為query Q Q Q,key K K K,value V V V
  2. 對第 i i i 個單詞,使用query與所有單詞的key點乘計算比對得分,并除以上述向量次元的平方根 d k \sqrt{d_k} dk​

    ​(也就是論文中提出的

    scaled dot-Product attention

    ),使得點積結果不會過大,訓練過程梯度更穩定

    (12) s c o r e ( i , j ) = Q i K j d score(i,j)=\frac{Q_iK_j}{\sqrt{d}}\tag{12} score(i,j)=d

    ​Qi​Kj​​(12)

  3. 對分數進行softmax得到權重,并對value權重求和得到目前單詞的向量映射

    (13) α i j = e x p ( s c o r e ( i , j ) ) ∑ k e x p ( s c o r e ( i , k ) ) \alpha_{ij}=\frac{exp(score(i,j))}{\sum_kexp(score(i,k))}\tag{13} αij​=∑k​exp(score(i,k))exp(score(i,j))​(13)

    (14) Z i = ∑ j α i j V j Z_i=\sum_j \alpha_{ij}V_j\tag{14} Zi​=j∑​αij​Vj​(14)

實際應用時直接使用矩陣進行運算,即

(15) Z = s o f t m a x ( Q K T d ) V Z=softmax(\frac{QK^T}{\sqrt{d}})V\tag{15} Z=softmax(d

​QKT​)V(15)

4.2.2 Multi-headed Attention

論文中使用Multi-headed機制進一步完善了Self-Attention層,具體地,對輸入的 Q , K , V Q,K,V Q,K,V 進行多次不同的映射,相當于把句子投影到不同的子空間(representation subspaces) 中,提高其表達能力。其結構如下[2]:

Seq2Seq -- Attention -- Transformer

其工作流程如下[1]:

Seq2Seq -- Attention -- Transformer
  1. 對輸入的句子的embedding,映射為 { Q ( i ) , K ( i ) , V ( i ) } \{Q^{(i)},K^{(i)},V^{(i)}\} {Q(i),K(i),V(i)} 矩陣,即相當于對 Q , K , V Q,K,V Q,K,V 做多次不同映射
  2. 按照self-Attention分别計算得到 { Z ( i ) } \{Z^{(i)}\} {Z(i)},并使用concat連接配接結果得到 Z o Z_o Zo​
  3. 為了使結果與self-Attention的shape一緻,再乘上 W o W_o Wo​ 将其映射為想要的shape
4.2.3 位置編碼

上述Attention過程沒有考慮到輸入序列中單詞的順序,transformer為每個輸入單詞的詞嵌入上添加了一個新向量——位置向量,即

embedding_with_time_signal = positional_encoding + embedding

。位置向量遵循一定規則生成,此處不涉及。

此外,上述結構的每一層後都要增加一個layer-normalization步驟,如下:

Seq2Seq -- Attention -- Transformer

綜合上述的各個子產品,一個完整的Transformer結構大緻如下[1]:

Seq2Seq -- Attention -- Transformer

4.3訓練過程

了解上述各概念後,梳理一下Transformer的整個訓練過程如下:

4.3.1 輸入

輸入是句子的embedding表示,加上位置向量後輸入到第一個Encoder裡

4.3.2 Encoders

Encoders包含N個結構相同的Encoder,每個Encoder包含一個Multi-headed Attention層和一個前饋層,包含以下幾個步驟:

  • Multi-headed Attention,Layer normalization
  • Feed forward,Layer normalization

每層的輸出和輸入具有相同的shape

4.3.3 Decoders

Decoders包含N個結構相同的Decoder,每個Decoder包含一個Multi-headed Attention層、一個Encoder-Decoder Attention層、一個前饋層,訓練時是逐個詞生成的,即一個句子Decoders要執行多次,包含以下幾個步驟:

  • 輸入是上一個生成的詞,初始化為??(之後看代碼實作)
  • 對輸入的單詞做Multi-headed Attention,Layer normalization
  • 做Encoder-Decoder Attention,與上一步的差別在于query是輸入的詞,但key和value來自Encoders最後一層的輸出
  • Feed forward,Layer normalization
  • 對輸出做線性映射,用softmax生成最可能的詞,作為下一輪的輸入,直到輸出一個特殊的符号

    <end of sentence>

Reference

  1. 圖解Transformer
  2. Attention Is All You Need(Transformer)算法原了解析
  3. 從Seq2seq到Attention模型到Self Attention(一)
  4. 自然語言進行中的Attention機制總結
  5. Neural Machine Translation by Jointly Learning to Align and Translate
  6. Transformer一統江湖:自然語言處理三大特征抽取器比較
  7. 從Seq2seq到Attention模型到Self Attention(二)

繼續閱讀