天天看點

幾張圖徹底搞定Seq2Seq

Seq2Seq是一個Encoder-Decoder結構,其中Encoder為一個RNN結構,Decoder也為一個RNN結構,當然這裡的RNN結構可以替換成為LSTM或者GRU等。我們以機器翻譯的例子進行講解,如下圖,我們希望将漢語小明吃蘋果翻譯成為英文。首先是對漢語進行分詞處理得到小明,吃,蘋果三個詞語,而我們希望輸出的是xiao ming eats apples.具體的流程見下圖:

幾張圖徹底搞定Seq2Seq

這裡的詞彙表為10000,我們将每個漢語詞語映射到128次元的向量空間中,也就是說每個詞語可以使用一個128次元的向量表示,即input_dim = 128。用矩陣來表示這個向量,那麼這個矩陣的形狀就是[1,128].然後我們說過Encoder是一個RNN網絡,這裡我們把RNN中的神經元設定成64,即num_units = 64。也就是說,一個詞向量經過Encoder網絡後變成了64維的矩陣

,即形狀為[1,64]。這個64維的向量進入Decoder網絡進行解碼以生成相應的英文。

具體的,我們來看看Encoder的内部結構,看看它到底是怎麼運作的:

幾張圖徹底搞定Seq2Seq

由于計算機無法直接處理語言,是以我們首先得将詞語通過word2vec等方式生成詞向量x,也就是把人類語言生成計算機可以了解的數學語言。生成的詞向量x便可以進入Encoder的RNN網絡進行運算了。具體的如上圖所示,h0為初始化的隐狀态,可以取一個64維全為1的向量。x1和h0生成狀态h1,然後x2再和h1生成h2,以此類推,直到序列最後一個時刻的狀态h3生成。而h3也成為了Encoder-Decoder的中間向量c。至于這些矩陣次元的轉換資訊,你可以看我的另一篇部落格就會完全明白。

而進入到Decoder中,具體的内部結構如下:

幾張圖徹底搞定Seq2Seq

如上圖所示,目标單詞(Target word)也會生成詞向量,至于詞向量的次元,可以和x的相同也可以不同,是解碼器第一個時間步驟的輸入,以使解碼器知道何時開始産生輸出,也就是告訴Decoder開始進行解碼操作了,當然這個也必須生成詞向量才能進入Decoder進行運算。然後由這個生成的詞向量y1和中間向量c結合生成Decoder的第一個時刻的隐狀态h1,以此類推生成所有的隐狀态。值得注意的是,Decoder中的系數舉矩陣W2和Encoder中的W1一般是不同的,但是在彼此内部卻是參數共享的。Decoder中的h和Encoder中的h也是不同的。你可以認為是兩套參數不同的RNN結構就可以了。但由于Decoder的h1(第一個時刻的隐狀态)是由Encoder中最後一個時刻的隐狀态(h3)和聯合得到的,是以Encoder和Decoder中的隐狀态的次元一般是一樣的,在本文中均是64維。

Decoder網絡隐狀态生成以後呢?接着看下圖:

幾張圖徹底搞定Seq2Seq

由上圖可知,,隐狀态乘以一個系數然後經過一個softmax函數,變成該時刻的輸出值(也即得到了該時刻隐狀态在64次元上的機率分布)。由于這裡系數矩陣U也是共享的,是以這裡整體上可以認為是一個全連接配接FC。

幾張圖徹底搞定Seq2Seq

由上圖可知通過argmax函數得到的Yi,即為i時刻隐狀态hi對應的機率最大值對應的索引。注意,這裡的Y和第三張圖的y是不同的。由上圖可知,得到索引後,通過詞典中索引到單詞的映射id2word獲得對應的單詞w。進一步的,在将i時刻得到的單詞轉換為詞向量以作為下一個時刻(i+1)的輸入。另外上圖中的可以告訴解碼器句子在哪裡結束,并且它允許解碼器在其輸出中表明句子結束的位置見下圖:

幾張圖徹底搞定Seq2Seq

這裡的ki其實就是yi,pi就是Oi,輸出對應每個次元的機率。那麼loss函數就如圖所示的E。

再放一張完整的圖:

幾張圖徹底搞定Seq2Seq

通過以上的訓練過程,我們需要的參數W1,W2,U就初步得到了。

繼續閱讀