CS224d-Day 9:
GRUs and LSTMs -- for machine translation
視頻鏈接
課件鏈接
本文結構:
-
機器翻譯系統整體的認識
- 什么是 parallel corpora
- 三個模塊
- 各模塊有什么難點
-
RNN 模型
- 最簡單的 RNN 模型
-
擴展模型
- GRU:
- LSTM
下面是video的筆記:
1.機器翻譯
機器翻譯是NLP問題中比較難的其中之一,為了解決這個問題,有一些很好玩的模型:
Gated Recurrent Units by Cho et al. (2014)
http://arxiv.org/pdf/1412.3555v1.pdf
http://arxiv.org/pdf/1502.02367v3.pdfLong-Short-Term-Memories by Hochreiter and Schmidhuber (1997)
http://web.eecs.utk.edu/~itamar/courses/ECE-692/Bobby_paper1.pdf
LSTM 是很早以前的模型,GRU 是比較新的。
過去的方式很傳統,現在的 Deep Learning 是基于統計的,它們以 parallel corpora 為基礎。
什么是 parallel corpora?
是個很大的 corpora,句子和段落都是對齊的.
比如 European Parliament,歐洲議會 的筆記,它們被歐盟的所有語言所記錄,所以你會看到一句英語,法語,意大利語,德語等等。
通常我們只需要一對語言,也就是一句翻譯成一句。
此外我們也有翻譯整段文字的場景,一樣的,這個時候就是段落的對齊。
這是一個非常復雜的系統,先做一個整體的認識,然后再看具體的模塊:
例如輸入的語言是 French,目標語言是 English,我們希望翻譯的概率達到最大。
也就是,如果給了f,它被翻譯成e的概率最大,那e就是翻譯的結果。
這里有三個模塊:
第一個是 Translation Model,是通過訓練 parallel corpora 得到的,就是有一句 French,一句對應的 English。
第二個是 Language Model,它只通過 English 來訓練 ,這是一個隨機的 corporate,我們只是需要一個單語言 English 的語料庫,所以可以是任意的 Wikipedia,句子,段落。
第一個模塊,會把輸入的 French 句子,切割成單詞和短語,然后去 parallel corpora 找對應,然后再把它們拼起來。
這個過程中,會得到很多候選者,第二個模塊中,就用 Language Model 給它們重新打分,把句子變的通順。
然后在第三個模塊 Decoder 中,將兩個模塊合起來,它會將所有的翻譯進行打分,最終返回一個最合理的結果。
接下來,具體看:
第一個 Translation Model,目標是要知道 輸入的 French 對應的是什么 English。
這一步很難,CS224n 中有專門講這一步。
有什么難點?
這個圖里,左邊是 English,右邊是 French,右邊的 Le 是沒有對齊翻譯的,模型需要識別出來。
在下面這個例子中,左邊的 and 在 parallel corpora 是沒有翻譯的,還有一種情況是 左邊的 implemented 對應著多個翻譯。
這還算簡單點,因為 English 和 French 的語序差不多,如果遇到不同語序的一對,那幾乎需要翻轉所有單詞。
還會有一個 French 可以對應多個 English:
還有多個 French 對應多個 English:
通過第一個模塊后,假設我們已經給輸入的語言找到了最有可能的短語結果,接下來想要根據語法知識形成一個完整的句子的翻譯,而不只是單詞的對應。
Decoder:
這里的難點是,有很多可能的選擇,很多不同順序構成的句子。
我們要在所有可能的組合中找到最有可能的結果,這是個龐大的搜索任務。
這只是一個簡單的概括,機器翻譯是個很龐大的系統,由不同的模型組成,分別處理不同的問題,還有很多重要的細節這里都沒有講。
2. RNN模型
那么 深度學習 可以簡化這個系統嗎?只用一個 RNN 就能做到機器翻譯嗎?目前還沒有達到這個水平,最新的一篇文章,還沒有超過最好的機器翻譯系統。不過,這幾個并不是翻譯專業的作者,用了一年的時間,就可以訓練出只比傳統最好的模型的準確度低0.5%的模型。
上圖是將 德語 翻譯成 英語,模型的輸入是 詞向量,然后經過 recurrent neural network ,用 logistic regression,這一次不是預測下一個單詞,而是預測一個完整的句子組成形式。
下面是最簡單的 RNN 模型,在 Encoder 中,每一個輸入的詞向量都會經過線性變換,Encoder 是一個 recurrent neural network,Decoder 是同樣的 RNN,每一次得到一個最有可能的翻譯結果,然后讓所有單詞的 cross entropy 達到最小。
接下來是一些擴展模型。
第一個是訓練 encoding 和 decoding 的不同的 weights。
decoder 可以是預先訓練好的語言模型,只需要預測合理的 English 短語。
由上面的圖里的公式, encoder 和 decoder 的 phi 函數是不一樣的。
擴展2是計算 decoder 的每個隱藏層,輸入有三部分:上一狀態的隱藏層,encoder的最后一個向量,前一個預測出來的單詞 y_(t-1)
下面這個圖是上圖的具體化,意思是一樣的,
擴展3是把隱藏層數增加。
擴展4是 bi-directional encoder, 就是不只是用encoder的最后一個向量,還有第一個向量。????沒太懂這個模型的意義
擴展5是把輸入的句子倒置后再去翻譯。
GRU:
擴展6是 Better Units,就是GRU,論文:http://arxiv.org/pdf/1412.3555v1.pdf
GRU 為了獲取更長的記憶,它想要保持住隱向量的某些元素,所以在下面這個公式里,我們并不想要f內部的內積,因為這個矩陣相乘會改變隱藏層的狀態。你可以將保持的記憶信息帶到后面的很多步里。
GRU的定義:
標準的RNN在下一步計算隱藏層,GRU有很多recurrent units,再計算最后的h。
前兩步是計算兩個不同的gate.
第一個是 update gate,這里并沒有用隨機的非線性函數,只是用了sigmoid,代表門是可以on和off的,開/關的狀態下會帶來不同的影響,update gate zt 依賴于當前的輸入詞向量和上一步的隱藏層狀態。
第二個是 reset gate,輸入和 zt 是一樣的,不過 W 和 U 矩陣是不一樣的。
有了兩個 gate,下一步是想要有一個臨時的 memory content:h_t tail.
當 reset gate 是0時,那過去的記憶并不重要,就可以完全忽略過去的記憶 h_(t-1)。
例如做情感識別時,一句影評說了 awsome,后面接了一段無關緊要的話,那么這些話就可以忽略,就只需要考慮 current input word。
最后的 h_t,當 z_t=1 時,最后的記憶就只是copy上一狀態的記憶,而不需要考慮過去的很多記憶。當 z_t=0 時,就需要考慮當前word以及它和前面記憶的聯系。
下圖是 GRU 的一個簡潔表示圖:
input是詞向量,然后計算兩個 gate,再計算 reset memory,
當根據 h_(t-1), h_t tail 計算 h_t 時,z_t 起到修正的作用,當計算 h_t tail 時,r_t 起到修正的作用。
也就是,GRU是為了達到一個長期的記憶,而是否需要長期記憶是由 z_t 控制的,當z_t=1時,它把h_(t-1)復制過來,意味著過去的 梯度,誤差等信息,都被復制過來,這在做 back propagation 的時候,誤差不會越來越小,只是被傳送到后面。
GRU還可以用來做count的任務,而標準的RNN就很難做到。
小結:
最后一句,例如,當你的 前一半 reset gate 非常活躍時,那隱藏層的前一半就會持續地更新,而另一半則是0,你不會把它們考慮進去。
寫成代碼就是,定義一個 GRU 的class,輸入inputs后會經歷兩個function,forward propagation,back propagation,在forward時計算 gates 等變量。back 函數會把delta加上一些gradient再輸出一個新的delta。
這里有一個不錯的 Theano-GRU 代碼:
GRU的代碼theano:
LSTM
下面是LSTM,很早的模型啦。
有三個 gate,
第一個 input gate,當 current cell 很重要的時候,就希望更新它,i_t 的值就很大。
h_(t-1)就代表著 memory。
第二個 forget gate,就是忘記你的過去吧,忘記你至今學到的所有。
第三個 output gate,有了它,你就不需要把內部的狀態告訴后面的網絡,只需要keep around就可以了,不需要tell。
當你想要預測單詞時,當你看到一整句話時,你只需要輸出一個結果,并不需要釋放所有的隱藏層和記憶。給了兩個facts,然后進行推理,再給出output即可。
例如,在一個問答系統里,當你問 where is the toy, 你現在只知道 John took the toy, 所以現在你無法回答問題,但是又經過了幾步,你得到 John went to the kitchen, 現在你就可以回答 kitchen 了。
然后就是用這些 gate 來計算最后的 memory cell 和 hidden state。
下面這個是LSTM直觀的圖表示:
[cs224d]
Day 1. 深度學習與自然語言處理 主要概念一覽
Day 2. TensorFlow 入門
Day 3. word2vec 模型思想和代碼實現
Day 4. 怎樣做情感分析
Day 5. CS224d-Day 5: RNN快速入門
Day 6. 一文學會用 Tensorflow 搭建神經網絡
Day 7. 用深度神經網絡處理NER命名實體識別問題
Day 8. 用 RNN 訓練語言模型生成文本
Day 9. RNN與機器翻譯
Day 10. 用 Recursive Neural Networks 得到分析樹
Day 11. RNN的高級應用
我是 不會停的蝸牛 Alice
85后全職主婦
喜歡人工智能,行動派
創造力,思考力,學習力提升修煉進行中
歡迎您的喜歡,關注和評論!