神經機器翻譯工具——OpenNMT

海量的數據背景下,人工翻譯已經無法承載所有的翻譯任務,機器翻譯效果並不十分理想,但在有些情況下可以減少理解外語文本所需要的時間和精力。我本人出身英語專業,但是仍然感覺閱讀英文文本所花費的時間和精力是中文文本的2-3倍,比如中文一分鐘能夠閱讀600-1000字甚至更多,但英語文章書籍,一般也就200-300單詞而已,而且時間長了,大腦更疲勞,難以有效獲取信息。所以藉助機器翻譯,先大致瀏覽所需理解的外語文本,不失為一種節約時間精力的方式。隨著機器翻譯的效果越來越好,它的應用場景也越來越廣泛,甚至可能徹底改變人類相互溝通的方式。

目前機器翻譯已經基本都從傳統的統計翻譯,變成了神經網路機器翻譯,效果有較大的提升,特別是西方語種之間,比如英德互譯。而中英互譯仍然有差距,不過我想達到令人滿意的效果只是時間問題,Google 和 百度 的機器翻譯,在某些類型的文檔翻譯上,已經幾乎超過人類,比如科技類的論文,Google 的機器翻譯效果尤其好。如果讓一個譯者去翻譯一篇科技類的論文,成本非常高,有很多專業辭彙,還有數學符號,懂的人並不多,翻譯起來也費時費力,但機器翻譯卻對這類文本有著很高的效率,十分令人欣喜。

現前最流行的幾種神經機器翻譯框架中,GNMT 是 Google 做的,底層用 Tensorflow,Fairseq 是 Facebook 做的,底層用 PyTorch,而野生的 OpenNMT(GitHub:OpenNMT/OpenNMT),底層用的是 Torch 這個用 Lua 寫的機器學習工具集,據稱效率很高。

這三個NMT框架目前在GitHub都是1300-2000的star數,差不太多,但論易用性和親民程度,還是OpenNMT更勝一籌。

安裝 OpenNMT

使用 OpenNMT 的主要心理障礙在於安裝 Lua 和 Torch,但令人驚異地是,Torch 的開發者已經將這些步驟簡化成了腳本,複雜的安裝過程變得十分簡單而愜意,無論是在 MacBook Pro 還是 Ubuntu 台式機上,都沒有遇到任何問題。

# 不帶 sudo 運行以下命令:ngit clone https://github.com/torch/distro.git ~/torch --recursivencd ~/torch; bash install-deps;n./install.shn

這就是安裝 LuaJIT,LuaRocks,Torch 的全部命令。十分鐘左右就可以安裝好了。

之後就是安裝兩個依賴庫:

luarocks install tdsnluarocks install bit32 # 如果使用LuaJITn

最後將 OpenNMT 的代碼庫複製到電腦上:

git clone https://github.com/OpenNMT/OpenNMTncd OpenNMTn

這樣就一切就緒了!

訓練神經機器翻譯模型

訓練時,OpenNMT 已經將函數介面都做好,我們首先我需要提供四個文件,讓程序進行預處理。四個文件分別是英文原文句子和翻譯好的中文句子,即訓練集,一般很大,還有用於驗證的英文和對應的中文句子,即驗證集,可以小一些,比如一萬對。命令行:

th preprocess.lua -train_src data/src-train.txt -train_tgt data/tgt-train.txt -valid_src data/src-val.txt -valid_tgt data/tgt-val.txt -save_data data/demon

這一步會生成三個文件,中文詞典和英文詞典,以及 torch 訓練需要的數據:

demo.src.dictndemo.tgt.dictndemo-train.t7n

接下來就是長時間的訓練了:

th train.lua -data data/demo-train.t7 -save_model demo-modeln

這個步驟所花時間由數據量大小決定,模型保存為 demo-model,是文件夾,裡面保存有每一輪訓練後產生的模型,比如你訓練十個 epoch,就有十個模型。

preprocess.lua,train.lua 這些腳本,都在複製過來的代碼庫根目錄里,直接用 th 命令運行即可。更多的參數可參考文檔:train.lua - OpenNMT

用神經網路訓練機器翻譯模型,還是非常費時間的,一萬對中英文訓練10輪都要花十幾分鐘,如果是1000萬對,沒有GPU肯定不行。一般中英文機器翻譯,至少需要100萬對以上的中英平行語料,訓練的模型才具有基本可用性,當然,數據越多越好。

使用模型翻譯文本

th translate.lua -model demo-model_epoch10_PPL.t7 -src data/src-test.txt -output pred.txtn

仍然是直接調用腳本,選擇剛剛保存的一個模型 demo-model_epoch10_PPL.t7,表示使用第10個epoch後保存的模型,為了測試,你也許會試試之前的訓練模型效果怎樣,進行一下對比。

需要翻譯的英文放在 data/src-test.txt 文件里,翻譯好的中文講保存到 pred.txt 中,一行英文對應一行中文。

總結

OpenNMT 的使用方式已經做到了極簡,基本可以直接拿來做成後端服務,而且 OpenNMT 也提供了 Docker 容器,可直接安裝使用。不過工具雖好,但中英文機器翻譯數據集並不是很多,無論是 Google 還是 Facebook 都開源了預訓練好的一些神經機器翻譯模型,但中英文的卻沒有。所以如果需要使用神經機器翻譯,有兩種方式,一種是使用 Google 或 Baidu 的機器翻譯,可找到民間自製的 API,進行調用,但免費的都有限定量,超過限額就需要收費,而且並不便宜。另一種就是自己收集中英文平行語料庫數據,用 OpenNMT 這樣的工具來訓練,這樣就可以自己隨心所欲的使用了,不過一般來說,應該很難超越 Google 和 Baidu 的效果,但是如果特別針對某一領域的文本進行訓練,也許可以獲得比較好的結果。


推薦閱讀:

Google的翻譯黑科技究竟表現如何?讓我們來做實驗
模型匯總17 基於Depthwise Separable Convolutions的Seq2Seq模型_SliceNet原理解析
【專知薈萃14】機器翻譯 Machine Translation知識資料全集(入門/進階/綜述/視頻/代碼/專家,附PDF下載)
都柏林城市大學怎麼樣?
如何評價谷歌最近提出的Seq2Seq模型SliceNet?

TAG:神经机器翻译NMT | OpenNMT | 机器翻译 |