1 seq2seq模型在機器翻譯中的應用

Sequence-to-sequence(Seq2Seq)是一個相對新的範式,最早被用在英語法語的翻譯系統中。在更高層次來看,Sequence-to-sequence模型由兩個循環神經網路組成的端到端系統。encoder將輸入序列編碼成固定尺寸的上下文向量,decoder使用上下文向量作為「種子」產生輸出序列。因此,Seq2Seq也被稱為「編碼-解碼模型」。

編碼器使用多層的LSTM將輸入的句子逆向操作並轉換為固定大小的上下文向量,逆向的原因在「常見的神經網路模型在自然語言處理中的應用」一文已經提到。下面是編碼器的模型結構:

也可以使用一個雙向的LSTM作為編碼器的結構:

解碼器是一個更為複雜的LSTM網路,結構如下:

關於Attention機制,在「bi-LSTM+CRF機器學習模型」一文中也有介紹,這裡就Global Attention和Local Attention稍作介紹保證文章的完整性。在Global Attention中,我們使用如下的Score函數評價encoder hidden和decoder hidden 的相關性:

使用softmax函數生成歸一化權重: alpha_{i,j}=frac{exp(score(h_j,h_i))}{sum _{k=1}^nexp(score(h_k,h_i))}

則上下文向量和第i個時間步的編碼器的隱含層輸出為:

c_i=sum_{j=1}^nalpha_{i,j}h_j

h_i=f([h_i,c_i])

在local attention中,模型預測輸入序列中的對齊位置。 然後,它使用以該位置為中心的窗口計算上下文向量。 該注意步驟的計算成本是恆定的,並且不會隨著句子的長度而爆炸。

2 動態記憶網路在智能問答系統中的應用

在這裡,對文章「Ask Me Anything: Dynamic Memory Networks for Natural Language Processing」中的模型做一個介紹,並使用pytorch實現該模型。

輸入模塊:在自然語言處理問題中,輸入是事實句子的序列,循環神經網路是編碼輸入序列的一種方法,詞嵌入向量是其輸入,即 h_t=RNN(L[w_t],h_{t-1}) 。這裡使用了GRU模型。

問題模塊:與輸入序列類似,問題也最常被給出為自然語言處理問題中的一系列單詞。 和以前一樣,我們通過遞歸神經網路對問題進行編碼。 給出一個問題單詞序列,編碼單詞: q_t=GRU(L[w_t^Q],q_{t-1}) 。其中 L 表示詞嵌入矩陣, w_t^Q 表示問題的第t個單詞。

情節記憶模塊:情節記憶模塊迭代輸入模塊輸出的表示,同時更新其內部情節記憶。 在其一般形式中,情節存儲器模塊由注意機制以及用於更新其存儲器的循環網路組成。 在每次迭代期間,注意力機制考慮問題表示 q 和先前存儲器 m_{i-1} 以產生情節 e_i 。情節記憶模塊之後被使用到: m_i = GRU(e_i; m_{i-1}) 。GRU的初始狀態初始化為問題向量本身: m_0 = q 。 對於某些任務,情節記憶模塊在輸入上進行多次傳遞是有益的。

這個模塊還允許一種傳遞推理,因為第一遍可能會發現需要檢索其他事實。 例如,在下圖的例子中,我們被問到「where is the football?」, 在第一次迭代中,模型應該參與第7句"John put down the football.",因為問題是關於足球。 只有當模型看到John是相關的時,它才能推斷第二次迭代應該檢索John所在的位置。

作者使用門控功能實現注意機制。 對於每次傳遞i,該機制將候選事實 c_t ,先前存儲器 m_{i-1} 和問題 q 作為輸入作為輸入來計算門: g_t^i = G(c_t; m_{i-1}; q) 。其中:

G(c,m,q)=delta(W^{(2)}tanh(W^{(1)}z(c,m,q)+b^{(1)})+b^{(2)})

z(c,m,q)=[c,m,q,ccirc q,ccirc m,|c-m|,c^TW^{(b)}q,c^TW^{(b)}m]

h_t^i=g_t^iGRU(c_t,h_{t-1}^i)+(1-g^i_t)h^i_{t-1}

e^i=h_{T_C}^i

答案模塊: 根據任務類型,應答模塊在情景記憶結束時或每個時間步驟觸發一次。我們使用另一個GRU,其初始狀態初始化為最後一個存儲器 a_0 = m^{T_M}

完整代碼實現參見:

zhangtao-seu/cs224n?

github.com
圖標

推薦閱讀:
相关文章