[翻訳]Googleの多言語版BERT自然言語処理AI（github上のREADMEの翻訳）

この記事は、2018年末現在、自然言語処理AIにおける最先端のディープラーニングモデルであるBERTについて、提供元であるgoogle-researchのgithubレポジトリのうち、日本語の処理にも使える[多言語版のREADME](https://github.com/google-research/bert/blob/master/multilingual.md)を翻訳したものです。

※**BERTを理解するには、まず（多言語版に限らない）README本体部分を読むべきです。その翻訳は、[別の記事](https://qiita.com/uedake722/items/927bf491a025f1a88b17)にありますので、先に読んでください。**

BERTは、種類の異なる様々な自然言語処理タスクで最高成績を叩きだした優れモノで、
しかも転移学習のベースにすれば少ない学習のみで個々の問題を従来より正確に解ける可能性がある「革命的」な技術と聞き、使ってみるついでに翻訳しています。

[^1]: ここでいうzero-shot学習とは、「何の言語かわかっていない文に対しても推論ができる」ように言語ラベルを用いずに学習したとの意味。

---

# Models：モデル
２つの多言語モデルが現在利用可能です。これ以上の単言語モデルを提供する予定はありませんが、これらの`BERT-Large`版は将来提供するかもしれません:

- [BERT-Base, Multilingual Cased (New, recommended)](https://storage.googleapis.com/bert_models/2018_11_23/multi_cased_L-12_H-768_A-12.zip): 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
- [BERT-Base, Multilingual Uncased (Orig, not recommended)](https://storage.googleapis.com/bert_models/2018_11_03/multilingual_L-12_H-768_A-12.zip): 102 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
- [BERT-Base, Chinese](https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip): Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters

`Multilingual Cased (New)`モデルは多くの言語における正規化の問題を解決しています。よって、ラテン文字でないアルファベットを使用する言語では、このモデルの使用を推奨します(そして、ラテン文字のアルファベットを使用する多くの言語でもこちらのほうが良いです)。このモデルを使うときは、`run_pretraining.py`やその他のスクリプトに`--do_lower_case=false`を渡すことを忘れないでください。

多言語モデルがサポートする[言語の一覧](https://qiita.com/uedake722/items/b7f4b75b4d77d9bd358b#list-of-languages%E8%A8%80%E8%AA%9E%E4%B8%80%E8%A6%A7)を参照ください。多言語モデルは中国語(そして英語も)含みますが、中国語のみで転移学習をする場合はおそらく中国語モデルのほうが良い結果を生むでしょう。

# Results：結果
これらのシステムを評価する為に、[XNLI dataset](https://github.com/facebookresearch/XNLI)データセットを使用します。このデータセットは[MultiNLI](https://www.nyu.edu/projects/bowman/multinli/)版であり、開発時評価用のデータセットとテスト用のデータセットは15の言語に(人によって)翻訳されています。訓練用のデータセットは機械翻訳されていることに留意ください (Google NMTでなくXNLIによって提供されている翻訳を利用しています)。明確化の為に、6言語の結果のみを下記に示します：

|System|English|Chinese|Spanish|German|Arabic|Urdu|
|:--|--:|--:|--:|--:|--:|--:|
|XNLI Baseline - Translate Train|73.7|67.0|68.8|66.5|65.8|56.6|
|XNLI Baseline - Translate Test|73.7|68.3|70.7|68.7|66.8|59.3|
|BERT - Translate Train Cased|81.9|76.6|77.8|75.9|70.7|61.6|
|BERT - Translate Train Uncased|81.4|74.2|77.3|75.2|70.5|61.7|
|BERT - Translate Test Uncased|81.4|70.1|74.9|74.4|70.4|62.1|
|BERT - Zero Shot Uncased|81.4|63.8|74.3|70.5|62.1|58.3|

最初の２行がXNLIの論文によるベースラインです。最後の３行が我々のBERTの結果です。

**Translate Train**は、MultiNLI訓練用データセットが英語から他言語への機械翻訳されたものであることを意味します。よって、訓練と評価の両方が外国語（英語以外）でされています。残念なことに、訓練が機械翻訳データでされた為に、(英語に比べて)低い正解率（accuracy）のどの程度が 機械翻訳の質が原因なのか、それとも事前学習モデルの質が原因なのか、定量化できませんでした。

**Translate Test** は、XNLIテスト用データセットが外国語から英語に機械翻訳されたものであることを意味します。よって、訓練と評価の両方が英語でされています。しかし、テスト評価は機械翻訳された英語で行っているので、正解率（accuracy）は機械翻訳システムの質に依存します。

**Zero Shot**は多言語BERTシステムが英語のMultiNLIで転移学習され、外国語のXNLIテスト用データセットで評価されたことを意味します。この場合、事前学習にも転移学習にも機械翻訳は一切関わっていません。

訓練は英語のみのBERTでなく多言語のBERTを用いているので、英語の結果はMultiNLIベースライン84.2より悪いことに留意ください。リソースの多い言語にとっては、多言語モデルはいくらか単言語モデルより悪い結果になることを暗示しています。しかし、我々が多くの単言語モデルを訓練しメンテナンスすることは不可能です。よって、あなたの目標が英語と中国語以外の言語における性能を最大化することであるなら、我々の多言語モデルから始めて、興味のある言語のデータセットを用いて追加の転移学習をすることは有益でしょう。

下記は、多言語の`BERT-Base`モデルと中国語のみの`BERT-Base`モデルを訓練した結果です:

|System|Chinese|
|:--|--:|
|XNLI Baseline|67.0|
|BERT Multilingual Model|74.2|
|BERT Chinese-only Model|77.2|

英語と同様に、単言語モデルは多言語モデルより3%よい結果となります。

# Fine-tuning Example：転移学習の例
多言語モデルは、いかなる特別な考慮もAPIの変更も必要としません。中国語の文字のトークン化をサポートする為に`tokenization.py`の`BasicTokenizer`の実装を更新しているので、フォークしている場合は更新ください。しかし、tokenization APIは変更していません。

新しいモデルをテストの為に、`run_classifier.py`に[XNLIデータセット](https://github.com/facebookresearch/XNLI)のサポートを追加しました。これは、MultiNLIの15言語版であり、開発時評価用／テスト用のデータセットが人間によって翻訳されています。訓練用のデータセットは機械翻訳されています。

転移学習の為のコードを実行するには、[XNLI dev/test set](https://s3.amazonaws.com/xnli/XNLI-1.0.zip)と[XNLI machine-translated training set](https://s3.amazonaws.com/xnli/XNLI-MT-1.0.zip)をダウンロードし、両方の.zip ファイルを$XNLI_DIRに展開ください。

XNLI上で転移学習をするには、言語は`run_classifier.py`中にハードコード (デフォルトは中国語)されているので、他の言語で実行するには`XnliProcessor`を変更してください。

大きなデータセットなので、GPUで数時間かかります (もしくはCloud TPUで30分かかります)。デバッグの為に実験を速く実行するには、`num_train_epochs`を0.1など小さな値に設定してください。

```
export BERT_BASE_DIR=/path/to/bert/chinese_L-12_H-768_A-12 # or multilingual_L-12_H-768_A-12
export XNLI_DIR=/path/to/xnli

python run_classifier.py \
  --task_name=XNLI \
  --do_train=true \
  --do_eval=true \
  --data_dir=$XNLI_DIR \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=32 \
  --learning_rate=5e-5 \
  --num_train_epochs=2.0 \
  --output_dir=/tmp/xnli_output/
```

中国語のものモデルでは、結果は下記のようになります：

```
 ***** Eval results *****
eval_accuracy = 0.774116
eval_loss = 0.83554
global_step = 24543
loss = 0.74603
```

# Details:詳細
## Data Source and Sampling：データソースとサンプリング
Wikipediaのサイズがトップ100の言語を選んでいます。各言語の完全なWikipediaのdump(userとtalkのページは除く)が、訓練データとして使われています。

しかし、各言語のWikipediaのデータサイズは大きく異なり、よってリソースの少ない言語ではニューラルネットワークモデルでいうところの過小評価（under-represented）な状態となります(ある程度限られたモデル容量の為に言語が"競争的"であるとの仮定を下回る).

しかし、Wikipediaのサイズは言語話者の数と相関があり、特別な言語の為の小さなWikipediaを数千エポックも学習することで、モデルを過学習させたくないと考えています。

これら２つの要因のバランスをとる為に、訓練前のデータ生成中(及びWordPiece語彙の生成)において、データに指数関数的に平滑化した重みづけを行います。言い換えると、ある言語の確率を`P(L)`としましょう。例えば`P(English) = 0.21`は全てのWikipediasを連結した後に21%のデータが英語であることを意味します。各確率をあるファクター`S`で指数化し、（再）標準化し、その分布からサンプリングします。我々の場合、`S=0.7`を使用しました。よって、英語のようなリソースの多い言語は本来より少なくサンプルされ、アイスランド語のようなリソースの少ない言語は本来より多くサンプルされます。例えばオリジナルの分布において、アイルランド語より英語は1000倍以上サンプルされますが、平滑化の後は100倍以上になります。

## Tokenization：トークン化
トークン化の為に、110kの共有WordPiece語彙を使用します。単語のカウントはデータと同じ方法で重みづけされます。よって、リソースが少ない言語はいくらか重みづけが軽くなります。言語を識別するいかなるマーカーも意図的に使用していません(よって、zero-shot学習[^1]が可能です)。

中国語(そして日本語の漢字、韓国語のハングル)は空白文字を持ちません。WordPieceを適用する前に、CJK Unicodeレンジ中の全ての文字の周りにスペースをいれます。これは、中国語は効果的に文字レベルでトークン化されていることを意味します。CJK Unicodeブロックは、 中国起源の文字のみを含み韓国のハングルや日本のカタカナひらがなを含まないことに注意ください。ハングル・カタカナ・ひらがなは他の多くの言語と同じようにwhitespace+WordPieceでトークン化されます。

他の言語の為に、英語と同じレシピを適用します： (a) 小文字化とアクセントアークの除去、(b) 区切り文字の分割、(c) 空白文字のトークン化。いくつかの言語でアクセントマーカーは実質的な意味をもっていることを理解していますが、効果的な語彙のサイズを削減する利益のほうをが大きいと感じています。一般的に言って、BERTの強い文脈モデルはアクセントマーカーを除去することによるいかなる曖昧さも埋め合わせます。

## List of Languages：言語一覧
多言語モデルは下記の言語をサポートします。Wikipediaのサイズがトップ100の言語であることから選びました:

- Afrikaans
- Albanian
- Arabic
- Aragonese
- Armenian
- Asturian
- Azerbaijani
- Bashkir
- Basque
- Bavarian
- Belarusian
- Bengali
- Bishnupriya Manipuri
- Bosnian
- Breton
- Bulgarian
- Burmese
- Catalan
- Cebuano
- Chechen
- Chinese (Simplified)
- Chinese (Traditional)
- Chuvash
- Croatian
- Czech
- Danish
- Dutch
- English
- Estonian
- Finnish
- French
- Galician
- Georgian
- German
- Greek
- Gujarati
- Haitian
- Hebrew
- Hindi
- Hungarian
- Icelandic
- Ido
- Indonesian
- Irish
- Italian
- Japanese
- Javanese
- Kannada
- Kazakh
- Kirghiz
- Korean
- Latin
- Latvian
- Lithuanian
- Lombard
- Low Saxon
- Luxembourgish
- Macedonian
- Malagasy
- Malay
- Malayalam
- Marathi
- Minangkabau
- Nepali
- Newar
- Norwegian (Bokmal)
- Norwegian (Nynorsk)
- Occitan
- Persian (Farsi)
- Piedmontese
- Polish
- Portuguese
- Punjabi
- Romanian
- Russian
- Scots
- Serbian
- Serbo-Croatian
- Sicilian
- Slovak
- Slovenian
- South Azerbaijani
- Spanish
- Sundanese
- Swahili
- Swedish
- Tagalog
- Tajik
- Tamil
- Tatar
- Telugu
- Turkish
- Ukrainian
- Urdu
- Uzbek
- Vietnamese
- Volapük
- Waray-Waray
- Welsh
- West Frisian
- Western Punjabi
- Yoruba

**Multilingual Cased (New)**リリースでは、オリジナルのリリースでは含んでいなかった追加の言語としてタイ語とモンゴル語を含みます。