Seq2Seq

  1. 什麼是Seq2Seq算法

    Seq2Seq模型,全稱Sequence to sequence,由EncoderDecoder兩個部分組成,每部分都是一個RNNCell(RNN、LSTM、GRU等)結構。Encoder將一個序列編碼爲一個固定長度的語義向量,Decoder將該語義向量解碼爲另外一個序列。輸入序列和輸出序列均可以是不定長序列。ide

    Seq2Seq能夠用於機器翻譯、文本摘要生成、對話生成等領域。函數

  2. Seq2Seq結構工具

    Seq2Seq包含一個RNN做爲Encoder對輸入序列進行編碼,一個RNN做爲Decoder對輸出序列進行解碼。下面參考https://zhuanlan.zhihu.com/p/70880679介紹兩種最經常使用的Seq2Seq結構。學習

    爲簡化描述,這裏都以RNN代替LSTM和GRU,而且省略偏置項。編碼

    • 結構1lua

      sqsX0P.jpg

      Encoder輸入序列ABC,生成語義向量 c 做爲Decoder的初始隱藏狀態,Decoder中初始時刻輸入 \(<EOS>\)做爲開始標誌,直至輸出\(<EOS>\)結束預測。spa

      Encoder第i個時刻的隱藏狀態和輸出爲:.net

      \[h_i=tanh(W[h_{i-1},x_i]) \\ o_i=softmax(Vh_i) \]

      Encoder輸出的語義向量爲最後一個時刻T的隱藏狀態:翻譯

      \[c=h_T \]

      Decoder第t個時刻的隱藏狀態和輸出爲:

      \[s_t=tanh(W'[s_{t-1},y_{t-1}]) \\ y_t=softmax(V's_t) \]

      Decoder的初始隱藏狀態爲Encoder編碼的語義向量,即:

      \[s_0=c \]

    • 結構2

      sqsxk8.jpg

      結構1的Encoder所編碼的語義向量只做用於Decoder的第一個時刻,而結構2的語義向量做用於Decoder的每個時刻。

      結構2的Encoder部分與結構1一致,惟一一點小區別是會對語義向量作一個非線性變換:

      \[c=tanh(Uh_T) \]

      Decoder部分,結構2首先會初始化一個開始信號\(y_0\)(如\(<Start>\))以及一個初始隱藏狀態\(s_0\),Decoder第t個時刻的隱藏狀態和輸出爲:

      \[s_t=tanh(W'[s_{t-1},y_{t-1},c]) \\ y_t=softmax(V's_t) \]

  3. Seq2Seq+Attention

    Seq2Seq+Attention都是基於上述結構2,即Encoder生成的語義向量c會傳給的Decoder每個時刻。但這顯然是不合理的。好比翻譯一句話,I like watching movie.翻譯成:我喜歡看電影。,其中喜歡基本上是由like得來的,I like watching movie.中每一個詞對翻譯成喜歡的影響是不一樣的。因此,在Decoder中,每一個時刻的語義向量 \(c_t\) 都應該是不一樣的。Seq2Seq+Attention基於的就是這一想法。

    這裏參考https://zhuanlan.zhihu.com/p/70905983介紹兩種Seq2Seq+Attention的方法,分別爲Bahdanau Attention和Luong Attention。

    • Bahdanau Attention

      sqXzNT.jpg

      Encoder部分與前面所述一致,Decoder部分每一個時刻的語義向量 \(c_t\) 經過如下方式生成:

      \[c_t=\sum_{i=1}^T\alpha_{ti}h_i \\ \alpha_{ti}=\frac{exp^{e_{ti}}}{\sum_{i=1}^Texp^{e_{ti}}} \\ e_{ti}=v_a^Ttanh(W_a[s_{t-1},h_i]) \]

      其中\(\alpha_{ti}\)爲輸入序列第i個字符對輸出序列第t個字符的歸一化權重,\(e_{ti}\)爲歸一化前的權重,\(v_a^T\)\(W_a\)爲Attention的可學習參數。

      Decoder第t個時刻的隱藏狀態和輸出爲:

      \[s_t=tanh(W'[s_{t-1},y_{t-1},c_t]) \\ y_t=softmax(V's_t) \]

    • Luong Attention

      sqjK8e.jpg

      Luong Attention與Bahdanau Attention不一樣的地方在於歸一化前的權重計算,其計算方式爲:

      \[s_t=tanh(W'[s_{t-1},y_{t-1}]) \\ e_{ti}=s_t^TW_ah_i \]

      而後計算注意力層的隱層狀態和輸出:

      \[\widetilde s_t=tanh(W_c[s_t,c_t]) \\ y_t=softmax(V'\widetilde s_t) \]

      須要注意的是Decoder傳給下一個時刻的隱藏狀態是\(s_t\)而不是\(\widetilde s_t\)

    Bahdanau Attention與Luong Attention兩種注意力機制大致結構一致,區別在於計算影響程度的對齊函數。在計算時刻的影響程度時,前者使用\(s_{t-1}\)\(h_i\)來計算,後者使用\(s_t\)\(h_i\)來計算。從邏輯來看貌似後者更合邏輯,但兩種機制如今都有在用,效果應該沒有很大差異。

  4. Seq2Seq訓練

    Seq2Seq對Encoder和Decoder進行聯合訓練,目標是使得給定輸入序列的目標序列的條件機率最大化,即:

    \[P(y_1,y_2...,y_{T'}|x_1,x_2,...x_T)=\prod_{t=1}^{T'}P(y_t|x_1,x_2,...x_T,y_1,...,y_{t-1}) \]

    損失函數爲:

    \[J=-\log P(y_1,y_2...,y_{T'}|x_1,x_2,...x_T)=-\frac{1}{T'}\sum_{t=1}^{T'}\log P(y_t|x_1,x_2,...x_T,y_1,...,y_{t-1}) \]

    預測時須要將Decoder上一個時刻的輸出做爲下一個時刻的輸入,在訓練中咱們也能夠將標籤序列(訓練集的真實輸出序列)在上⼀個時間步的標籤做爲解碼器在當前時間步的輸⼊。這叫做強制教學(teacher forcing)。通常設置一個強制教學的比例,如50%使用強制教學,剩下的50%將Decoder上一個時刻的輸出做爲下一個時刻的輸入。

  5. Seq2Seq預測

    設輸出詞彙表大小爲|Y|(包括\(<EOS>\)),輸出序列的最大長度爲\(T'\)

    • 窮舉模式(exhaustive search)

      窮舉全部可能的\(|Y|^{T'}\)個輸出序列而後選擇最優序列。但這樣時間空間消耗都很是的大,通常不用。

    • 貪婪模式(greedy search)

      每一個時刻都選擇當前時刻條件機率最大的詞,即:

      \[y'_t=\arg \max_{y\in Y}P(y|x_1,x_2,...x_T,y_1,...,y_{t-1}) \]

      ⼀旦搜索出\(<EOS>\),或者輸出序列長度已經達到了最大長度T′,便完成輸出。

      貪婪模式不能保證搜索出全局最優。

    • 束搜索(beam search)

      束搜索(beam search)是對貪婪搜索的⼀個改進算法。它有⼀個束寬(beam size)超參數。咱們將它設爲 k。在時間步 1 時,選取當前時間步條件機率最⼤的 k 個詞,分別組成 k 個候選輸出序列的⾸詞。在以後的每一個時間步,基於上個時間步的 k 個候選輸出序列,從 k |Y| 個可能的輸出序列中選取條件機率最⼤的 k 個,做爲該時間步的候選輸出序列。

      sLPl7j.jpg

      因爲束搜索傾向於選擇長度較短的輸出序列,所以通常對長度進行歸一化,每一個序列的得分爲:

      \[score(y_1,y_2,...,y_L)=\frac{1}{L^{\alpha}}\sum_{t=1}^L\log P(y_t|x_1,x_2,...x_T,y_1,...,y_{t-1}) \]

      \(\alpha\)取0時不進行長度歸一化,取1時進行標準長度歸一化。取值是試探性的,能夠嘗試不一樣的值,看哪個能獲得最好的結果。通常取0.7。

      束搜索的PyTorch實現方式能夠參考:https://blog.csdn.net/u014514939/article/details/95667422

  6. BLEU得分

    BLEU(bilingual evaluation understudy,雙語互譯質量評估輔助工具),是用來評估機器翻譯質量的一個指標,其計算公式爲:

    \[BLEU=BP*\sum_{n=1}^kw_nP_n \]

    其中,\(P_n\)爲n-gram對應的得分,\(w_n\)爲n-gram的權重,k爲但願匹配的最長的子序列長度,BP爲長度懲罰項。

    \[P_n=\frac{Count_n^{clip}}{Count_n} \]

    其中,\(Count_n\)爲翻譯序列中全部n-gram的數量,\(Count_n^{clip}\)爲翻譯序列中全部n-gram與全部參考翻譯的匹配數量,例如對於某個n-gram,其在翻譯序列中出現次數爲3,在3個參考翻譯中出現次數爲2,4,1,則\(Count_n^{clip}=min(3,max(2,4,1))=3\)

    通常將各n-gram的做用視爲等重要的,即取權重服從均勻分佈,即:

    \[w_n=\frac{1}{k} \]

    因爲對於較長序列,其\(P_n\)每每較小,所以較長序列的BLEU得分每每偏小。BP項對短序列施加懲罰:

    \[BP=\left\{\begin{aligned} 1 \qquad \quad c>r \\ e^{1-\frac{r}{c}} \qquad\quad c\le r \end{aligned}\right. \]

    其中c爲翻譯序列長度,r爲全部參考序列中最大的長度。

相關文章
相關標籤/搜索