Sentence Transformers 2.2 : 訓練 : 多言語モデル (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/06/2022 (v2.2.2)
* 本ページは、UKPLab/sentence-transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
Sentence Transformers 2.2 : 訓練 : 多言語モデル
多言語 BERT (mBERT) と XLM-RoBERTa による問題は、それらはそのままでは非常に悪いセンテンス表現を生成することです。更に、言語間のベクトル空間は位置合わせされていません、つまり、異なる言語の同じコンテンツを持つセンテンスはベクトル空間の異なる場所にマップされるということです。
私の論文 Making Monolingual Sentence Embeddings Multilingual using Knowledge Distillation (知識蒸留を使用した単一言語センテンス埋め込みの多言語化) で、センテンス埋め込みをより多くの言語に拡張する簡単なアプローチを記述しています。
Chien Vu もまたこのテクニックについて素晴らしいブログ記事を書いています : A complete guide to transfer learning from English to other Languages using Sentence Embeddings BERT Models (センテンス埋め込み BERT モデルを使用した英語から他の言語への転移学習への完全ガイド)
利用可能な事前訓練済みモデル
利用可能なモデルのリストについては、事前訓練済みモデル をご覧ください。
使用方法
モデルを以下のように使用できます :
from sentence_transformers import SentenceTransformer
embedder = SentenceTransformer('model-name')
embeddings = embedder.encode(['Hello World', 'Hallo Welt', 'Hola mundo'])
print(embeddings)
パフォーマンス
パフォーマンスは 意味的テキスト類以度 (STS) 2017 データセット で評価されました。このタスクは 2 つの与えられたセンテンスの意味類以度 (スケール 0-5) を予測することです。STS2017 は、英語、アラビア語とスペイン語の単一言語テストデータと、英語-アラビア語、-スペイン語と -トルコ語に対する交差言語テストデータを持っています。
STS2017 を拡張して、英独、仏英、伊英と蘭英に対する交差言語テストデータを追加しました (STS2017-extended.zip)。パフォーマンスは、予測された類以度と正解スコアの間の Spearman 相関を使用して測定されます。
貴方自身のモデルの拡張
アイデアは固定された (単一言語の) 教師モデル に基づいています、これは一つの言語の望まれるプロパティを持つセンテンス埋め込みを生成します。生徒モデル は教師モデルを模倣すると想定されます、つまり教師と生徒モデルにより同じ英語センテンスは同じベクトルにマップされるはずです。生徒モデルが更に多くの言語で動作するように、生徒モデルを並列 (翻訳) センテンスで訓練します。各センテンスの翻訳も元のセンテンスと同じベクトルにマップされるべきです。
上の図で、生徒モデルは Hello World とドイツ語翻訳 Hallo Welt を teacher_model(‘Hello World’) のベクトルにマップする必要があります。平均二乗誤差 (MSE) 損失を使用して生徒モデルを訓練することによりこれを実現します。
私たちの実験では、生徒モデルを多言語 XLM-RoBERTa モデルで初期化しました。
訓練
完全に自動化されたコードサンプルについては、make_multilingual.py をご覧ください。
このスクリプトは TED2020 コーパス をダウンロードします、TED と TEDx 講演からのトランスクリプトと翻訳を含むコーパスです。そしてそれは単一言語モデルを複数の言語 (en, de, es, it, fr, ar, tr) に拡張しています。TED2020 は 100 言語以上の並列データを含みますので、単純にスクリプトを変更して、好きな言語で多言語モデルを訓練することができます。
データ形式
訓練データとして、並列センテンス、つまり様々な言語に翻訳されたセンテンスが必要です。データ形式としては、タブ区切り .tsv ファイルを使用します。最初のカラムには、ソースセンテンス、例えば英語センテンスを持ちます。続くカラムには、このソースセンテンスの翻訳を持ちます。ソースセンテンス毎に複数の翻訳を持つ場合、それらを同じ行か別の行に置くことができます。
Source_sentence Target_lang1 Target_lang2 Target_lang3 Source_sentence Target_lang1 Target_lang2
サンプルファイルはこのようなものです (EN DE ES) :
Hello World Hallo Welt Hola Mundo Sentences are separated with a tab character. Die Sätze sind per Tab getrennt. Las oraciones se separan con un carácter de tabulación.
翻訳の順序は重要ではなく、最初のカラムが教師モデルにより理解される言語のセンテンスを含むことだけが重要です。
訓練データセットのロード
ParallelSentencesDataset クラスを使用してそのような訓練ファイルをロードできます :
from sentence_transformers.datasets import ParallelSentencesDataset
train_data = ParallelSentencesDataset(student_model=student_model, teacher_model=teacher_model)
train_data.load_data('path/to/tab/separated/train-en-de.tsv')
train_data.load_data('path/to/tab/separated/train-en-es.tsv.gz')
train_data.load_data('path/to/tab/separated/train-en-fr.tsv.gz')
train_dataloader = DataLoader(train_data, shuffle=True, batch_size=train_batch_size)
train_loss = losses.MSELoss(model=student_model)
load_data() メソッドでファイルをロードします。load_data を複数回呼び出すと複数のファイルをロードできます。通常のファイルや .gz 圧縮ファイルもロードできます。
デフォルトでは、すべてのデータセットは均等に重み付けされます。上の例では、(source, translation)-ペアは 3 つすべてのデータセットから均等にサンプリングされます。weight パラメータ (整数) を渡せば、あるデータセットを高く or 低く重み付けることができます。
訓練データのソース
膨大な数の並列 (翻訳) データセットのための素晴らしい website は OPUS です。そこでは、400 言語以上の並列データセットがあります。
examples/training/multilingual フォルダは並列訓練データをダウンロードしてそれを正しい形式に持ち込む幾つかのスクリプトを含みます :
- get_parallel_data_opus.py : このスクリプトは OPUS website からデータをダウンロードします。
- get_parallel_data_tatoeba.py : このスクリプトは Tatoeba website からデータをダウンロードします、多くの言語のための例文を含む言語学習者のための website です。
- get_parallel_data_ted2020.py : このスクリプトは TED2020 コーパス (リンク切れ) のデータをダウンロードします、これは 100+ 言語の 4,000 以上の TED と TEDx 講演のトランスクリプトと翻訳を含みます。
評価
訓練は様々な方法で評価できます。これらの評価方法の使用方法の例については、make_multilingual.py をご覧ください。
MSE 評価
生徒埋め込みと教師埋め込みの間の平均二乗誤差 (MSE) を測定できます。これは以下で実現できます :
# src_sentences and trg_sentences are lists of translated sentences, such that trg_sentences[i] is the translation of src_sentences[i]
dev_mse = evaluation.MSEEvaluator(src_sentences, trg_sentences, teacher_model=teacher_model)
評価器は例えば、英語について src_sentences に対する教師埋め込みを計算します。訓練中、生徒モデルは例えば、スペイン語について trg_sentences に対する埋め込みを計算するために使用されます。教師と生徒埋め込みの間の距離が尺度です。より低いスコアはより良いパフォーマンスを示します。
翻訳精度
翻訳精度を測ることもできます。ソースセンテンス、例えば、1000 の英語文のリストが与えられたと仮定します。そして対応するターゲット (翻訳) センテンス、例えば 1000 のスペイン語文のリストです。
各センテンスペアに対して、コサイン類似度を使用してそれらの埋め込みが最も近いかを確認します。例えば、各 src_sentences[i] に対して、すべてのターゲットセンテンスから trg_sentences[i] が最も高い類似度を持つかを確認します。この場合には、ヒットしています、そうでないならエラーです。この評価器は精度をレポートします (higher = better)。
# src_sentences and trg_sentences are lists of translated sentences, such that trg_sentences[i] is the translation of src_sentences[i]
dev_trans_acc = evaluation.TranslationEvaluator(src_sentences, trg_sentences, name=os.path.basename(dev_file),batch_size=inference_batch_size)
他言語意味的テキスト類以度
異なる言語のセンテンスペア間の意味的テキスト類以度 (STS) を測ることもできます :
sts_evaluator = evaluation.EmbeddingSimilarityEvaluatorFromList(sentences1, sentences2, scores)
Where sentences1 and sentences2 are lists of sentences and score is numeric value indicating the sematic similarity between sentences1[i] and sentences2[i].
Citation
(訳注: 原文参照)
以上