亞馬遜開源神經機器翻譯框架Sockeye:基於Apache MXNet的NMT平臺

2020-12-05 機器之心Pro

隨著神經機器翻譯(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

相關焦點

  • 開發者必備:基於 Linux 生態的十大AI開源框架盤
    Deeplearning4j遵循Apache 2.0開源協議,提供了基於AWS雲服務的GPU運算支持,以及微軟伺服器框架的支持。官網: http://deeplearning4j.org/2.平臺下的機器學習開源框架。
  • 開發者必備:基於Linux生態的十大AI開源框架盤點
    Deeplearning4j遵循Apache 2.0開源協議,提供了基於AWS雲服務的GPU運算支持,以及微軟伺服器框架的支持。官網:http://deeplearning4j.org/2.官網:https://spark.apache.org/mllib/5. Apache Mahout:Hadoop廣泛採用的機器學習開源框架Apache Mahout同樣也是一個Apache開源項目,與MLlib相對應,Mahout是應用在Hadoop平臺下的機器學習開源框架。
  • 從星際2深度學習環境到神經機器翻譯,上手機器學習這些開源項目必...
    davisking / dlibGitHub 地址:https://github.com/davisking/dlib用 C++ 編寫的機器學習與數據分析應用工具包。apapache / predictionioGitHub 地址:https://github.com/apache/predictionio面向開發者和機器學習工程師的機器學習伺服器,基於Apache Spark,HBase 和 Spray 。
  • 谷歌開放GNMT教程:如何使用TensorFlow構建自己的神經機器翻譯系統
    機器之心對該教程進行簡要的描述,跟詳細和精確的內容請查看項目原網站。GitHub 連結:https://github.com/tensorflow/nmt機器翻譯,即跨語言間的自動翻譯,是機器學習社區最活躍的研究領域。在機器翻譯的眾多方法中,序列到序列(sequence-to-sequence,seq2seq)模型 [1, 2] 近期獲得巨大成功。
  • TensorFlow和Caffe、MXNet、Keras等其他深度學習框架的對比
    Google 在 2016 年 2 月開源了 TensorFlow Serving,這個組件可以將 TensorFlow 訓練好的模型導出,並部署成可以對外提供預測服務的 RESTful 接口,如圖 2-2 所示。有了這個組件,TensorFlow 就可以實現應用機器學習的全流程:從訓練模型、調試參數,到打包模型,最後部署服務,名副其實是一個從研究到生產整條流水線都齊備的框架。
  • Talk預告 | 南大NLP實驗室x字節李磊團隊合作研究:基於隱變量模型的神經機器翻譯
    他與大家分享的主題是: 「基於隱變量模型的神經機器翻譯」。屆時將會介紹鄭在翔及字節跳動李磊團隊提出的一個新的基於隱變量的神經機器翻譯模型:鏡像生成式神經機器翻譯模型。Talk·信息▼主題:基於隱變量模型的神經機器翻譯嘉賓:南京大學在讀博士生 鄭在翔時間:北京時間 10月10日 (周六) 20:00地點:將門TechBeat技術社區http://www.techbeat.net
  • MXNet 宣布支持 Keras 2,可更加方便快捷地實現 CNN 及 RNN 分布式...
    Keras-MXNet 深度學習後端現在可用,這要歸功於 Keras 和 Apache MXNet(孵化)開源項目的貢獻者。Keras 是用 Python 編寫的高級神經網絡 API,以快速簡單的 CNN 和  RNN 原型而聞名。Keras 開發人員現在可以使用高性能 MXNet 深度學習引擎進行 CNN 和遞歸神經網絡 RNN 的分布式訓練。
  • 有道nmt神經網絡_有道神經網絡翻譯(nmt) - CSDN
    Weaver發表《翻譯備忘錄》,第一次正式提出機器翻譯的思想,到傳統的基於短語的機器翻譯(PBMT:Phrase-Based Machine Translation),再到當今基於遞歸神經網絡(RNN:recurrent neural network)技術的神經網絡翻譯(NMT:Neural Machine Translation)的各種翻譯機和翻譯軟體的出現。
  • Transformer新型神經網絡在機器翻譯中的應用|公開課筆記
    在講課開始之前先簡短的做個自我介紹,我是博士畢業於中國科學院計算技術研究所,方向是機器翻譯的方向,目前在阿里巴巴翻譯平臺擔任翻譯模型組負責人,主要是為阿里巴巴的跨境電商貿易提供豐富的語言支持,讓跨境貿易沒有語言障礙。今天非常高興受到CSDN AI科技大本營的邀請,給大家分享自己在機器翻譯方面的研究和工作。
  • 哈佛大學 NLP 組開源神經機器翻譯系統 OpenNMT
    今天,Harvard NLP (哈佛大學自然語言處理研究組) 宣布開源其研發的神經機器翻譯系統 OpenNMT,該系統使用了 Torch 數學工具包,已達 industrial-strength
  • 機器之心年度盤點:2018年重大研究與開源項目
    但是除了它們,今年還是有很多非常美的想法,例如強行解積分的強大流模型 Glow、基於圖結構的廣義神經網絡,以及擁有連續層級的神經常微分方程。它們為深度學習開拓了新方向,也為未來提供了更多選擇。在這篇文章中,機器之心從想法到實踐介紹了 2018 年令人矚目的研究工作,它們共同構建了機器學習的當下。
  • 資源| 史丹福大學NLP組開放神經機器翻譯代碼庫(附論文)
    論文:使用混合詞-字符模型實現開放詞彙神經機器翻譯(Achieving Open Vocabulary Neural Machine Translation with Hybrid Word-Character Models)摘要:幾乎之前所有的神經機器翻譯(NMT)使用的詞彙都受限,隨後可能用一個方法來修補未知的單詞。
  • 從ACM班、百度到亞馬遜,深度學習大牛李沐的開掛人生
    作為一經推出便大受追捧的 MXNet 深度學習框架的主要貢獻者之一,李沐功不可沒。值得注意的是,這個由 DMLC(Distributed Machine Learning Community)打造的深度學習框架,創建者都是中國人,以陳天奇、李沐、解浚源等為代表。現在,包括 AWS 在內的很多企業都將 MXNet 作為主流支持框架。
  • 15 個開源的頂級人工智慧工具
    像 IBM、谷歌、微軟、Facebook 和亞馬遜等公司都在研發上投入大量的資金、或者收購那些在機器學習、神經網絡、自然語言和圖像處理等領域取得了進展的初創公司。考慮到人們對此感興趣的程度,我們將不會驚訝於斯坦福的專家在人工智慧報告中得出的結論:「越來越強大的人工智慧應用,可能會對我們的社會和經濟產生深遠的積極影響,這將出現在從現在到 2030 年的時間段裡。」
  • Cloudopt AdBlocker 發布基於機器學習的隱私保護瀏覽器擴展
    白澤是 Cloudopt 今年開源的直接運行在瀏覽器上的基於機器學習的啟發式隱私保護引擎,能夠有效的阻擋跟蹤腳本、惡意廣告腳本。使用 JavaScript 開發,可以運行在 Node.js、瀏覽器環境中。 傳統的過濾方式是使用過濾規則進行過濾,但這些過濾規則都是基於開源組織、公益組織或個人手動更新的,需要耗費大量的人力進行維護。
  • 華為深度學習框架MindSpore正式開源:自動微分不止計算圖
    機器之心報導機器之心編輯部千呼萬喚始出來——3 月 28 日,華為的全棧全場景 AI 計算框架 MindSpore 終於正式開源了。今年的華為開發者大會 HDC 2020 上,除了昇騰、鯤鵬等自研晶片硬體平臺之外,最令人期待的就是深度學習框架 MindSpore 的開源了。今天上午,華為 MindSpore 首席科學家陳雷在活動中宣布這款產品正式開源,我們終於可以在開放平臺上一睹它的真面目。
  • 谷歌推出基於注意機制的全新翻譯框架,Attention is All You Need!
    谷歌對這一基於注意力機制的Transformer表示樂觀,研究人員很高興看到模型在其他任務中表現良好,谷歌計劃研究Transformer的更廣泛應用——其他形式的輸入輸出,包括圖像、音頻及視頻等。原文連結:https://arxiv.org/abs/1706.03762,雷鋒網編譯 附谷歌之前的翻譯框架進化史:一)基於短語的機器翻譯。
  • 機器翻譯七十年:百度領跑神經網絡翻譯時代
    TechWeb報導 機器翻譯距今已有70年的發展歷史。自上世紀40年代起,基於規則、實例以及統計的機器翻譯方法漸次登場,各領風騷。
  • 馬雲爸爸「翻譯情未了」? 回顧阿里翻譯平臺的進擊之路!
    ,谷歌翻譯幾乎要霸佔整個機器翻譯市場時,阿里翻譯宣布已成功研發阿里雲PAI工具,基於阿里雲PAI可以將神經網絡翻譯訓練效率提升5倍,這將大大加速阿里翻譯平臺的建設。當時把阿里翻譯平臺定位為阿里巴巴的語言服務平臺,將瞄準人機結合模式,在語言服務領域進行更多創新。365翻譯的加入確實為阿里的跨境電商領域分擔了一些翻譯業務上的壓力。並且在機器翻譯領域,和電商相關的幾個主要語種中,其翻譯的準確率基本和谷歌翻譯持平。然而,阿里語言服務平臺的野心並不止於此。他們想藉助強大的人工翻譯團隊和電商大數據研發下一代基於神經網絡技術的翻譯平臺。
  • 谷歌語義理解框架SyntaxNet升級開啟無數可能性
    對於普通用戶而言,2015 年發布的基於深度神經網絡的谷歌智能郵件回復,2016 年上線的神經機器翻譯系統(GNMT),便源自於谷歌在該領域的研究成果。在消費級產品之外,谷歌還持續為 AI 開發者提供技術支持,不斷推出新的開源工具。