深度學習的機器翻譯技術
( 使用 node.js 的 neataptic 套件實作 )
陳鍾誠
2017 年 7 月 10 日
程式人《十分鐘系列》程式人《十分鐘系列》
本文衍生自維基百科
今年
● 我發現 Google 的機器翻譯品質,
變得順暢很多!
但這並不是特例
● 百度的中英翻譯甚至比 google
品質更好!
讓我們來試試看
我們從英文版維基百科中
挑了以下這篇愛因斯坦的描述
先剪貼前兩段來試試
您會發現 Google 翻譯和 2015 年時不同
翻譯的順暢度
●變得流暢很多。
●雖然有時候會翻譯錯誤。
●但可讀性已然大大提高!
你如果使用網頁翻譯
會發現看起來就像維基百科一樣
只是有時會有點小錯誤
但流暢性還是不錯的!
讓我們再看看百度的翻譯
然後和 Google 對照一下
百度翻譯 Google 翻譯
會發現翻譯不太相同,但是都還算是順暢!
問題是
● 為甚麼 Google 和百度的翻譯
都可以在這兩年內突飛猛進呢?
關於這個問題
● 牽涉到《深度學習技術》的發展!
特別是
● 循環神經網路 LSTM/GRU 模型
● 以及 Google 所創造出來的詞彙
向量化技術 word2vector 。
這種深度學習的翻譯方法
● 統稱為 sequence to sequence
(seq2seq) 式的翻譯技術!
為了理解這個技術
● 我找到了 Adam Geitgey 在 medium 網誌
上的這篇文章!
https://medium.com/@ageitgey/machine-learning-is-fun-part-5-language-translation-with-deep-
learning-and-the-magic-of-sequences-2ace0acca0aa
裡面首先介紹一些傳統的統計翻譯作法
然後才帶出文章的主角
● Recurrent Neural Networks( 循環神經網路 )
以及
Sequence-to-Sequence Models ( 序列對序列模型 )
但是
● 要理解循環神經網路 RNN/LSTM/GRU 之前
● 最好先理解一下傳統的《多層感知器》 MLP 網路!
這種網路通常有幾個中間隱藏層
● 我們可以透過反
傳遞演算法,學
習網路的權重!
只要先給定標準答案
● 就可以訓練網路盡量提高正確性!
https://medium.com/@ageitgey/machine-learning-is-fun-part-5-language-translation-with-deep-
learning-and-the-magic-of-sequences-2ace0acca0aa
如果你還不知道反傳遞演算法的原理
建議你看看上次的十分鐘系列,應該會很容易理解!
https://www.slideshare.net/ccckmit/ss-77490577
如果你已經認識傳統的神經網路
● 但是不熟悉深度學習技術的循環神
經網路 RNN/LSTM/GRU
那麼建議你看看這篇十分鐘系列
https://www.slideshare.net/ccckmit/rnn-lstm-77568016
應該就能清楚地體會到
● 循環神經網路到底能做些甚麼!
基本上
●循環神經網路 RNN/LSTM/GRU
●都很擅長《序列預測》!
在語言領域
● 擅長《序列預測》的意思,就是可以
自動產生出下一個《最可能的字》
● 於是一個接一個, RNN/LSTM/GRU 就可
以自動產生出整篇文章!
以下是循環網路序列預測的模型
https://medium.com/@ageitgey/machine-learning-is-fun-part-5-language-translation-with-deep-
learning-and-the-magic-of-sequences-2ace0acca0aa
所以如果把莎士比亞拿來學
● 結果是電腦自動
學會了寫小說
● 而且是莎士比亞
風格的小說
如果把 Linux 原始碼拿來訓練
● 結果是電腦學會了
寫 C 語言
● 不過只是外型像而
已,編譯執行結果
恐怕很難有用!
看到這裡
● 您應該開始具備理解《深度學習機
器翻譯技術》的基本知識了!
用循環神經網路做翻譯
● 必須把兩個循環網路連接起來
● 一個稱為編碼器 Encoder ,另一個
稱為解碼器 Decoder 。
像是這樣
Encoder Decoder
語句向量
輸入語句 輸出語句
中間的語句向量
Encoder Decoder
語句向量
輸入語句 輸出語句
讓 Decoder 在解碼時,可以產生《語法文字不同,但語義相同》的語句!
循環網路的強項
Encoder Decoder
語句向量
輸入語句 輸出語句
就是產生《順暢的語句》,因此翻譯的語句不會讀起來卡卡的!
這種 Encoder/Decoder 的模式
● 不只可以用來做《翻譯系統》
也可以用來做《影像自動描述系統》
電腦甚至可以詳細的描述整個場景
但是
● 上述的模型有點太簡化!
Encoder Decoder
語句向量
輸入語句 輸出語句
在下列課程中有更詳細的模型和數學式
● CS224n: Natural Language Processing with Deep Learning
● 其中 Encoder 輸出的記憶向量 C
和 yi 合起來成為 Decoder 的輸入
http://web.stanford.edu/class/cs224n/lectures/cs224n-2017-lecture9.pdf
但是
● 上面這些只是模型和數學理論
● 要落實為程式還缺乏一些元素!
對於 Google 這種等級的
真實翻譯系統而言,還要考慮到
● 詞彙量很大:必須做 word2vec 向量化,將詞彙
轉成數百維的向量
● 要有大量的平行與料庫 ( 中英對照之類的 ) ,才
能把神經網路訓練好。
● 要有大量的 CPU/GPU 才能對大量的平行語料做訓
練。
問題是
● 我沒有大量的平行語料
● 也沒有大量的 CPU/GPU 可以用
所以我決定
● 先做一個小的範例
● 就以《貓狗世界》為例好了!
我採用 neataptic.js 這個套件
來製作我們的《第一個 LSTM 循環神經網路翻譯系統》!
該系統放在我 github 的 ai6 專案裏了
https://github.com/ccckmit/ai6/tree/master/book/mt
訓練過程大約需要五分鐘
我們的訓練語料很簡單
● 就只有幾句貓狗世界的翻譯而已
我們放入了一些
刻意安排的案例
● 有些無法對應的詞
– 像是:隻
● 一對多的翻譯:
– 像是:狗 =dog, 小狗 =puppy
● 不同的詞序
– 像是:狗 一 隻 = a dog
翻譯的結果如下
除了訓練語句之外
● 我們還測試了一些《訓練集以外》的語句
● 其中兩句翻得很好
– 小狗一條 = a puppy
– 黑狗一隻 = a black dog
● 但有一句不好
– 黑 貓 一 隻 = a black
您可以發現
● 這個《小系統》表現得還算 OK
● 基本上展示出了《循環神經網路》
seq2seq 模型在機器翻譯上的能力
與特性!
雖然我們的實作
● 其實是用兩階段的訓練方式
– 第一階段訓練中英翻譯 ( 也就是選詞 )
– 第二階段訓練語句產生 ( 產生順暢語句 )
● 這和 CS224n 課程中有點不同
– 但是實驗結果發現是可行的!
或許未來有更多資源時
● 我們會嘗試建立一個
《可以實用的完整深度學習翻譯系統》
但是萬事起頭難!
在這裡
●我們至少邁出了第一步。
雖然我們還沒有加入
● Word2vec 的詞彙向量化機制
● 而是採用 one hot 的簡單向量化方法
但是我想
●對於小規模的實驗
●程式應該越簡單越好!
如果您有興趣
● 歡迎下載這個程式來玩玩看!
這就是我們今天的
十分鐘系列
希望您會喜歡!
我們下回見!
Bye Bye!

深度學習的機器翻譯技術 (使用node.js的neataptic套件實作)