seq2seq模型的最核心的就是encoder網路得到的隱含向量。在句子較短的時候,seq2seq模型可以表現的很好,但是在長句子的場景時,隱含向量中經常會丟失了句子開始部分的信息,造成翻譯的結果不好。attention機制就是為瞭解決這個問題而提出的,核心的解決方案就是將隱含向量變成一系列隱含向量,從而保存更完整的信息。

以上的截圖講述了有attention機制的seq2seq模型的decoder是如何工作的。

  1. 通過encoder網路,得到h1,h2,h3。為什麼有三個隱含向量呢,因為輸出的句子長度是3個,對於長度不等的句子,一般通過padding的技巧,補成相同長度的句子。那麼這個地方的向量的個數就是padding之後的句子的長度。
  2. decoder網路中通過初始化的decoder模型中的隱含向量hint和上一步的輸出向量,通過計算,得到隱含向量h4。第一個位置的時候,由於之前沒有輸出,用句子的終止符對應的詞向量作為上一步的輸出向量,也就是圖中的<END>向量。
  3. 通過decoder的輸出向量h4和h1,h2,h3進行計算,賦予h1,h2,h3分別一個權重(attention4模塊中下面的那個深色紅色向量),然後將h1,h2,h3通過這個權重加權加在一起,得到當前步驟的綜合encoder向量c4(attention4模塊中右邊的那個深色藍色向量)。這裡需要注意的是,h4是decoder模型中的隱含向量,h1,h2,h3是encoder輸出的向量。如何計算權重,稍後介紹。
  4. 將h4和c4連接在一起,當做當前decoder的信息向量,通過一個神經網路(一般來說一個激活函數是tanh的隱含層,一個softmax輸出層),最後softmax輸出詞表中所有詞的概率。需要注意的是,負責輸出的這個神經網路是和整個網路一起訓練的,每一個輸出位置的網路的參數應該都是一致的。需要注意的是:attention向量指的是decoder的信息向量在通過一個神經網路層之後得到的向量(激活函數是tanh)。一般的實現中,在得到attention向量之後,直接接著一個softmax就得到了每個詞的概率了。
  5. 重複以上的步驟,得到所有的輸出。到達了輸出長度的最大值或者輸出了<END>。

對比一下沒有attention機制的seq2seq的decoder是如何工作。

第一種:

  1. 通過encoder網路,得到h。只有一個隱含向量,而不是一系列的隱含向量。
  2. decoder網路中通過初始化的decoder模型中的隱含向量hint和上一步的輸出向量,通過計算,得到隱含向量h4。第一個位置的時候,由於之前沒有輸出,用句子的終止符對應的詞向量作為上一步的輸出向量,也就是圖中的<END>向量。
  3. 將h和h4連接在一起,當做當前decoder的信息向量,通過一個神經網路,最後softmax輸出詞表中所有詞的概率。需要注意的是,負責輸出的這個神經網路是和整個網路一起訓練的,每一個輸出位置的網路的參數應該都是一致的。
  4. 重複以上的步驟,得到所有的輸出。到達了輸出長度的最大值或者輸出了<END>。

第二種:

  1. 通過encoder網路,得到h。只有一個隱含向量,而不是一系列的隱含向量。
  2. 直接將h作為decoder的隱含向量hint輸入decoder網路中。結合上一步的輸出向量,通過計算,得到隱含向量h4。第一個位置的時候,由於之前沒有輸出,用句子的終止符對應的詞向量作為上一步的輸出向量,也就是圖中的<END>向量。
  3. h4當做當前decoder的信息向量,通過一個神經網路,最後softmax輸出詞表中所有詞的概率。需要注意的是,負責輸出的這個神經網路是和整個網路一起訓練的,每一個輸出位置的網路的參數應該都是一致的。
  4. 重複以上的步驟,得到所有的輸出。到達了輸出長度的最大值或者輸出了<END>。需要注意的是,下一次的時候,輸入的隱含向量就變成了h4,而不是h了,之後的輸出的時候都和h沒有直接關係了。

以上的截圖介紹了在attention機制中,如何通過一系列的隱含向量,得到綜合的隱含向量。

  1. 通過score函數,計算decoder中的隱含向量和encoder中的隱含向量的得分。對應著公式4,圖中的第二步。猜想:score公式中的參數也都是可以學習的,從而一步步的學習應該關注哪些內容。最簡單的版本中,公式4中的上面的公式直接用單位矩陣。
  2. softmax計算各個encoder的隱含向量對應的權重,對應公式1,圖中的第三步
  3. 加權求和,得到context vector,對應公式2,圖中的第四步和第五步。
  4. 將context vector輸入到神經網路中(一個tanh激活層和softmax輸出層),tanh激活層的輸出就是attention向量。對應公式3,圖中沒有展示。

(我的理解)為什麼attention機制能夠起到作用呢?正如attention機制的名字顯示的那樣,需要在每一次輸出的時候,只關注我們感興趣的部分,忽視或者減小無關信息的影響。如何忽視或者減小無關信息的影響,就是通過計算權重,將聯繫緊密(score函數得分較高)的項的權重調高,將剩下的項的權重調低,從而實現attention的目的。

在沒有attention機制的時候,可以認為encoder網路得到的隱含向量是一個全局的信息,並不能很好的使得輸出的各個位置都只關注真正有用的信息。

推薦閱讀:

相關文章