隨著神經機器翻譯(NMT)技術的不斷演進,越來越多的科研機構和公司選擇開源自己的項目,讓更多人能夠開發出自己的 NMT 模型。此前,清華大學開源了神經機器翻譯工具包 THUMT,谷歌也推出了基於 TensorFlow 的 NMT 模型搭建教程。作為 MXNet 的支持者,亞馬遜也開源了自己的 NMT 框架 Sockeye。在本文中,亞馬遜宣稱這個基於 MXNet 的工具可以用於構建目前業內表現最佳的神經機器翻譯模型。
Sockeye GitHub 連結:https://github.com/awslabs/sockeye
說明文檔:http://sockeye.readthedocs.io/en/latest/
你想使用機器學習做翻譯嗎?通過 Sockeye 框架,你可以建模機器學習以及其他序列到序列的任務。基於 Apache MXNet 的 Sockeye 架構可為打造、訓練和運行當前最優的序列到序列模型承擔絕大部分工作
在自然語言處理 (NLP) 中,很多任務是關於序列預測問題。例如,在機器翻譯 (MT) 中,任務是在給定輸入單詞序列的情況下預測已翻譯單詞的序列。執行這種任務的模型常被稱為序列到序列模型。近來,深度神經網絡(DNN)顯著提升了這些模型的性能。Sockeye 同時提供了一個當前最優的神經機器翻譯(NMT)模型的實現和一個開展 NMT 研究的平臺。Sockeye 是一個基於 Apache MXNet 的快速而可擴展的深度學習庫。Sockeye 代碼庫具有來自 MXNet 的獨特優勢。例如,通過符號式和命令式 MXNet API,Sockeye 結合了陳述式和命令式編程風格;它同樣可以在多塊GPU上並行訓練模型。本文中,我們首先對 NMT 作了一個概述,接著展示了如何使用 Sockeye 訓練一個帶有注意力的最小 NMT 模型。
帶有注意力的序列到序列模型如何工作?
為了理解 Sockeye 的內在運行機制,首先讓我們看一看學界和業界通常使用的神經網絡架構。
神經網絡包含三個主要部分:編碼器、解碼器和注意力機制。編碼器一次一詞地讀取源語句直到讀完語句(<EOS>)並生成語句的一個隱表徵。編碼器經常作為循環神經網絡(RNN)被實現,比如一個長短時記憶(LSTM)網絡。
解碼器,也作為 RNN 被實現,從語句開頭的符號(<BOS>)一次一詞地生成目標語句。它可以通過生成語境向量的注意力機制獲取源語句。解碼器可以決定哪個詞與生成的下一個目標詞最相關。通過這種方式,解碼器在所有時間步驟上獲得了整個輸入句子。
神經網絡生成的下一個詞成為了解碼器的輸入。解碼器基於生成的詞及其隱表徵產生了後續詞。神經網絡持續生成詞直到語句結束符 <EOS> 出現。
Sockeye:為使用 MXNet 的機器翻譯進行序列到序列建模
Sockeye 實現了 MXNet 上當前最佳的序列到序列模型。它同樣為所有序列到序列模型的超參數提供恰當的默認值。對於優化,你無需擔心停止標準、指標跟蹤或者權重初始化。你可以簡單地運行已提供的訓練命令行界面(CLI)。
你可以輕易改變基礎模型架構,比如:
RNN 單元類型(LSTM 或 GRU)和隱藏狀態大小
RNN 層的數量
源序列和目標序列嵌入的大小
應用於源編碼的注意力機制的類型
Sockeye 同樣有其他更高級的功能,比如:
束搜索推理
多模型的簡單集成
RNN 層之間的殘差連結
輸出層預測的詞彙偏倚
門控語境(Context gating)
交叉熵標籤平滑
層歸一化
為了訓練,Sockeye 允許你完全掌控重要的優化參數。例如,你可以設置優化器類型、學習率、動量、權重衰減和提前停止條件。Sockeye 跟蹤了訓練和驗證數據上的多個指標(包括專門針對機器翻譯的指標,比如 BLEU)。
我們計劃不斷擴展 Sockeye 功能集,為研究者提供實驗 NMT 新想法的平臺。
訓練一個最小模型來做翻譯
現在,我們先來訓練第一個神經機器翻譯模型,下列命令需要在類 Unix 作業系統殼層(shell)上運行,如 Linux 或 Mac OS X。
獲取數據集
首先,獲取一個平行語料庫(parallel corpus)。平行語料庫是多個原文和譯文的集合。Sockeye 需要所有的輸入數據是空格分隔開的語言符號。把數據輸入到 Sockeye 之前,運行分詞器,把詞和標點分隔開來。你可以從本文中下載 WMT 2017 新聞翻譯任務分詞後的訓練數據和開發數據。使用以下殼層命令下載新聞文章的德-英平行句對:
curl http://data.statmt.org/wmt17/translation-task/preprocessed/de-en/corpus.tc.de.gz | gunzip | head -n 1000000 > train.de curl http://data.statmt.org/wmt17/translation-task/preprocessed/de-en/corpus.tc.en.gz | gunzip | head -n 1000000 > train.en
這裡,我們只需要使用前 100 萬句對進行訓練。但是實際中,你需要在更大的數據集上訓練模型。
為跟蹤訓練過程中未知句對的質量指數,你需要下載一個驗證集:
curl http://data.statmt.org/wmt17/translation-task/preprocessed/de-en/dev.tgz | tar xvzf -
現在,你有了包含訓練用平行句對的 train.de 和 train.en 文件、包含未知驗證句對的 newstest2016.tc.de 和 newstest2016.tc.en 文件。在未知句對上評估模型質量非常重要,因為這可以幫助正確地評估模型在新句對上的性能表現。
安裝 Sockeye
由於模型計算成本高昂,我們通常推薦在一個 GPU 上運行 Sockeye。也就是說,你可以在沒有 GPU 的電腦上運行 Sockeye。如果你想在 CPU 上運行 Sockeye,使用下列命令安裝 Sockeye:
pip install sockeye
注意:
在 CPU 上運行 Sockeye 的時候,必須確保在所有命令上添加--use-cpu。否則,Sockeye 將嘗試在 GPU 上運行,並失敗
如果你有可用的 GPU,那麼使用以下命令安裝適用於 CUDA 8.0 的 Sockeye:
pip install sockeye --no-deps numpy mxnet-cu80==0.10.0
使用下列命令,安裝適用於 CUDA 7.5 的 Sockeye:
pip install sockeye --no-deps numpy mxnet-cu75==0.10.0
訓練模型
現在你已經做好訓練前的一切準備了。運行下列命令開始訓練你的第一個德語英語神經機器翻譯模型:
python -m sockeye.train -s train.de \ -t train.en \ -vs newstest2016.tc.de \ -vt newstest2016.tc.en \ --num-embed 128 \ --rnn-num-hidden 512 \ --attention-type dot \ --dropout 0.5 \ -o model
上述命令適用於對嵌入 128 和 512 個隱藏單元的模型進行訓練。在訓練過程中,Sockeye 定期輸出驗證指數。
在 p2 樣例上使用單個 K80 GPU 進行訓練大約需要 13 個小時。訓練結束後,你可以在 model 文件夾中找到所有偽影(artifact),如模型參數。
翻譯
模型訓練結束後,你可以輸入分詞後的句子開始翻譯:
echo "Das grüne Haus ." | python -m sockeye.translate -m model 2>/dev/null
這句話的譯文是「the green house.」。試著翻譯更難的句子。確保輸入的句子經過分詞處理,即所有標點符號與單詞之間均由空格隔開。注意如果該模型不認識某個單詞時,就會輸出<unk>符號
你還可以實現注意力網絡可視化。關於這個,如果沒有 matplotlib,你還需要安裝 matplotlib 作為額外依賴項:
pip install matplotlib
將輸出類型設置成 align_plot,以創建可以看到注意力網絡的 align_1.png 文件:
echo "Das grüne Haus ." | python -m sockeye.translate -m model --output-type align_plot
輸出結果應該與下圖類似:
你可以看到,目標語言中的每一個單詞都對應該網絡注意到的源語言單詞。該注意力機制對於促使該模型輸出高質量的翻譯結果並不總是奏效。如果句子比較複雜,那麼注意力就可能如下圖:
你可以看到該模型認為單詞「sprechen」對應英語中的「discuss」,儘管這兩個單詞在句子中的位置並不對應。你還可以看到該網絡不認識部分單詞,並將它們輸出為<unk>符號。
總結
在本文中,你了解了用於神經機器翻譯(NMT)的序列到序列模型,也學習了如何使用 Sockeye——一個基於 MXNet 的序列到序列框架——來訓練並運行一個最小 NMT 模型。
如何使用 Sockeye
該項目包含 Sockeye,一個基於 Apache MXNet,用於神經機器翻譯的序列到序列框架。它可以實現著名的、帶有注意力機制的編碼器-解碼器架構。
系統需求
Sockeye 要求的環境:
Python3
MXNet-0.10.0 (https://github.com/dmlc/mxnet/tree/v0.10.0
numpy
安裝
AWS DeepLearning AMI 用戶只需運行以下代碼即可安裝 sockeye:
> sudo pip3 install sockeye --no-deps
對於其他環境,你可以選擇通過 PIP 或直接錄入原始碼。
CPU
> pip install sockeye
GPU
如果你希望在 GPU 上運行 sockeye,你需要確認你的 Apache MXNet 包含了 GPU 的代碼。在 CUDA8.0 中,你可以通過以下代碼運行:
> wget https://raw.githubusercontent.com/awslabs/sockeye/master/requirements.gpu-cu80.txt> pip install sockeye --no-deps -r requirements.gpu-cu80.txt > rm requirements.gpu-cu80.txt
在 CUDA 7.5 中:
> wget https://raw.githubusercontent.com/awslabs/sockeye/master/requirements.gpu-cu75.txt> pip install sockeye --no-deps -r requirements.gpu-cu75.txt > rm requirements.gpu-cu75.txt
引用
CPU
如果你僅希望使用 sockeye 而不去擴展它,在複製 git 代碼後只需如此安裝:
> python setup.py install
GPU
如果你希望在 GPU 上運行 sockeye,你需要確定 Apache MXNet 包含了 GPU 代碼。如果你的 CUDA 是 8.0 版本,你可以用如下代碼運行:
> python setup.py install -r requirements.gpu-cu80.txt
如果 CUDA 為 7.5 版本:
> python setup.py install -r requirements.gpu-cu75.txt
可選項
為了跟蹤訓練過程中的學習曲線,你可以選擇安裝 dmlc tensorboard(pip install tensorboard)。如果你希望創建校準圖,你可以安裝 matplotlib(pip install matplotlib)。一般來說,你可以使用以下方式從 Sockeye 源文件夾中安裝所有可選依賴項:
> pip install -e '.[optional]'
AWS DeepLearning AMI 用戶需要使用 python3 命令而非 Python。
運行 Sockeye
在安裝後,如 sockeye-train、sockeye-translate、sockeye-average、sockeye-embeddings 這樣的命令行工具均可使用。此外,如果 sockeye 在你的 PYTHONPATH 目錄中,你可以直接使用其中的模組。例如 sockeye-train 可以這樣調用:
> python -m sockeye.train <args>
AWS DeepLearning AMI 用戶需要使用 python3 命令而非 Python
訓練
為訓練你的第一個神經機器翻譯模型,你需要兩個平行的文件:一個用於訓練,另一個用於驗證。後者將用於在訓練期間計算各種指標。每個集合應包含兩個文件:一個用於源文件,一個用於目標句子(翻譯結果)。兩個文件應該有相同的行數,每一行包含一個句子。每個句子應該是一個用空格分隔的表徵列表。
例如,如果訓練德語-英語翻譯模型,你需要如此調用 Sockeye:
> python -m sockeye.train --source sentences.de \ --target sentences.en \ --validation-source sentences.dev.de \ --validation-target sentences.dev.en \ --use-cpu \ --output <model_dir>
在訓練之後,詞典<model_dir>會包含所有模型組件,如參數和模型配置。
翻譯
用於翻譯的輸入數據需要與訓練數據格式統一(表徵化、經過預處理)。可通過以下方式進行翻譯:
> python -m sockeye.translate --models <model_dir> --use-cpu
這將使用訓練中得到的最佳參數組,從 STDIN 翻譯字符串,將結果寫入 STDOUT。
原文連結:https://aws.amazon.com/cn/blogs/ai/train-neural-machine-translation-models-with-sockeye/
sockeye說明文檔:http://sockeye.readthedocs.io/en/latest/README.html