ブログではないです

ブログでなくはないです

UNSUPERVISED NEURAL MACHINE TRANSLATION [Artetxe+, ICLR'18]

URL: https://arxiv.org/pdf/1710.11041.pdf

概要

各言語の単言語コーパス+ cross-lingual embeddingsを使うことでパラレルコーパス無しで機械翻訳をしよう、という論文。 具体的にどうやるかというと下図のように言語共通のencoderと言語独立のattention付きdecoderを用意して, 訓練時はそれぞれの単言語コーパスを使ってautoencoder (入力文をそのまま復元するモデル)を学習することでencoderが言語非依存の中間表現を出力してくれることを期待する。そしてテスト時に入力の言語と異なるdecoderを用いると復元された入力文は目的言語のものになり、結果的に翻訳が行われているという仕組み。(例えば訓練を仏→仏、独→独で行ってテストは仏→独みたいな)

f:id:jack_and_rozz:20180422082536p:plain:w400

しかし問題となるのが普通にやると中間表現に入力文の言語非依存な情報が上手いこと圧縮されてそれを元に復元・・・という風にはならず、 (自分の理解ではattentionに頼りすぎて、という事だと思う)入力文の単語を盲目的に一つずつコピーしていくようなモデルになってしまい、結果的に違う言語では上手くいかなくなってしまう事らしい。

それを解決するために著者らが提案しているのが(1) denoising (2) On-the-fly backtranslation と呼ばれる2つの工夫で、前者は入力文がN単語なら N/2回隣り合う単語をランダムに入れ替えて順番をめちゃくちゃにして、単純に左からコピーしていっても復元できないようにしてやる、という方法。 また後者の具体的な内容としては、まず訓練の各ステップで現在のモデルを使って翻訳を行う。そうして得られた (言語Aの入力文, 言語Bの出力文) のペアをひっくり返してそのステップの訓練データに加えてやることで,モデルが出力したちょっと変な言語Bの文から言語Aの文を復元できるようにする、という方法。
どちらの方法もautoencoder関連で過去に提案された、入力をわざと崩してやることでencoderが出力する中間表現をロバストにしてやろうという発想に近いものだと思うけど、 On-the-fly backtranslationについてはモデルが途中のステップで出力する文って恐らくかなりおかしい感じになっている訳で、そんなの訓練中に突っ込んで学習がぶっ壊れないのかよ、という感想。元ネタらしい (Sennrich+, '16) をちゃんと読んだほうがいいのかな。

実験と結果

いくつかの言語対に対して unsupervised, semi-supervised (訓練にパラレルコーパスをちょっとだけ使う), supervised (普通のニューラル翻訳) を条件を変えて比較。denoising, on-the-fly backtranslation単体だと微妙だが、両方合わせると (semi-)supervised に勝てないまでもそこそこいい線行くらしい。*1

また、semi-supervisedの結果が示すように単体ではモデルの学習が困難な小さいデータでもunsupervisedにちょっと加えてやると大分性能が良くなるというのはかなり面白い。自分の感覚では他のタスクでもよくある整ったデータセットのサイズって 10k~100kくらいで、この量だと何かモデル学習するには(特にニューラルだと)タスクによっては微妙に心もとないしどうも使いにくいよなーと思っていたのでこういう大規模な単言語コーパス + 小規模の高品質 (task-orientedな) コーパスを組み合わせるみたいな話は有望だと思う。

f:id:jack_and_rozz:20180422084540p:plain

雑感

面白かったけどメインの提案である中間表現の質を上げる話、入力を盲目的にコピーする問題はattention使ってるせいじゃねえのという感が否めない。そもそもattentionという手法が入力文全体の情報を一つの中間表現に全部負担させるのではなく、各ステップのencoderの出力に分散させてやろうという発想なわけで、autoencoderのようなuniversalな中間表現を作りたいという話と相反しているように感じる。attention無しバージョンは試さなかったんだろうか? (上記の問題を差し置いても自分で文のautoencoder作ってみた時、attentionを入れないほうが普通に性能良かった気がするんだけど・・・)

*1:byte pair encodering (BPE) はslightly beneficialだとか言っていたけど2. ->4. の変化は十分大きくない?それとも4. って proposed + BPE じゃなくて proposed + backtranslation + BPE ってこと?