作為一個NLP的小白,因為課題的緣故第一次接觸到了Seq2Seq模型。知乎上關於Seq2Seq模型有許多介紹,不過感覺對於0基礎的童鞋不是特別友好,所以本人作為小白的視角來寫一點自己對於Seq2Seq模型的理解,希望能幫助到各位剛入門的盆友。同時作為Rookie,有些地方可能理解的不是很到位,大家如有發現歡迎及時批評指正。

1. 循環神經網路(RNN)

要想理解Seq2Seq模型,首先要知道NLP的基本模型單元——RNN究竟是什麼。RNN的設計思路是模仿我們人類的閱讀行為,通過獲取相鄰的幾個詞或短語(文本輸入)來判斷這句話到底是想表達什麼,因此它採用如下的鏈式結構。我們期待的RNN的功能是借用深度學習的思想,來提取文本序列中的語義(semantic)和句法(syntactic)信息。

單層RNN網路

單層RNN的結構如上圖所示,它由若干個相連的block串聯組成,每個block有兩個輸出——隱含層狀態輸出(state)h和塊輸出(output)y。state會作為下一級的輸入傳入下一個相鄰的block,而塊輸出y則會被採集或丟棄,然後通過處理得到我們需要的信息。在多層RNN中,y會作為下一層的輸入。上面的過程可以用數學公式簡單表示成:

h_t =f(h_{t-1},x_t)

y_t=sigma(Wh_t)

這裡 sigma 指的是sigmod函數,對CNN瞭解的同學應該都知道它。對於state輸出我們並沒有明確函數的形式,這是因為不同的RNN單元有不同的處理方式。事實上,state的輸出可能不止一個,如LSTM就使用了兩個狀態的輸入輸出來改善網路的記憶功能,具體大家可以查看下面的資料

陳誠:人人都能看懂的LSTM?

zhuanlan.zhihu.com圖標

好啦,我們將RNN鏈一層一層堆疊起來,就得到了一個完整的RNN

多層RNN網路結構

需要注意的是,在同一層中,上面兩個式子中用到的非輸入輸出參數是共享的,類似於CNN中的卷積核。因為每一層的作用是提取某一項重要的特徵,這就要求與序列中所有文本某一時刻在RNN中所處的位置無關。

2. 詞嵌入Word Embedding

在介紹seq2seq之前,還必須解釋清楚另一個概念Word Embedding。RNN的輸入是文本序列,我們必須找到一種簡單的方式來表達它。由於計算機更擅長數值處理,最直接的想法是將word映射到向量上來。Word Embedding描述的就是這樣一個過程,它表示一個從文本序列到多維向量的映射關係

Word Embedding

Word Embedding實際上是一個RNN的預處理環節,我們的目標是找到一個最好的word embedding。一個好的embedding能夠表示單詞的意義、語義相關性(和其它單詞的相關程度)以及它們用於的不同類型的上下文環境。一個簡單的想法是用ascii碼來表示,但這種方式毫無意義——它為每個單詞生成的向量長度不等,並且不包含任何語義上的信息。

一個較為理想的詞嵌套應該能夠表示兩個詞之間的關聯程度,由於我們設想將輸入向量化,因此可以用兩個詞向量的夾角(內積除以模長積)來表示相關度。

那麼如何尋找這種映射關係呢?常用的方法主要分為兩大類:統計學方法和深度學習方法(或者基於預測的方法)。統計學方法較為直觀且易操作,但是我們知道,統計學意義上的相關並不是證明兩個元素具有相關性的充分條件,因此並不適用於挖掘數據相關的應用場景下。

深度學習方法非常適合用於特徵提取,因此我們可以用它來訓練embedding這個映射(保存為字典)。當然也有它的不足,那就是train出來的結果,例如每個單詞對應地一個長度為10的向量,我們並不知道它每一位代表著什麼。

在NLP中,CBOW(Continuous Bag-of-Words)和Skip-gram是兩種廣泛使用的訓練Embedding的小型神經網路。以CBOW為例,它的輸入是文本中某一位置的上下文(即前後幾個單詞),輸出則是辭彙表裡的在該位置出現的概率。利用CBOW訓練詞嵌套的映射,神經網路將自主挖掘相關性並返回一個較好的embedding給我們。

如果指定映射結果向量的維度為 D ,在產生RNN輸入數據時我們就可以通過embedding將長度為 V 的文本輸入轉化成 V	imes D 大小的數值矩陣作為RNN模型的輸入。

one-hot方法產生的embedding

3. Seq2Seq模型

好啦,有了以上的背景知識作為鋪墊,接下來就可以介紹Seq2Seq模型了。Seq2Seq的主要應用場景是機器翻譯,因此其輸入輸出均為變長序列。Seq2Seq模型由三個部分組成,如下圖所示,分別是encoder、encoder state和decoder。encoder和decoder就是前面說過的RNN,通常由RNN block組成,常用的是LSTM和GRU。encoder用來從輸入的詞嵌入矩陣中提取信息,提取出來的信息以及hidden state會輸入到encoder state中生成一個固定大小的狀態向量,該狀態向量會傳入Decoder進行解碼以生成最後的預測。

Seq2Seq模型

事實上,這裡所介紹的Seq2Seq是最基礎的版本,在使用過程中會有許多問題。因此人們加上了attention以及Bi-directional encoder layer機制,之後我將會介紹這一部分的內容。


推薦閱讀:
相關文章