ナード戦隊データマン

機械学習, 自然言語処理, データサイエンスについてのブログ

Multilingual Unsupervised and Supervised Embeddings ってどんな手法?

facebook/MUSE1とは、Multilingual Word Embeddingにおいて、教師なし学習教師あり学習を組み合わせた手法の一つ2です。

ざっくりいうと

2組のWord Embeddingを用いる。翻訳が共有空間において近くなるように写像を学習するのが目的。

教師あり学習

過去の線形写像によるモデルとディープラーニングによるモデルは、どちらもプロクラステス問題(対応のとれた2点郡の二乗誤差を最小化する問題)と同値なので、線形写像モデルをディープラーニングにしてもあまり改善はしない。代わりに、重み(写像)に直交性制約をつけることで改善される、というのが過去の研究の知見。

教師なし学習 (提案手法)

domain-adversarial

MUSEでは、教師なし学習を実現するために、写像を学習するためにdomain-adversarialアプローチを採用している。 ソース言語の単語ベクトルの写像と、ターゲット言語の単語ベクトルから、ランダムに選択したものを識別するDiscriminatorを作成。その一方で、Discriminatorによって見破られないように写像を訓練する。

要は、ソース言語の単語ベクトルの写像と、ターゲット言語の単語ベクトルの見分けがつかないような写像を学習するのがモデルの目的。訓練アルゴリズムは、Goodfellowのdeep adversarial networksの標準的な方法に従う。

refinement

マッピングを洗練するためにDiscriminatorで学んだ写像Wを使用して、並列語彙を作成。 具体的には、最も頻繁に使用される単語と、相互に最も近い近隣語のみを保持。 続いて、この生成された辞書にプロクラステス解を適用。

類似度指標

提案手法では、CSLSという手法でNearest Neighborを代替している。 NNの場合は、対称性がない。(yがxのK-NNであっても、xがyのK-NNとはいえない) また、ハブ(あらゆる点と近くなってしまう点)とアンチハブ(あらゆる点と近くならない点)による問題が生じる場合がある。 CSLSは、それらの問題について解決を試みた類似度で、以下で表される。

CSLS(W xs, yt) = 2 cos(W xs, yt) − rT(W xs) − rS(yt)

これにより、孤立した単語ベクトルに関連する類似性が高まり、密集した領域にあるベクトルを減らすことができる。

日本語で実行するにはどうするか

手順

  1. https://github.com/sugiyamath/jawiki2w2v を使って英語と日本語のword2vecを作っておく。
  2. 作ったgensimモデルをプレーンテキスト形式で保存。
  3. MUSE[^1]のチュートリアルに従って、教師あり学習または教師なし学習のモデルを訓練。(ただし、読み込むモデルは1,2で作ったモデル。)
  4. demo.pyでテストする。

注意: facebookが公開している日本語のfasttextは、トーカナイズの単位がメチャクチャでダメダメなので使わないでください。自前でword2vecを訓練したほうが高い精度がでます。

日本語で精度を出した結果

INFO - 04/19/19 14:59:05 - 0:00:00 - ============ Initialized logger ============
INFO - 04/19/19 14:59:05 - 0:00:00 - cuda: True
                                     dico_eval: default
                                     emb_dim: 200
                                     exp_id:
                                     exp_name: debug
                                     exp_path: /root/work/MUSE/dumped/debug/9cufi4tsle
                                     max_vocab: 200000
                                     normalize_embeddings:
                                     src_emb: dumped/debug/eya06mtlxw/vectors-en.txt
                                     src_lang: en
                                     tgt_emb: dumped/debug/eya06mtlxw/vectors-ja.txt
                                     tgt_lang: ja
                                     verbose: 2
INFO - 04/19/19 14:59:05 - 0:00:00 - The experiment will be stored in /root/work/MUSE/dumped/debug/9cufi4tsle
INFO - 04/19/19 14:59:12 - 0:00:07 - Loaded 200000 pre-trained word embeddings.
INFO - 04/19/19 14:59:21 - 0:00:16 - Loaded 200000 pre-trained word embeddings.
INFO - 04/19/19 14:59:22 - 0:00:16 - Found 1747 pairs of words in the dictionary (1423 unique). 52 other pairs contained at least one unknown word (12 in lang1, 46 in lang2)
INFO - 04/19/19 14:59:22 - 0:00:16 - 1423 source words - nn - Precision at k = 1: 35.839775
INFO - 04/19/19 14:59:22 - 0:00:16 - 1423 source words - nn - Precision at k = 5: 54.181307
INFO - 04/19/19 14:59:22 - 0:00:16 - 1423 source words - nn - Precision at k = 10: 60.295151
INFO - 04/19/19 14:59:22 - 0:00:16 - Found 1747 pairs of words in the dictionary (1423 unique). 52 other pairs contained at least one unknown word (12 in lang1, 46 in lang2)
INFO - 04/19/19 15:00:42 - 0:01:37 - 1423 source words - csls_knn_10 - Precision at k = 1: 38.229093
INFO - 04/19/19 15:00:42 - 0:01:37 - 1423 source words - csls_knn_10 - Precision at k = 5: 56.500351
INFO - 04/19/19 15:00:42 - 0:01:37 - 1423 source words - csls_knn_10 - Precision at k = 10: 63.387210
INFO - 04/19/19 15:00:45 - 0:01:39 - Building the train dictionary ...
INFO - 04/19/19 15:00:45 - 0:01:39 - New train dictionary of 4291 pairs.
INFO - 04/19/19 15:00:45 - 0:01:39 - Mean cosine (nn method, S2T build, 10000 max size): 0.61210
INFO - 04/19/19 15:03:21 - 0:04:15 - Building the train dictionary ...
INFO - 04/19/19 15:03:21 - 0:04:15 - New train dictionary of 4192 pairs.
INFO - 04/19/19 15:03:21 - 0:04:15 - Mean cosine (csls_knn_10 method, S2T build, 10000 max size): 0.61284