はじめに
機械翻訳研究の世界最大のワークショップ、WMTに2020年から英日翻訳が追加されたり、DeepLが日本語対応したり、日本語機械翻訳への注目が高まっています。そんな中で機械翻訳モデルを試しに使ってみたい、学習してみたい、そんな人もいるでしょう。私もこの分野は素人ですが今後使いたくなるかもしれません。今、どんな機械翻訳のライブラリが研究で使われているのか、自分のために調べました。なお筆者はFairseqと昔のOpenNMTしか使ったことがありません。
どんなライブラリが使われているのか
機械翻訳コンペ、WMT2019のFindingsによると
- Marian 30%超
- Fairseq 18%
- OpenNMT 16%
- Tensor2Tensor 14%
- Sockeye 14%
だそうです。それぞれ独自の機能(手法やモデルの実装)があるのですが、普通のTransformerはどれでも使えます。
Marian NMT
MarianはMicrosoft翻訳チームが開発したフレームワークです。C++で書かれているので非常に高速というのが特徴です。また、精度面も、WMT2019でMarianを利用したMicrosoftチームのシステムがさまざまな言語対で上位になっているという実績があります。
使い方は、Exampleを見る限りtokenizeされたコーパスからMarianのコマンドで語彙ファイルを作って学習、という流れのようです。
GPU版のインストールのためにはCMake 3.5.1、GCC/G++ 5.4、Boost 1.65.1、CUDA 9.0 or newerを用意してmakeすれば良いです(若かりし時の僕は何も知らずにmakeしてコケて断念しました)。
残念なことに、Marianをインストールして使ってみたという日本語記事は今のところ見当たりません。英語のdocumentやtutorialを読みましょう。
Fairseq
FairseqはFacebook AIが開発したツールキットです。Pytorchで書かれており、拡張がしやすいように設計されているのが大きな特徴で、どんどんアップデートされている印象があります。精度についてもWMT2019でFacebookチームが優秀な成績を残しています。速度はFP16モードを使えば高速です(当初はMarianより速かったがアップデートによりMarianの方が速くなったとどこかで見た気がします)。
使い方は専用のpreprocessスクリプトでコーパスと語彙をバイナリ化してから訓練します。推論時はテスト文をバイナリ化せずそのまま入力することもできます。個人的に有難い点の一つに、バイナリ化された訓練データ、および学習したモデルのcheckpointファイルをFairseqのコマンドで上書きできないようになっている(AssersionErrorが出て停止する)ことです。。Fairseqについてはいろいろ書けることはあるのですが、それだけで1記事が書けてしまいますし他の日本語記事もあるので、本記事ではこの程度の言及にとどめておきます。公式のexampleもありますし、非常に使いやすいです。
インストールはPyTorchさえ動けばほぼ大丈夫です。PyTorchは公式にOS、Package、CUDAバージョンに応じたインストール方法が書いてあるのでそれに従いましょう。
OpenNMT
OpenNMTはHarvard NLP groupとSYSTRANが開発したツールです。今日紹介するもので最も歴史が古いです。
かつてはLua版が存在していたのですがTorchのメンテ終了とともに終了したようです。現在PyTorch版(OpenNMT-py)とTensorFlow版(OpenNMT-tf)の開発が継続されています。両者は利用できる機能がかなり異なっています。また機械翻訳、言語モデリング以外にimage to text、speech to text、要約、系列分類、系列タギングもできるようです。
使い方は専用の前処理をして学習という感じで普通です。
かつで自分がOpenNMT-pyを使ったときは、インストール時にtorchtextのバージョンに苦しめられたこと、validationで一番良かったモデルを自動保存してくれたりしないので推論時に学習ログを見てモデルを選ぶ必要があること、精度が出るオプション・ハイパラがよくわからないことなどが不満でした。現在どうなってるのかわかりません。日本語記事はそこそこあるのでそちらを参考すると良いかもしれません。
##Tensor2Tensor
T2TはGoogle Brainチームにより開発された、深層学習とデータセットのライブラリです。TensorFlowで書かれています。
この記事で取り上げた他のライブラリは機械翻訳がメインの機能ですがこれは画像分類、画像生成といった様々なタスクの深層学習モデルが利用できます。
大雑把な使い方はデータ生成コマンドを実行して学習して推論という流れでですが、--problem
というオプションがあります。これは単にタスクを指定するというよりは、利用するデータセットを指定するオプションになります。そのため既存のベンチマークデータセットで実験をする分には大変楽なのですが、自前で用意したデータセットを利用するときはProblem
というクラスを継承したクラスを自分で定義する必要があります。この仕様によってモデルとデータ(と前処理方法)が明示的に紐づかせられるのは良い点ですが、お手軽さという観点では他のライブラリが勝ると思います。
日本語記事や公式のJupyter NotebookがあるのでExampleは充実している印象です。またTensorFlow Servingが使えるということもあるので、プロダクションで深層学習モデルを利用するときはこれになるのかな、と思います。
Sockeye
Apache MXNet (Incubating)を用いたSeq2Seqフレームワークです。使い方はOpenNMTとかと似た感じのようです。
このライブラリだけ調べても特徴がよくわかりませんでした・・・いかがでしたかブログみたいですみません・・・。
おわり
上から試していくのが良いんじゃないかと思います。