<b>課程主講簡介:</b>
<b>于恒</b>,阿裡巴巴機器智能技術實驗室技術專家,中科院計算所博士,研究方向是機器翻譯,在自然語言處理和人工智能領域頂級國際會議ACL、EMNLP、COLING等發表多篇論文。曾在三星中國研究院和搜狗負責機器翻譯工作,參與上線搜狗翻譯和搜狗海外搜尋等産品。目前在阿裡翻譯平台組擔任Tech-leader,主持上線了阿裡神經網絡翻譯系統,為阿裡巴巴國際化戰略提供豐富的語言支援。
以下内容根據主講嘉賓視訊分享以及PPT整理而成。
2016年伊始,Google率先釋出并上線了基于神經網絡的機器翻譯系統,其表現出的性能顯著超越了之前工業界的所有系統,并且在某些特定領域已經接近了人類的翻譯水準。傳統翻譯系統和神經網絡的翻譯系統之間的比較如下圖所示:

上圖中,藍色的部分代表傳統的phrase-based(基于短語的翻譯系統),而圖中綠色的部分代表基于neural神經網絡的系統。顯然基于neural神經網絡的系統在每個上語項都比傳統的PBMT模型要表現得更好,并且在英語>西班牙語、西班牙語>英語和法語>英語這三個特定語言對上的翻譯水準已經十分接近人類了。
具體的翻譯對比可以參看上圖中漢語>英語實際翻譯的例子。可以看到,向系統中輸入的中文語句中存在一個倒裝的句式。在經過各自的翻譯後,phrase-based的系統隻是逐字的進行漢語>英語的翻譯,而基于神經網絡的系統實作了基本的翻譯,還實作了語句的調序,使譯文顯得更加流利、更符合英文的表達特點,更加貼近于人工翻譯,就仿佛機器了解了人類的對話一樣。
從系統的機理來講,傳統的基于短語的翻譯是基于詞語對齊來實作的,而神經網絡NMT則是使用了RNN(Recurrent neural Network,循環神經網絡),借助于神經網絡對原文和譯文同時進行模組化,實作了高效精準的翻譯。這兩種方法大緻的實作過程如下圖所示:
那麼RNN是如何實作這種效果的呢?而這也是本次課程的重點所在。接下來将從以下幾個方面進一步闡述RNN的原理及其更深層次的應用:
1、RNN原理,包括網絡結構和Attention機制。
2、RNN的不足之處,并且引申出它的一個變種——LSTM。
3、通過三個案例介紹RNNs的“不講理有效性”。
4、介紹RNN無法克服的問題及相關的建設性的解決方案。
<b>一、RNN的原理</b>
<b>1、RNN網絡結構</b>
RNN的循環網絡結構如下圖所示:
如圖中左側所示,RNN主要包括以下幾個網絡層:第一層是輸入層,第二層是隐藏層(也叫context層),第三層輸出層。其中隐藏層是一個循環的結構,目前t時刻的context(t),是由連接配接上一次訓練的隐藏層context(t–1)生成。這樣設計的好處在于可以對任意長度的sequence進行模組化,這也是它差別于傳統網絡結構(要求輸入的sequence的長度是固定已知的)的一個比較本質的差別。是以RNN适用于處理人類自然語言或者語音等。
如果對RNN的循環結構進行分解,在展開後,可以發現它其實是由很多神經網絡堆砌在一起的,并且它每一層之間的參數都是共享的,導緻RNN是一個非常深的網絡結構,這種神經網絡的疊加的結構也是它的優點所在。
如果用形式化的語言對網絡結構進行表述,可以表示成ht=fw(ht-1, xt)。如下圖所示:
顯然,目前t時刻隐藏層的狀态ht,是由t-1時刻的隐藏層的狀态和t時刻的輸入xt通過函數fw來決定的。對該等式進行進一步拆分後,可以發現上述函數fw通常是用tanh函數來進行數字變換,拆分後的等式如下圖所示:
t時刻的狀态ht,是由前一時刻的狀态ht-1與Whh做矩陣相乘,再加上t時刻的輸入xt與Wxh做矩陣相乘,将這兩者之和進行tanh變換得到的。而t時刻的網絡層的輸出yt,是由t時刻的隐藏層狀态ht與Why做一個矩陣相乘得到的。
可以看到整個網絡中,所需要學習的參數有三個,第一個是隐藏層和隐藏層之間的Whh,第二個是輸入層和隐藏層之間的Wxh,第三個是輸出層和隐藏層之間的Why。
如果對RNN的整個的計算過程進行展開,如下圖所示:
在t=0時刻,随機初始化一個隐藏層的狀态h0,然後輸入x1,通過函數fw進行數字變換後得到t=1時刻的隐藏層狀态h1。然後以此類推,計算出從t=0時刻到t=T時刻的全部隐藏層狀态。在這個過程中,每個time-step共用同一組權重矩陣W。對于每個time-step的隐藏層狀态,還會借助于矩陣權重W計算得到輸出y1...yT。以上就是網絡的計算過程。
在實際的網絡訓練過程當中,可以根據每一個輸出y得到它對應的Loss,将這些Loss組合在一起就可以得到所需的反向傳播的Loss,然後通過随機梯度下降的方式進行反向傳播并更新網絡中的參數W,這樣就完成了整個的訓練過程。
如下圖所示是RNN循環結構:
圖中的每次循環都對應着不同的time-step,其算法的名字叫做Backpropagation through time。即對于一個長sequence,從第一個時間點計算到最後一個時間點,得到所有Loss之後,從最後一個時間點開始回傳,直到到達最初的時間點,同時進行權重更新。
這樣的算法其實存在一定的問題,當序列過長的時候,一次回傳必須要等整個序列完成解碼之後才能開始,這樣會導緻速度變慢,會影響整個模型收斂的速度。
是以産生了一種更加常用的算法——Truncated Backpropagation through time,如下圖所示:
它的思想是将長序列截斷成為多個短序列,然後對這些短序列進行權值更新。這樣的好處在于,在對某個長序列進行計算,在中間某個時刻的時候,可以先傳回一批梯度對參數進行更新,然後再此基礎上對剩餘的部分進行計算。這樣權值更新的次數會增多,收斂速度也會加快。
<b>2、具體案例實作</b>
下面借助一個具體的例子——字元級别的語言模型來實作上述的過程,如圖所示:
語言模型的思路與RNN是比較接近的,即目前時刻輸出的概念是如之前的曆史時刻相關的。對于序列“hello”而言,它由五個字元組成,包含有四類字母——‘h’、‘e’‘l’‘o’,在實際的訓練過程中,第一個輸入自然是‘h’,然後依次是‘e’、‘l’和‘l’,對于最
後一個字元‘o’,則不進行模組化。如上圖所示,先建立輸入層(input layer),然後根據不同的輸入得到其隐藏層(hidden layer)狀态,即目前隐藏層狀态是基于前一隐藏層狀态得到的,對于每一個隐藏層,通過計算得到一個輸出,該輸出代表着目前字元可能生成的下一個字元,這樣就得到了上述的計算圖。在計算得到輸出後,可以根據該輸出已經相應的參考答案得到相應的Loss,借此進行參數更新。
以上是訓練部分,具體的解碼過程如下圖:
假設拿到的第一個字元是‘h’,但是卻不知道該字元的後續字元是什麼,然後借助模型,經過隐藏層,得到輸出層的輸出,通過Softmax對輸出進行機率化,然後取其中生成機率最大的字元作為輸出。顯然在輸入字元‘h’時,最後得到的機率最大的字元就是‘e’,然後以此類推,就可以得到“hello”這個序列的預測。整個流程就是通過目前輸入的字元預測出下一個字元,最終預測出一個完整的序列。
<b>3、Attention機制</b>
注意力機制(Attention Mechanism)在很多任務中對性能有着很大的影響。例如在sequence to sequence model中(第一個sequence指原文,第二個sequence指譯文),如下圖所示:
圖中将英文的“I am a student”翻譯成法文,在即将生成目标端的詞語的時候,RNN模型會将源端的所有資訊壓縮在一個隐藏層當中,然後将該資訊輸入下一個sequence中進行翻譯的預測。當源端的序列很長的時候,一個隐藏層很難存放這麼多源端的資訊,這樣在資訊嚴重壓縮之後,在目标端生成翻譯的時候,會導緻所需的上下文的資訊是不夠的。這也是RNN在實際使用中常遇到的一個問題,在目前可以采用下圖中的方法進行避免:
在生成第二個單詞的時候,根據目标端的隐藏層狀态和源端的每一個隐藏層之間做相似度的計算,根據規劃得到一個權重的得分,接着生成一個上下文的Attention Layer,借助于這個Attention Layer作用于生成第二個詞的過程,進而生成正确的翻譯。Attention的這種機制其實是很符合翻譯的這種直覺的,即生成每一個詞的時候,關注的源端位置是不一樣的。在實際的應用中,Attention的這種機制的表現也非常好,這個也解決了RNN在長序列壓縮中造成的資訊丢失的問題。
<b>二、RNN存在的問題及其變種——LSTM</b>
前文中介紹的Backpropagation,即從sequence的末尾将梯度傳回至sequence的開頭。但是在梯度回傳的過程中,它每一次的回傳都要與循環網絡的參數W(實際上是W的轉置矩陣)進行矩陣相乘,其實際的數值轉換的公式如下圖:
由于在每一次回傳的過程中都需要與W進行矩陣相乘,并且重複進行tanh計算,如下圖所示:
這樣在訓練上會帶來一些問題:
1、當W的值大于1且這個序列足夠長的時候,這個回傳的梯度的數值就會變得無限大。
這種時候,可以采用Gradient clipping的方法解決,即将梯度重新進行數值變換到一個可以接受的範圍。
2、如果W的數值小于1,就可能會造成梯度消失(導緻完全無法更新)的問題。
這種時候,無論對梯度進行什麼數值操作,都無法使用梯度來對參數進行更新,這時候可以考慮改變RNN的網絡結構來克服這個缺陷,LSTM也就應運而生了。
LSTM與RNN相比,它将原有的網絡結構拆成了更細的結構,如下圖所示:
可以看到,LSTM引入幾個門的限制,例如keep gate、write gate和read gate。通過這些門來控制LSTM的資訊傳輸量。其實際的結構如下圖所示:
其中,f代表forget gate,i代表input gate,o代表output gate。上層的c在傳輸的過程中,隻與這些門限的值進行數值變換,而不用跟整個網絡參數W進行矩陣相乘,這樣就避免了RNN回傳梯度時可能發生的梯度爆炸或梯度消失的問題。
這些門限具體分為以下幾種:
1、Keep Gate:它的作用是使LSTM的cell根據不同的輸入去選擇記憶或者遺忘前一個狀态中的資訊。
2、Write Gate:它用于控制LSTM的cell接受新的輸入的百分比。
3、Update Gate:它實際上是對cell的更新,用于綜合前一時刻狀态與目前時刻狀态。
4、Read Gate:它用于控制目前狀态與Ct的資訊的輸入。
通過加入這幾個門限,實際在循環網絡結構ct-1到ct傳播的過程中,隻有一些較少的線性操作,并沒有乘法操作。這樣的好處在于它的gradient flow沒有被過多的幹擾,即整個流程中梯度的傳播是非常通暢的,這樣就解決了RNN中梯度爆炸或者梯度消失的問題。
而LSTM也存在一些變種:
1、peephole LSTM。在LSTM中,門限的數值和cell都是無關的。但其實這些cell是可以加入門限的計算過程中,去影響每個門限的值,這樣整體上資訊的流動就會更加通暢,在門限的計算上也會更準确一些,在某些任務上會取得更好的效果。
2、GRU。它将forget gate和input gate合成一個update gate,這個gate用于綜合控制cell的讀和寫,這樣可以簡化LSTM的參數,此外它還将cell state和hidden state進行合并。總體而言,它是一個比LSTM更加簡化的結構,在訓練上更加容易(參數少)。
3、Deep RNN。在RNN中,比較缺乏CNN中的階層化的結構,為了解決這個問題,它将多個RNN累積在一起,形成一種階層化的結構,并且不同層之間也存在網絡連接配接,這樣的好處在于每一層都可以代表一個資訊抽象,另外它會吸收computation network的優勢——同時相容RNN和CNN。這種網絡結構在機器翻譯、對話等領域都有很好的應用。
<b>三、RNNs的“不講理有效性”</b>
<b>1、Image Caption</b>
Image Caption,即對圖檔的文字解釋。如下圖所示:
可以看到,輸入是一張圖檔,輸出是對該圖檔的文字解釋。具體實作流程如下:首先使用CNN(卷積神經網絡)進行模組化,然後将這些資訊綜合到Encoded state中,将其作為RNN的輸入,然後逐詞生成圖檔的描述,最終得到完整的圖檔描述。
具體來看,它結合CNN和RNN的網絡結構,如下圖所示:
之是以這麼使用,是因為CNN适用于圖檔的模組化,而RNN适用于自然語言處理。是以可以先使用CNN對圖檔中的資訊進行卷積,然後将得到的結果作為RNN的輸入,去不斷的生成圖檔的描述。
當然在這個過程中,也離不開Attention的機制,具體的流程如下圖:
因為在生成圖檔的描述的時候,不同的詞對應的圖檔的位置是不同的,如果采用Attention的機制,會使得圖檔資訊的捕捉更為準确,而不是将圖檔的所有資訊壓縮到一個隐藏層裡面,使得上下文的資訊會更加豐富。
下圖包含了一些有意思的例子:
第一幅圖檔在生成frisbee這個單詞的時候,可以觀察到,frisbee那塊區域是高亮的,即它關注的區域十分正确。同樣,在第二個圖中的dog和第三個圖中的stop都是Attention機制良好作用的展現。
就實際而言,Image Caption是一個比較難的課題,上文中都是給的一個很好的例子,當然也會存在一些很差的例子。如下圖所示:
第一幅圖中,這個女生穿的衣服十分像一隻貓,在實際的圖像描述的生成過程中,這件衣服被錯誤的識别成了一隻貓,最終才得到了圖中的錯誤的描述。又如最後一幅圖檔中,運動員實際上在接球,但是他的運動形态沒能被捕捉到,才生成了他在扔球的這樣一個錯誤的描述。可以看到Image Caption目前還是處于一個實驗的階段,還沒有達到商業化的水準。
<b>2、QA</b>
在RNNs應用中另外一個比較火的是QA(問答系統)。它實作的鍊路跟上個例子有所類似,但是有一個不同之處在于:對于輸入的問題,它采用了RNN而不是CNN進行模組化,具體實作流程如下圖所示:
這就是人們常提到的Sequence to Sequence Model,即輸入是Sequence,輸出也是Sequence。對于輸入的問題,先通過循環神經網絡進行模組化,然後将得到的Encoded state輸入到另一個循環神經網絡中,然後逐詞的生成最終的回答。
在另一些例子裡面,不僅會有文字的輸入,還有圖檔等資訊的輸入,并且這些問題是基于圖檔中的場景來進行提問的,這樣就會産生圖檔和文字聯合組成QA的應用。以下圖為例:
在LSTM模組化的初始階段,是使用了CNN将圖檔壓縮作為了第一個隐藏層的狀态,并且将問題也通過LSTM進行聯合的模組化,最終将整體的資訊融入到encoder裡面,并生成對應的翻譯。從圖中也可以看到,CNN和LSTM是可以緊密的聯合在一起共同工作的,并且還可以通過Attention機制達到更好的互動。
下圖是實際應用中一個比較有意思的例子:
問A圖中是哪種動物,在Attention機制中,捕捉到的這個貓的位置(白色方框)是比較集中的,這對于解答這個問題會起到很好的作用。在圖B中問這個人拿到在切什麼,顯然白色方框聚焦的位置也是正确的。
<b>3、Machine Translation</b>
下圖中這個例子就是機器翻譯的鍊路,也是通過多層的RNN進行的模組化,最終生成一個Final input matrix,然後借助Attention的機制,逐詞生成目标翻譯。
上圖就是機器翻譯過程的整體示意圖。此外,Google提出的神經網絡的翻譯的架構如下圖所示:
在Encoder端有八層LSTM堆砌在一起的,這樣便于對輸入句子的含義進行更好的了解。然後通過Attention連接配接到另外一個八層LSTM的Decoder端,最終将結果輸出到一個Softmax,來進行翻譯的預測。
實際還有一種另外的互動的翻譯方式——Speech Translation,如下圖所示:
即通過一個語言的序列,通過一個神經網絡,得到語音識别的結果,然後對該結果進行拼寫糾正、标點處理等,得到一個較好的語音識别的text,再将其輸入到神經網絡機器翻譯系統中,生成對應日文的翻譯,再借助于Text to Speech的系統,生成對應的日文的語言。
<b>四、RNNs的阿喀琉斯之踵</b>
1、RNNs對層次資訊的表示能力和卷積能力都存在一些不足。是以産生了一些如Deep RNN、Bidirectional RNN和Hierarchical RNN的變種,都希望通過更階層化的網絡結構來彌補這種不足。
2、RNNs的并行度很低。它的目前時刻的隐藏層的狀态依賴于之前時間的狀态,并且訓練和解碼的并行度都很低。
為了解決上面的問題,提出了一種新的神經網絡的架構——Transformer,如下圖所示:
Transformer使用簡單的FF-NN替代了GRU,這樣就直接解決了在訓練中難以并行的問題。但是由于取代了循環的結構,也會導緻網絡中各個位置的資訊是缺乏的,也不知道序列的先後順序。這時引入了一個Positional Encoding,對于每個位置都有一個Embedding來存儲位置資訊。在實際的網絡結構中,可以分為幾個Sub-layer:
Sub-layer1:即全連接配接的FF網絡。
Sub-layer2:借助于sele-attention的機制來捕捉各個位置之間的關聯關系。
Between 1 and 2:加入了residual connection和layer normal。
綜上所述,而相比于RNN,Transformer有兩大優點:
1、比RNN擁有更好的性能。
2、訓練速度快了4倍。