astamuse Lab

astamuse Labとは、アスタミューゼのエンジニアとデザイナーのブログです。アスタミューゼの事業・サービスを支えている知識と舞台裏の今を発信しています。

ニューラル機械翻訳モデルを自作してみる

f:id:astamuse:20201208203648p:plain

こんにちは、師走ですね。業務に関連した技術トピックをということで、今回は翻訳について書こうと思います。

機械翻訳について

弊社アスタミューゼは知の「流通・活用・民主化」を掲げており、世界各国の特許やグラントその他のデータを収集・分析・提供しています。これらの文書は当然各国語で記述されているため、統一した分析処理のためには機械翻訳や多言語処理が必要不可欠です。

ニューラル機械翻訳

2020年を振り返って翻訳関連の話題といえばDeepLを思い浮かべる方が多いのではないでしょうか。2018年頃から欧州を中心にGoogle Translateと比べた品質の優位性が話題になり、3月に日本語対応が発表されたことで国内での認知度が一気に向上しました。試しにつかってみたという方も多いはずです。

www.deepl.com

このDeepLに代表されるように、ここ数年の機械翻訳の発展は、自然言語処理のなかでもニューラル機械翻訳(Neural Machine Translation, 以下NMT)という分野の研究成果が寄与しているようです。従来の統計的機械翻訳と比べた性能向上やNMT固有の誤りとその対処法などが、国際会議でもさかんに報告されています。

この記事では、ニューラル機械翻訳(NMT)システムがその内側でどんな処理をしているかを理解することを目的に、実際に簡単な翻訳モデルを手元で作成してみて、その品質を評価するところまでをご紹介します。

学習データと翻訳エンジン

自然言語処理の入門教材として公開されている言語処理100本ノックは、これから勉強をはじめてみようという人におすすめのページです。 ちょうど今年から最終課題の10章に機械翻訳が取り入れられていますので、これを参考にして進めましょう。自然言語処理を勉強するいまどきの学生さんは機械翻訳ぐらいは当たり前にできないといけないみたいです。(大変ですねー)

nlp100.github.io

nlp100.github.io

基本的には、複数言語で同じ内容が書かれた文書対からなるパラレルコーパスという学習データを利用して、翻訳エンジンで語句の対応関係を学習していくことになります。 今回は学習データにこの教材でも紹介されている京都フリー翻訳タスク (KFTT)を利用します。

www.phontron.com

翻訳エンジンは

ニューラル機械翻訳モデルの構築には,fairseq,Hugging Face Transformers,OpenNMT-pyなどの既存のツールを活用せよ.

とありますので、fairseqを選択しました。また、fairseqをさらに使いやすくしたModernMTというラッパーがあるので、これを利用します。

github.com

github.com

学習手順

まずは最低限の学習手順を説明します。ModernMTの推奨環境はこちらから参照してください。

手元の検証環境は

  • Ubuntu 18.04
  • GeForce RTX 2080Ti (Driver Version: 455.45.01)
  • Java (openjdk version "1.8.0_275")

でした。 手元にGPUがないよ、という方はGoogle Colabを使った詳しい解説がこちらにありますので、ご参考ください。

KFTTのダウンロードと展開

% curl -OL http://www.phontron.com/kftt/download/kftt-data-1.0.tar.gz
% tar xvzf kftt-data-1.0.tar.gz

ModernMTのダウンロードと展開

% curl -OL https://github.com/modernmt/modernmt/releases/download/v4.7/mmt-4.7-ubuntu.tar.gz
% tar xvzf mmt-4.7-ubuntu.tar.gz

でそれぞれのファイルを展開したあと、

% cd mmt

でModernMTフォルダへ移動します

% mkdir -p examples/kftt/train
% cp ../kftt-data-1.0/data/orig/kyoto-train.* examples/kftt/train/

として、kyoto-train.jaとkyoto-train.enをexamples/kftt/train以下にコピーしておきます。この状態で

% ./mmt create ja en examples/kftt/train --train-steps 30000 --save-interval 1000 --arch transformer_mmt_big --fp16

と実行すれば日英翻訳モデルの学習が始まります。train-stepsの部分が学習のステップ数で、大きいほど学習が継続されモデルの性能が向上することが期待できます。 この例の3万ステップの場合3時間ほどで処理が終わりました。

自作モデルを利用した翻訳処理

ModernMTには翻訳サーバとしての機能も組み込まれているので、学習が終わったら下記コマンドでサーバを立ち上げてみましょう。

% ./mmt start

APIは下記ドキュメントに記載されている通りです。

API Documentation · modernmt/modernmt Wiki · GitHub

ここでは簡易的にcurlでGETリクエストを発行してみます。

% curl "http://localhost:8045/translate?q=道元(どうげん)は、鎌倉時代初期の禅僧。&source=ja&target=en"
{"status":200,"data":{"translation":"Dogen was a Zen priest in the early Kamakura period.","sourceWordCount":13,"targetWordCount":11,"priority":"normal","totalTime":128,"memoryLookupTime":0,"decodingTime":127,"queueTime":0,"queueLength":0}}

原文 道元(どうげん)は、鎌倉時代初期の禅僧。

翻訳文 Dogen was a Zen priest in the early Kamakura period.

クエリパラメタqの文章は学習に用いなかったkftt-data-1.0/data/orig/kyoto-test.jaから抜粋したものですが、きちんと翻訳できているみたいです。

性能評価

英検3級の私からすれば、これだけ訳すことができれば十分じゃないか、とも思うのですが、実際にその品質を客観的指標をつかって測ってみましょう。 評価指標にはBLEUをつかうことが標準的です。(詳しい説明はこちらをどうぞ)ModernMTはBLEUを含めいくつかの指標で作成モデルを評価し、Google翻訳と比較評価できる仕組みが提供されています。

% ./mmt evaluate
============== EVALUATION ==============

Testing on 1982 lines:

(1/6) Translating with ModernMT...                               DONE in 6m 36s
(2/6) Translating with Google Translate...                       DONE in 60s
(3/6) Preparing data for scoring...                              DONE in 0s
(4/6) Scoring with Matecat Post-Editing Score...                 DONE in 1m 10s
(5/6) Scoring with BLEU Score...                                 DONE in 1s
(6/6) Scoring with CharCut Accuracy Score...                     DONE in 7s

=============== RESULTS ================

Matecat Post-Editing Score:
  ModernMT            : 44.8 (Winner)
  Google Translate    : 37.8

BLEU Score:
  ModernMT            : 25.6 (Winner)
  Google Translate    : 15.4

CharCut Accuracy Score:
  ModernMT            : 52.7 (Winner)
  Google Translate    : 49.3

Translation Speed:
  Google Translate    : 0.03s per sentence
  ModernMT            : 0.20s per sentence

このように、Matecat Post-Editing, BLEU, CharCut Accuracyの各指標でGoogle翻訳を上回る翻訳性能を発揮していることがわかります。その一方で処理速度は10分の1程度のようです。 興味があれば、さらに学習時のtrain-stepsパラメータを変化させてみて、どのように性能が変化するかぜひ試してみてください。

次のステップ

今回紹介したモデル作成手順は、ドメイン適応(Domain Adaptation)という問題と直結しています。一般的な機械学習システムと同様に、End to endの教師あり学習をしているに過ぎないので、このモデルに汎化性能があるかどうかは全く保証できないのです。学習データに近いドメインの文書は正しく翻訳結果を得ることが期待できますが、かけ離れた内容の文書が入力として与えられた場合はそうとは限りません。(試しにこのモデルで京都と無関係のテキストを翻訳してみてください。。)

一方で紹介したようなオープンソースソフトウェアのおかげで、これまで専門の研究者でなければ手を出せなかった機械翻訳モデルが、データさえ揃えば誰でも自作できるようになったのはいい時代だな、と思います。

今回利用したModernMTは翻訳家の方が利用するTradosやmemoqといったCATツールに対応しており、もとは欧州委員会のHorizon2020プロジェクトから生まれたソフトウェアのようです。 また、その内側で動いているfairseqはFacebook Researchがオープンソースで提供している深層学習による系列変換ライブラリで、mBARTM2M-100などの最新モデルをいち早く試すことが可能です。このライブラリを直接使うことで、より豊富な事前学習モデル選択と細かなパラメータ調整が可能です。(詳しい方法はまた機会があればご紹介したいと思います。)

技術的な詳細はどうでもいいから、もっと簡単に自分の用途に合ったカスタム翻訳モデルがつくりたい!という場合はGoogle CloudのAutoML TranslateやNICTの翻訳エンジンを元にしたみんなの翻訳が検討対象になるのではないでしょうか。

cloud.google.com

mt-auto-minhon-mlt.ucri.jgn-x.jp

End to endの技術なので、原文と翻訳文の対が大量にあれば、簡単に目的に応じたドメイン適用を試すことができるようになりつつあります。今後このような動きはますます活発になると思われ、注目の分野ですね。

まとめ

今回はニューラル機械翻訳の入門ということで、自作モデルの学習と評価の方法をご紹介しました。ModernMTを利用することで、学習データを用意するだけで、簡単に手元の環境で翻訳モデルを作成できることが示せたと思います。

実際に弊社でも科学技術文書や特許文書に特化した研究開発を行っています。このように機械学習や深層学習を実ビジネスに活用することに興味がある!という方はぜひ下記バナーの採用サイトからご応募いただければと思います。

Copyright © astamuse company, ltd. all rights reserved.