yoheikikuta / paper-reading

Notes about papers I read (in Japanese)
156 stars 4 forks source link

[1508.07909] Neural Machine Translation of Rare Words with Subword Units [paper-reading] #20

Open yoheikikuta opened 5 years ago

yoheikikuta commented 5 years ago

論文リンク

https://arxiv.org/abs/1508.07909

公開日(yyyy/mm/dd)

2015/08/31

概要

機械翻訳のモデルで rare word に対応するために、単語よりも小さい sub-word レベルを最小単位として扱うことを提案した論文。 rare word は例えば複合語などがあり、これは単語レベルで見ると確かに rare だが sub-word レベルで見ると割とメジャーなものの組み合わせで表現できたりするので、その意味で有利になる。 Byte Pair Encoding (BPE) という手法で encoding をして sub-word の辞書を作るというのが論文の趣旨。この BPE は以下のようなアルゴリズムになっている。

めちゃくちゃシンプルだがそこそこ良い結果を返していて、この論文以降 sub-word レベルでの取り扱いが流行っている。

yoheikikuta commented 5 years ago

sub-word 単位での tokenization とその元となっている Byte Pair Encoding をちゃんと勉強してみたいな、という機運が高まったので読んでみることにした。

yoheikikuta commented 5 years ago

話の前提としては以下。

yoheikikuta commented 5 years ago

単語レベルの機械翻訳での機械翻訳で rare word を扱う一つの方法として、back off モデルがある。 これは、学習時に rare word を [UNK] に置き換える。そして翻訳時の target 文に [UNK] が現れた場合は、source 文との対応をつけて、[UNK] に対応する言葉を辞書を使って引っ張ってくる、というもの。

例) source: The indoor temperature is very pleasant. target: Die [UNK] ist sehr angenehm.

このときに indoor temperature に対応するものを辞書で引っ張ってくるという手法。単純な名詞とか一対一対応しているものならばうまくいきうるが、例えばこの例のように innentemperatur (innen + temperatur) のような複合語とか一対多対応の場合はうまくいかない。

この辺をあまり真面目に勉強する気はないんだけど、こういう理解で合っているのかね?機会があったら誰か詳しい人に聞いてみるとしよう。


これはここに書いてる理解で概ね合っていて、本論文(の一つ)は https://arxiv.org/abs/1410.8206 これをやるにはターゲット分の未知語がどこに由来するものかを追えるようにする必要があるが、それをやった時に未知語に対して辞書を適用して翻訳するか、辞書が適用不可能ならアイデンティティ翻訳(原文のまま使う)を適用する。

yoheikikuta commented 5 years ago

この辺の課題を踏まえて、 open vocabulary な機械翻訳を可能とするために sub-word 単位の取り扱いをしたい。 そこで Byte Pair Encoding (BPE) を使って word segmentation をして sub-word を作りましょうという話。

機械翻訳の基礎として RNN encoder-decoder の話も触れているが、これは知っているので飛ばす。

あんまり昔の自然言語処理の論文を読まないので、文法用語が何を表すか正確に掴めなくてそこそこしんどいな〜。

yoheikikuta commented 5 years ago

sub-word 単位で考えることにより、知らない単語に関しても翻訳が可能になるようにしたい。 このような可能性を持つ単語のカテゴリとして以下の三つを挙げている。

yoheikikuta commented 5 years ago

これまでの翻訳モデルとの違いに関しては、そこまで詳しく知りたいわけじゃないので流し読み。 機械翻訳においては文字単位とか形態素単位では significant improvement が見られないという話や、sub-word 単位で attention を貼れた方がより適切にその効果を発揮されるだろう(複合語などを考えれば reasonable)という話など。

yoheikikuta commented 5 years ago

python による minimal implementation は以下。 get_stats でスペース区切りで登録された辞書の中の共起回数をカウントしてその辞書を返す。 merge_vocab で target となる pair をくっつけたものを元の辞書から置き換える作業をする。 それを指定回数だけ繰り返すということになっている。

最終的に返るのは以下の dict となる。

{'low e r </w>': 2, 'low</w>': 5, 'newest</w>': 6, 'w i dest</w>': 3}
yoheikikuta commented 5 years ago

気持ちは分かるけど、実際の BPE とは異なる動きをしているように思われる。 実際は以下の動きをするはず。

Algorithm 1 はまあこの共起が多いものをどう見つけているか、くらいに思っとけばいいだろう。 単語も少し進むと low, lowest, newer, wider が出てきてちょっと Algorithm 1 と違うものが出てきたり、なんかこの辺の書き方は締まらないなぁという感じ。

とはいえ、やっていることはごくシンプルで理解は容易い。

yoheikikuta commented 5 years ago

主題は理解した。 実験結果は細かいところにそんなに興味がないが、メインのものだけ載せておく。

BPE-60k は source と target 別々に辞書から BPE encoding を学習したもの。BPE-J90k は source と target の辞書の和集合をベースに BPE encoding を学習したもの。

これだけ見るとめちゃくちゃ優秀というほどではないが、まあ良さそうという結果になっている。 この論文の後 sub-word がめちゃくちゃ流行って、現在ではかなり sub-word based になっているという意味で、よく cite されていて重要な論文という位置付けになっているっぽい。

yoheikikuta commented 5 years ago

あんまり細かい議論は追ってないところもあるが、モチベーションであった BPE は理解したので満足した。

yoheikikuta commented 5 years ago

greedy にやってくので、全ての2文字の組み合わせを考えてから3文字の組み合わせを考えるのか、という疑問が出るかもしれない。これは最頻出の2文字の組み合わせが一つの symbol として扱われるので、この symbol と他の1文字の組み合わせが最頻出になれば他の2文字の組み合わせを差し置いて3文字の組み合わせが生じうる。