Stanford CS224n 第九講:機器翻譯和高級循環神經網絡 LSTMs 和 GRUs

目錄:

1. 基於統計的機器翻譯模型

2. 基於RNN的機器翻譯模型

3. GRU(2014)

4. LSTM(1997)

5. 總結

\newline
\newline

1. 基於統計的機器翻譯模型
目前基於統計的機器翻譯系統要具備以下幾點:

  • 源語言(source language) 比如要被翻譯的法語French-f;
  • 目標語言(target language) 比如我們要翻譯成的語言English-e
  • 貝葉斯概率公式:
    e^=argmaxep(ef)=argmaxep(fe)p(e)\hat{e}=argmax_ep(e|f)=argmax_ep(f|e)p(e)
    其中p(f|e)爲翻譯模型,是通過平行語料庫訓練(統計)出來的;
    其中的p(e)爲語言模型,是通過目標語言訓練(統計)出來的;
    上式中的等式推導是利用的貝葉斯概率公式:
    p(ef)=p(fe)p(e)p(f)p(e|f)={p(f|e)p(e) \over p(f)}
    後驗概率=先驗概率*似然/邊緣概率,這裏的邊緣概率可以是源語言(已經給定),因此p(f)=1
    翻譯模型的流程框架圖如下:
    在這裏插入圖片描述
    直觀上我們做機器翻譯就是找到一個最佳匹配的過程,下面我們就把上面的過程拆分成兩部分來描述
    步驟一:Alignment(匹配)
    此步驟是針對上面談到的翻譯模型,目的是知道源語言中的某個單詞或者短語會被翻譯成目標語言中的哪些單詞或短語。但是這會面臨很多問題:
    在這裏插入圖片描述
    這些問題會導致組合的爆炸,非常難解決。當然這肯定難不住一直奮鬥在這一領域的先賢們,他們理應詞組和語法,而不僅僅是單詞去構造複雜的匹配系統完成匹配,最終得到了我們想要的匹配結果(一個單詞或者詞組可能會匹配到若干個單詞或詞組),整個步驟一如下圖:
    在這裏插入圖片描述
    步驟二:Decoder(解碼)
    在步驟一中因爲源語言中的某個短語或單詞在目標語言可能會匹配到若干個單詞或詞組,所以我們需要解碼器去找到最好的組合,形成翻譯結果。解碼過程如下圖:
    在這裏插入圖片描述
    傳統機器翻譯模型的總結:
    (1)需要大量的人工特徵去構造翻譯系統
    (2)需要大量的時間和人力去構造翻譯系統
    (3)傳統的機器翻譯模型最主要的問題是,它不僅僅是一個複雜的系統,它還需要有多個機器學習模型(翻譯模型、語言模型等)來組成,而深度學習的end-to-end方式完全碾壓它。

2. 基於RNN的機器翻譯模型
既然傳統的機器翻譯模型如此複雜,那麼深度學習模型RNN是否能夠在這一領域大放異彩呢,我們首先來看一下RNN是如何來做機器翻譯的:
在這裏插入圖片描述
此處編碼器和解碼器爲一個RNN單元(PS:先入爲主,以前看過機器翻譯,剛開始以爲兩個RNN不是一個,原來先賢們是從同一個RNN刻畫編碼和解碼開始嘗試的,後面的改進才變成兩個RNN)。

  • 編碼器的作用是,講要翻譯的內容通過RNN編碼成一個固定維度的向量。
  • 解碼器的作用是,將編碼器的結果作爲輸入,通過RNN進行解碼翻譯。

由於編碼器將整個要翻譯的內容編碼成了一個固定爲度的向量,所以編碼器RNN輸出的結果最好要能夠捕捉到整個要翻譯內容的特徵,但是實際上只能捕捉到五六個單詞的特徵,所以翻譯效果不是很好,後面我們會通過LSTM、GRU對這個問題進行改進。

下面我們先通過公式來定義一個基礎的基於RNN機器翻譯模型:
編碼器:
ht=ϕ(ht1,xt)=f(Whhht1,Whxxt)h_t=\phi(h_{t-1},x_t)=f(W^{hh}h_{t-1},W^{hx}x_t)
解碼器:
ht=ϕ(ht1)=f(Whhht1)h_t=\phi(h_{t-1})=f(W^{hh}h_{t-1})
yt=softmax(W(S)ht)y_t=softmax(W^{(S)}h_t)
損失函數採用交叉熵損失:
loss=maxθ1Nn=1Nlogpθ(y(n)x(n))loss=max_{\theta}{1\over N}\sum_{n=1}^Nlogp_{\theta}(y^{(n)}|x^{(n)})

基於RNN機器翻譯模型的一系列拓展:
(1)將模型中的編碼器和解碼器變爲不同的兩個RNN,即訓練兩個不同權重的RNN單元,一個用於編碼,一個用於解碼;
(2)改變解碼器的輸入,解碼器的公式變爲:
hD,t=ϕD(ht1,c,yt1)h_{D,t}=\phi_D(h_{t-1},c,y_{t-1})
其中編碼器的輸入不再僅僅是上一時刻的隱向量ht1h_{t-1},而是變成了:
ht1h_{t-1}:上一時刻的隱向量
c:編碼器最後的輸出
yt1y_{t-1}:上一時刻的輸出

結構圖如下:
在這裏插入圖片描述
(3)訓練多層的RNN or 訓練雙向的編碼器
在這裏插入圖片描述

(4)將輸入逆序去訓練編碼器,即把A B C→X Y改爲C B A→X Y,課中說在翻譯時把對應的單詞放近一點,防止梯度消失。(PS:我認爲,序列太長的時候,這樣在解碼階段就會防止解碼器忘記要翻譯句子的前面的部分,但是這樣的話,雖然A距離X比以前進了,但是原來C距離Y一個序列長度,現在double了,感覺像是拆了東牆補西牆,效果也不會好到哪兒去)

3. GRU(2014)
這裏改進主要的思想是使RNN單元更復雜,加入了‘門’的概念,這樣做:
(1)使RNN單元能夠保留住長距離依賴的記憶
(2)基於輸入,RNN單元能夠使一些錯誤信息或者無用的信息消失
標準的RNN不經過任何門,直接通過此時輸入xtx_t和上一時刻的隱狀態ht1h_{t-1}計算,如下式:
ht=ϕ(ht1,xt)=f(Whhht1,Whxxt)h_t=\phi(h_{t-1},x_t)=f(W^{hh}h_{t-1},W^{hx}x_t)
但是此時GRU複雜化了這個過程,完成了上面的兩個改進思想;
GRU基於此時輸入xtx_t和上一時刻的隱狀態ht1h_{t-1}計算出了自己設計的更新門(update gate)和重置門(reset gate);

更新門(update gate)的計算公式:
zt=σ(W(z)ht1+U(z)xt)z_t=\sigma(W^{(z)}h_{t-1}+U^{(z)}x_t)
重置門(reset gate)的計算公式:
rt=σ(W(r)ht1+U(r)xt)r_t=\sigma(W^{(r)}h_{t-1}+U^{(r)}x_t)
SIGMOD函數會使更新門和重置門會計算出兩個值在0-1之間的權重向量
下面我們就來看看這兩個門是如何發揮作用的:

  • 重置門計算出當前時刻輸入的新記憶:
    ht^=tanh(Wxt+rtUht1)\hat{h_t}=tanh(Wx_{t}+r_t \bigodot Uh_{t-1})
    其中\bigodot是哈達瑪集(對應位置元素相乘);
    如果重置門的rtr_t權重值爲0,則計算出來的h^t\hat h_t忽略前面時刻傳入的信息,只保留輸入的xtx_t的信息。

  • 更新門幫助計算出當前時刻形成的最終的記憶(上一時刻傳過來的記憶+當前時刻輸入的記憶):
    ht=ztht1+(1zt)h^th_t=z_t\bigodot h_{t-1} + (1-z_t)\bigodot \hat h_t
    更新門的ztz_t的權重值越接近1,則說明最終記憶更依賴於前面時刻傳入的記憶;反之,則說明最終記憶更依賴於當前時刻傳入的新記憶。

GRU的流程圖如下:
在這裏插入圖片描述

4. LSTM(1997)
有了GRU,下面我們來介紹其拓展–更加複雜的LSTM。
首先看一下LSTM提出的幾個門:
(1)輸入門(input gate)
it=σ(W(i)xt+U(i)ht1)i_t=\sigma(W^{(i)}x_t+U^{(i)}h_{t-1})
(2)遺忘門(forget gate)
ft=σ(W(f)xt+U(f)ht1)f_t=\sigma(W^{(f)}x_t+U^{(f)}h_{t-1})
(3)輸出門(output gate)、
ot=σ(W(o)xt+U(o)ht1)o_t=\sigma(W^{(o)}x_t+U^{(o)}h_{t-1})
以上三個門都是三個0-1權重值的向量;

  • 遺忘門:通過此時刻的輸入xtx_t和上一時刻出傳過來的ht1h_{t-1}計算出,上一時刻傳過來的cell細胞狀態(記憶)要忘掉哪些;比如上一時刻傳入的cell記憶中包含主語,而新的輸入xtx_t也包含主語,此時就要忘記上一時刻傳入的記憶中的主語,其對應的權重值也將變小。
  • 輸入門:通過此時刻的輸入xtx_t和上一時刻出傳過來的ht1h_{t-1}計算出,此刻輸入的信息應該保留哪些;比如上一時刻傳入的cell記憶中包含主語,而新的輸入xtx_t也包含主語,此時就要記住此刻傳入的記憶中的主語,以便代替遺忘門忘掉的主語。
  • 輸出門:通過此時刻的輸入xtx_t和上一時刻出傳過來的ht1h_{t-1}計算出,此刻輸出的信息應該保留哪些;比如,輸出判斷是一個動詞,那麼我們需要根據代詞是單數還是負數,進行動詞的詞形變化。

(4)新的細胞狀態c^\hat c
ct^=tanh(W(c)xt+U(c)ht1)\hat{c_t}=tanh(W^{(c)}x_t+U^{(c)}h_{t-1})
通過此時刻的輸入xtx_t和上一時刻出傳過來的ht1h_{t-1}確定細胞狀態所存放的新信息
(5)t時刻最終的記憶
ct=ftct1+itc^tc_t=f_t\bigodot c_{t-1} +i_t\bigodot \hat c_t
最終記憶=上一時刻傳入的記憶(忘掉一些信息後)+此刻形成的新記憶(輸入門篩選後)
(6)t時刻輸出的隱狀態
ht=ottanh(ct)h_t=o_t\bigodot tanh(c_t)
我們把細胞狀態通過 tanh 進行處理(得到一個在 -1 到 1 之間的值)並將它和 sigmoid 門oto_t的輸出相乘,最終我們僅僅會輸出我們確定輸出的那部分。

LSTM流程圖如下:
在這裏插入圖片描述

5. 總結
其實站在現在的角度來看,以前做的一些嘗試有點傻瓜或者不值得。但是先賢們仍然通過不斷的嘗試將NLP推進到了現在的這一步,科研可能就是這樣,通過不斷的嘗試,用事實或者結果來說話;就像現在深度學習的效果,雖然很難解釋,但是事實證明深度神經網絡已經攻佔了各個領域,就讓我們站在巨人的肩膀上來增加巨人的高度吧~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章