HuggingFace Transformers 4.17 : Tutorials : 多言語モデル (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/20/2022 (v4.17.0)
* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Transformers : Tutorials : 多言語モデル
Transformers には幾つかの多言語 (= multilingual) モデルがあり、そしてそれらの推論使用方法は単一言語 (= monolingual) モデルとは異なります。総ての多言語モデルが異なるわけではありませんが。bert-base-multilingual-uncased のような幾つかのモデルはちょうど単一言語モデルのように利用できます。このガイドは、その推論のための使用方法が異なる多言語モデルの使用方法を示します。
XLM
XML は 10 個の異なるチェックポイントを持ち、その一つだけが単一言語です。残りの 9 個のモデルのチェックポイントは 2 つのカテゴリーに分けられます : 言語埋め込みを利用するチェックポイントと、そうでないものです。
言語埋め込みを持つ XLM
以下の XLM モデルは推論時に使用される言語を指定するために言語埋め込みを使用しています :
- xlm-mlm-ende-1024 (Masked 言語モデリング, 英独)
- xlm-mlm-enfr-1024 (Masked 言語モデリング, 英仏)
- xlm-mlm-enro-1024 (Masked 言語モデリング、英語-ルーマニア語)
- xlm-mlm-xnli15-1024 (Masked 言語モデリング、XNLI 言語)
- xlm-mlm-tlm-xnli15-1024 (Masked 言語モデリング + 翻訳、XNLI 言語)
- xlm-clm-enfr-1024 (因果言語モデリング、英仏)
- xlm-clm-ende-1024 (因果言語モデリング、英独)
言語埋め込みは、モデルに渡される input_ids と同じ shape のテンソルとして表現されます。これらの tensor の値は使用される言語に依存していて、トークナイザーの lang2id と id2lang 属性により識別されます。
この例では、xlm-clm-enfr-1024 チェックポイントをロードしています (因果言語モデリング、英仏) :
import torch
from transformers import XLMTokenizer, XLMWithLMHeadModel
tokenizer = XLMTokenizer.from_pretrained("xlm-clm-enfr-1024")
model = XLMWithLMHeadModel.from_pretrained("xlm-clm-enfr-1024")
トークナイザーの lang2id 属性はモデルの言語とそれらの id を示します :
print(tokenizer.lang2id)
{'en': 0, 'fr': 1}
次に、サンプル入力を作成します :
input_ids = torch.tensor([tokenizer.encode("Wikipedia was used to")]) # batch size of 1
input_ids
tensor([[ 0, 4018, 5545, 51104, 32, 308, 18, 1]])
language id を “en” として設定して言語埋め込みを定義するためにそれを使用します。言語埋め込みは 0 で満たされたテンソルです、何故ならそれは英語のための言語 id であるからです。このテンソルは input_ids と同じサイズである必要があります。
language_id = tokenizer.lang2id["en"] # 0
langs = torch.tensor([language_id] * input_ids.shape[1]) # torch.tensor([0, 0, 0, ..., 0])
# We reshape it to be of size (batch_size, sequence_length)
langs = langs.view(1, -1) # is now of shape [1, sequence_length] (we have a batch size of 1)
langs
tensor([[0, 0, 0, 0, 0, 0, 0, 0]])
そして input_ids と言語埋め込みをモデルに渡すことができます :
outputs = model(input_ids, langs=langs)
print(outputs)
MaskedLMOutput(loss=None, logits=tensor([[[ -6.3665, 10.7176, -6.3753, ..., -6.1219, -6.3775, -6.0470], [-13.8973, -3.1509, -13.8749, ..., -14.6975, -12.9415, -13.8252], [ -9.2461, 4.8444, -9.6047, ..., -10.5616, -8.2646, -9.9838], ..., [-12.1487, 9.7573, -12.0884, ..., -13.0167, -11.7700, -10.6408], [-11.5067, 4.1504, -11.6619, ..., -12.0130, -11.2718, -10.8311], [ -8.4061, 6.6820, -8.5521, ..., -8.2401, -8.5305, -8.3125]]], grad_fn=<AddBackward0>), hidden_states=None, attentions=None)
run_generation.py は、xlm-clm チェックポイントを使用して、言語埋め込みによりテキストを生成できます。
言語埋め込みなしの XLM
以下の XLM モデルは推論の間に言語埋め込みを必要としません :
- xlm-mlm-17-1280 (Masked 言語モデリング、17 言語)
- xlm-mlm-100-1280 (Masked 言語モデリング、100 言語)
これらのモデルは、前の XLM チェックポイントとは違って、一般的なセンテンス表現のために使用されます。
BERT
以下の BERT モデルは多言語タスクのために利用できます :
- bert-base-multilingual-uncased (Masked 言語モデリング + 次文予測, 102 言語)
- bert-base-multilingual-cased (Masked 言語モデリング + 次文予測, 104 言語)
これらはコンテキストから言語を識別してそれに従って推論するはずです。
XLM-RoBERTa
以下の XML-RoBERTa モデルは多言語タスクのために使用できます :
- xlm-roberta-base (Masked 言語モデリング、100 言語)
- xlm-roberta-large (Masked 言語モデリング、100 言語)
XLM-RoBERTa は 2.5TB の新たに作成されたクリーンな 100 言語の CommonCrawl データ上で訓練されました。それは、分類, シークエンス・ラベリングと質問応答のような下流タスク上で mBERT や XLM のような以前にリリースされた多言語モデルを越える強力な利点を提供します。
M2M100
以下の M2M100 モデルは多言語翻訳のために使用できます :
- facebook/m2m100_418M (翻訳)
- facebook/m2m100_1.2B (翻訳)
この例では、中国語から英語に翻訳するために facebook/m2m100_418M チェックポイントをロードしています。トークナイザーでソース言語を設定できます :
from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
en_text = "Do not meddle in the affairs of wizards, for they are subtle and quick to anger."
chinese_text = "不要插手巫師的事務, 因為他們是微妙的, 很快就會發怒."
tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M", src_lang="zh")
model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
テキストをトークン化します :
encoded_zh = tokenizer(chinese_text, return_tensors="pt")
M2M100 はターゲット言語に翻訳するために最初の生成されたトークンとしてターゲット言語 id を強制します。英語に翻訳するために generate メソッドでは forced_bos_token_id を en に設定します :
generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id("en"))
tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
'Do not interfere with the matters of the witches, because they are delicate and will soon be angry.'
MBart
以下の MBart モデルは多言語翻訳のために利用できます :
- facebook/mbart-large-50-one-to-many-mmt (1 対 多 ; 多言語機械翻訳, 50 言語)
- facebook/mbart-large-50-many-to-many-mmt (多 対 多 ; 多言語機械翻訳, 50 言語)
- facebook/mbart-large-50-many-to-one-mmt (多 対 1 ; 多言語機械翻訳, 50 言語)
- facebook/mbart-large-50 (多言語翻訳, 50 言語)
- facebook/mbart-large-cc25
この例では、フィンランド語を英語に翻訳するために facebook/mbart-large-50-many-to-many-mmt checkpoint チェックポイントをロードします。トークナイザーでソース言語を設定できます :
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
en_text = "Do not meddle in the affairs of wizards, for they are subtle and quick to anger."
fi_text = "Älä sekaannu velhojen asioihin, sillä ne ovat hienovaraisia ja nopeasti vihaisia."
tokenizer = AutoTokenizer.from_pretrained("facebook/mbart-large-50-many-to-many-mmt", src_lang="fi_FI")
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/mbart-large-50-many-to-many-mmt")
テキストをトークン化します :
encoded_en = tokenizer(en_text, return_tensors="pt")
MBart はターゲット言語に翻訳するために最初の生成されたトークンとしてターゲット言語 id を強制します。英語に翻訳するために generate メソッドでは forced_bos_token_id を en に設定します :
generated_tokens = model.generate(**encoded_en, forced_bos_token_id=tokenizer.lang_code_to_id("en_XX"))
tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
"Don't interfere with the wizard's affairs, because they are subtle, will soon get angry."
facebook/mbart-large-50-many-to-one-mmt チェックポイントを使用している場合、最初の生成されたトークンとしてターゲット言語 id を強制する必要はありません、その他の点では使用方法は同じです。
以上