はじめに
私はB4から自然言語処理研究室に配属になり、M2になった今年までNMT(Neural Machine Translation,ニューラル機械翻訳)の研究を行っています。メインで取り扱っているのはdata augmentation(データ拡張)によるモデルの精度改善なのですが、NMTのデータ拡張を語る上ではBack Translationという手法を避けては通れません。
この2年間でそれなりにノウハウも溜まってきたので、この機会にアウトプットしてみたいと思います。ご覧になった方の参考になれば幸いです。
Back Translationとは何か?
この手法は2016年にSennrichらの論文「Improving Neural Machine Translation with Monolingual Data」内で発表されました。
NMTは基本的に大規模な対訳コーパスを用意し、Transformerなどのアーキテクチャを用いて機械翻訳モデルを構築します。具体的には数百万〜数千万個の文章が最低限必要ですし、翻訳精度を上げようとすればするほど更に桁違いの学習データが必要になってきます。
ここで、いくつかの問題が生じます。例えば
- 言語によって得られる資源の量に格差がある。 英語などメジャーな言語のデータに比べて日本語のデータは母数がはるかに少ないし、当然収集できる対訳コーパスのサイズも小さくなる。
- 対訳コーパスは基本的にあるドメイン(分野)に特化している(例えばWikipediaの同一記事の英語版と日本語版から得た文とか)。よって完成した翻訳モデルは、翻訳したい文章がどのドメインに属するかによって翻訳の精度に偏りが生じる。 (上記の例だとWikipedia記事中に現れない言葉や話し言葉・砕けた表現を使った文章の翻訳精度はどうしても低くなる。)
これらの対策となりうる手法がBack Translationです。それでは、順を追って説明していきます。
データの用意
ソース言語を英語、ターゲット言語を日本語とし、精度の高い英日翻訳モデルが欲しいという状況を仮定します。ここで以下のデータを用意します。
- 英日対訳コーパス$D_E,D_J$(それなりのサイズ)
- 日本語の単言語コーパス$M_J$(大きめのサイズ)
後者は要するに日本語の文章を片っ端から集めたデータと思ってください。当然ですが対訳コーパスに比べて簡単に集められるので、まあまあ大量に用意できますよね。ここでは対訳コーパスはWikipedia記事を収集したもの、単言語コーパスはTwitterからアニメに関するツイートを収集したものと考えましょう。
翻訳モデルの学習
対訳コーパスを用いて英語→日本語方向と日本語→英語方向の翻訳モデルを学習します。サイズが小さいのでこの時点ではどちらのモデルも大した精度ではありません。
逆方向に翻訳
ここで、最終的な目的である英日翻訳とは逆方向となる日英モデルを用いて$M_J$を翻訳し、新たな英語文$M_E$を生成します。
先述の通りドメインの違いがあるため、$M_E$はノイズや文法のミスに塗れた汚い英語文になっていることに留意してください。
新しいデータを用いて再学習
そうすると、$D_E+M_E$と$D_J+M_J$のペアを新たな対訳コーパスとして扱うことができます。 この対訳コーパスで1から再学習しても良いですし、先程作成した英日モデルのパラメータを引き継いでも構いません。 いずれにしても、上記の行程により対訳コーパスのサイズが大きく水増しされたことにより、当初のモデルより精度の高い翻訳モデルを作ることが可能になります。
また、学習データに$M_J$が入り込んだことにより、このモデルは「Wikipedia記事」と「アニメに関するツイート」の2つのドメインに対応しているということが考えられます(これを「ドメイン適応」と言います)。
なんで"Back Translation"なの?
先述の通り$M_E$は必ずしも文法的・意味的に正しくないノイズの多い文になりますが、これが新たな対訳コーパスのソース言語(英語)側に使われています。直感的に考えて学習データの品質が悪ければモデルに悪影響を及ぼすのでは?と考えがちですが、今回の英日翻訳モデルにおいて英語側のデータは正しい日本語文を生成するための条件・前提の役割にすぎません。目的はあくまで正確なターゲット言語(日本語)文を生成することなので、英語文にノイズがあることは必ずしもモデルの性能悪化には繋がりませんし、むしろノイズが混じることでモデルの頑健性が上がることが期待できます。(実際、あえてソース側のデータの一部の単語orトークンをランダムに削除した対訳ペアを学習データに追加することで、モデルの精度を上げるという方法があります。)
逆に英語の単言語コーパスを翻訳して日本語文を生成した上で同じことをやろうとすると(つまり日本語側にノイズの多い対訳コーパスを追加データにしてしまうと)、結果的に大してモデルの精度は上がりません。英日モデルの精度を上げるには、逆方向である日英モデルで単言語コーパスを翻訳することで追加の対訳コーパスを作らなければならないのです。この逆方向の翻訳で順方向のモデルを改善するというのが、"Back Translation"という名前の由来となっています。
まとめ
Back Translationの基本的な流れを説明しました。
蓋を開けてみればシンプルな方法ではありますが、実際に数多くのタスクでBack Translationによって翻訳モデルの精度が大幅に改善すること、ドメイン適応の面でも大きな効果があることがこれまでに報告されています。また、本手法に一工夫を加えたり本手法を反復的に繰り返すことでさらに大きくモデルを改善するという方法も多数存在します。
それらに関しては#2の記事で説明していく予定です。
最後まで読んでいただき、ありがとうございました!