當前位置:
首頁 > 知識 > 亞馬遜開源翻譯框架Sockeye:基於MXNet的NMT平台

亞馬遜開源翻譯框架Sockeye:基於MXNet的NMT平台

選自Amazon

機器之心編譯

參與:機器之心編輯部

隨著神經機器翻譯(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 的內在運行機制,首先讓我們看一看學界和業界通常使用的神經網路架構。

神經網路包含三個主要部分:編碼器、解碼器和注意力機制。編碼器一次一詞地讀取源語句直到讀完語句()並生成語句的一個隱表徵。編碼器經常作為循環神經網路(RNN)被實現,比如一個長短時記憶(LSTM)網路。

解碼器,也作為 RNN 被實現,從語句開頭的符號()一次一詞地生成目標語句。它可以通過生成語境向量的注意力機制獲取源語句。解碼器可以決定哪個詞與生成的下一個目標詞最相關。通過這種方式,解碼器在所有時間步驟上獲得了整個輸入句子。

神經網路生成的下一個詞成為了解碼器的輸入。解碼器基於生成的詞及其隱表徵產生了後續詞。神經網路持續生成詞直到語句結束符 出現。

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.」。試著翻譯更難的句子。確保輸入的句子經過分詞處理,即所有標點符號與單詞之間均由空格隔開。注意如果該模型不認識某個單詞時,就會輸出符號。

你還可以實現注意力網路可視化。關於這個,如果沒有 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」,儘管這兩個單詞在句子中的位置並不對應。你還可以看到該網路不認識部分單詞,並將它們輸出為符號。

總結

在本文中,你了解了用於神經機器翻譯(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

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

在訓練之後,詞典會包含所有模型組件,如參數和模型配置。

翻譯

用於翻譯的輸入數據需要與訓練數據格式統一(表徵化、經過預處理)。可通過以下方式進行翻譯:

> python -m sockeye.translate --models --use-cpu

這將使用訓練中得到的最佳參數組,從 STDIN 翻譯字元串,將結果寫入 STDOUT。

本文來源於「機器之心」,「機器之心」是人工智慧專業性媒體,適合開發者、學術研究者及從業者閱讀參考。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

中國傳統文化與深度學習的結合:上交論文「漢字字體遷移」
專訪百度雲總經理尹世明:百度雲 ABC 戰略助力開發者
23篇論文入選CVPR2017,商湯科技精選論文解讀
百度雲總經理尹世明:百度雲 ABC 戰略助力開發者,賦能各行業
英特爾與美團雲發布戰略合作,共建 AI 生態

TAG:機器之心 |

您可能感興趣

谷歌開源AdaNet:基於TensorFlow的AutoML框架
資源 | 谷歌開源AdaNet:基於TensorFlow的AutoML框架
領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
谷歌開源Kubernetes原生CI/CD構建模塊:Tekton
資源 | 領英開源TonY:構建在Hadoop YARN上的TensorFlow框架
Facebook Mask R-CNN2Go已開源
微軟開源 Windows UX 框架:WPF、WinUI、Windows Forms
超越MnasNet、Proxyless:小米開源全新神經架構搜索演算法FairNAS
PSVita開源PC模擬器Vita3K:支持Win/Mac系統
位元組跳動開源分散式訓練框架BytePS,支持PyTorch、TensorFlow等
Facebook開源Mask R-CNN的PyTorch 1.0基準,更快、更省內存
搭建Yearning 基於Inception的開源SQL審核平台
Facebook 開源 ConvNet AI:重新定義在線翻譯!
LinkedIn 開源 TonY:在 Hadoop 上運行 TensorFlow 的框架
LinkedIn開源TonY:在Hadoop上運行TensorFlow的框架
MRTK是一款面向WMR、HoloLens開發的MR開源工具
入門級的開源CANopen協議棧——MicroCANopen
TensorFlow、MXNet、PaddlePaddle三個開源庫對比
微軟宣布WPF、Windows Forms和WinUI這3個流行框架正式開源
NET Core開源API網關–Ocelot中文文檔