#author("2020-11-21T22:02:39+09:00","default:kurohashi_kawahara_lab","kurohashi_kawahara_lab")
#author("2022-01-21T10:20:23+09:00","default:kurohashi_kawahara_lab","kurohashi_kawahara_lab")
* BERT日本語Pretrainedモデル [#p7ab9b26]

近年提案されたBERTが様々なタスクで精度向上を達成しています。BERTの[[公式サイト:https://github.com/google-research/bert]]では英語pretrainedモデルや多言語pretrainedモデルが公開されており、そのモデルを使って対象タスク(例: 評判分析)でfinetuningすることによってそのタスクを高精度に解くことができます。

多言語pretrainedモデルには日本語も含まれていますので日本語のタスクに多言語pretrainedモデルを利用することも可能ですが、基本単位がほぼ文字となっていることは適切ではないと考えます。そこで、入力テキストを形態素解析し、形態素をsubwordに分割したものを基本単位とし、日本語テキストのみ(Wikipediaを利用)でpretrainingしました。

&color(red){2022年1月21日追記};: このモデルは古くなっています。[[RoBERTa-base 日本語モデル>https://huggingface.co/nlp-waseda/roberta-base-japanese]]の利用を検討してみてください。

** ダウンロード [#k1aa6ee3]
BERTのモデルはBASEとLARGEの2種類があります。また、通常版とWhole Word Masking (WWM)版の2種類があります。BASEよりLARGEの方が、また通常版よりWWM版の方がfinetuningしたタスクの精度が高い傾向にあります。WWMの詳細はBERTの[[公式サイト:https://github.com/google-research/bert]]をご覧ください。
- BASE 通常版: [[Japanese_L-12_H-768_A-12_E-30_BPE.zip:http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-12_H-768_A-12_E-30_BPE.zip&name=Japanese_L-12_H-768_A-12_E-30_BPE.zip]] (1.6G; 19/4/1公開)
- BASE WWM版: [[Japanese_L-12_H-768_A-12_E-30_BPE_WWM.zip:http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-12_H-768_A-12_E-30_BPE_WWM.zip&name=Japanese_L-12_H-768_A-12_E-30_BPE_WWM.zip]] (1.6G; 19/11/15公開)
- LARGE WWM版: [[Japanese_L-24_H-1024_A-16_E-30_BPE_WWM.zip:http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-24_H-1024_A-16_E-30_BPE_WWM.zip&name=Japanese_L-24_H-1024_A-16_E-30_BPE_WWM.zip]] (4.6G; 20/2/29公開)

公式で配布されているpretrainedモデルと同様のファイル形式になっており、
- TensorFlow checkpoint (bert_model.ckpt.meta, bert_model.ckpt.index, bert_model.ckpt.data-00000-of-00001)
- 語彙リストファイル (vocab.txt)
- configファイル (bert_config.json)

が含まれています。また、pytorch版BERT ([[pytorch-pretrained-BERT:https://github.com/huggingface/pytorch-pretrained-BERT]])用に変換したモデル (pytorch_model.bin)も同梱しています。

(更新: 19/11/15) pytorch-pretrained-BERTは[[transformers:https://github.com/huggingface/transformers]]という名前にかわっています。こちらを使う場合は以下のモデルをお使いください。transformersで使う場合、モデルの絶対パスのどこかに「bert」の文字列を含んでいる必要があります。例えば、zipを解凍し、 /somewhere/bert/Japanese_L-12_H-768_A-12_E-30_BPE_transformers/ のように配置してください。
- BASE 通常版: [[Japanese_L-12_H-768_A-12_E-30_BPE_transformers.zip:http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-12_H-768_A-12_E-30_BPE_transformers.zip&name=Japanese_L-12_H-768_A-12_E-30_BPE_transformers.zip]] (393M; 19/11/15公開)
- BASE WWM版: [[Japanese_L-12_H-768_A-12_E-30_BPE_WWM_transformers.zip:http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-12_H-768_A-12_E-30_BPE_WWM_transformers.zip&name=Japanese_L-12_H-768_A-12_E-30_BPE_WWM_transformers.zip]] (393M; 19/11/15公開)
- LARGE WWM版: [[Japanese_L-24_H-1024_A-16_E-30_BPE_WWM_transformers.zip:http://nlp.ist.i.kyoto-u.ac.jp/DLcounter/lime.cgi?down=http://lotus.kuee.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-24_H-1024_A-16_E-30_BPE_WWM_transformers.zip&name=Japanese_L-24_H-1024_A-16_E-30_BPE_WWM_transformers.zip]] (1.2G; 20/2/29公開)

** 詳細 [#r6199008]
以下に日本語pretrainedモデルの詳細を示します。
- 入力テキスト: 日本語Wikipedia全て (約1,800万文, 半角を全角に正規化)
- 入力テキストに[[Juman++:https://github.com/ku-nlp/jumanpp]] (v2.0.0-rc2)で形態素解析を行い、さらに[[BPE:https://github.com/rsennrich/subword-nmt]]を適用しsubwordに分割
- BERT_{BASE} (12-layer, 768-hidden, 12-heads) もしくは BERT_{LARGE} (24-layer, 1024-hidden, 16-heads)
- 30 epoch (BASEの場合、1GPU (GeForce GTX 1080 Tiを利用)で1 epochに約1日かかるのでpretrainingに約30日)
-- 最新のGPUを使う、もしくは、Multi-GPUを使えるプログラムを利用することで速くなるはずです
- 語彙数: 32,000 (形態素、subwordを含む)
- max_seq_length: 128

BERTの[[公式スクリプト:https://github.com/google-research/bert]] (run_classifier.pyなど)を用いてfinetuningする方法は公式で配布されているpretrainedモデルと同様で、以下のようにオプションを指定してください。

 export BERT_BASE_DIR=/path/to/Japanese_L-12_H-768_A-12_E-30_BPE
 
 python run_classifier.py \
 ...
 --vocab_file=$BERT_BASE_DIR/vocab.txt \
 --bert_config_file=$BERT_BASE_DIR/bert_config.json \
 --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
 --do_lower_case=False

入力テキストは半角を全角に正規化し、Juman++ (v2.0.0-rc2)で形態素単位に分割してください。(BPEは適用する必要はありません。finetuning時に語彙リストを参照しながら自動的にsubwordに分割されます。)

注意: --do_lower_case=False オプションをつけてください。これをつけないと、濁点が落ちてしまいます。また、tokenization.pyの以下の行をコメントアウトしてください。これを行わないと漢字が全て一文字単位になってしまいます。
 # text = self._tokenize_chinese_chars(text)

pytorch-pretrained-BERTでfinetuningする場合 (examples/run_classifier.py)、

 python run_classifier.py \
 ..
 --bert_model $BERT_BASE_DIR

のようにしてモデルを指定し、--do_lower_case オプションをつけないでください(つけるとTrueになります)。また、公式スクリプトと同様、pytorch_pretrained_bert/tokenization.pyに対して、上記のコメントアウトをしてください。

(更新: 19/11/15) 
transformersでfinetuningする場合 (examples/run_glue.py)、

 python run_glue.py \
   --model_type bert \
   --model_name_or_path $BERT_BASE_DIR \
  ..

のようにしてモデルを指定してください。transformersではモデルファイルと同じディレクトリに tokenizer_config.json をおいておくと、tokenizerの設定をすることができます。同梱したzipの中に入れていますので解凍すれば自動的に配置されます。上記で説明した  _tokenize_chinese_chars の行のコメントアウトを行う必要がありません。

なお、形態素解析を行わず、文に対してSentencepieceを用いてpretrainingしたものが https://github.com/yoheikikuta/bert-japanese (日本語Wikipediaで学習)やhttps://www.hottolink.co.jp/blog/20190311-2 (日本語twitterデータで学習)で公開されています。

** 各タスクにおける精度 [#fb233636]

*** 構文解析 (基本句係り受け精度のF1) [#z526697f]
|モデル|ニュース|ウェブ|h
|BASE|93.57|92.23|
|BASE WWM|93.62|92.42|
|LARGE WWM|94.11|92.80|
※「ニュース」は京都大学テキストコーパス、「ウェブ」は京都大学ウェブ文書リードコーパスでの精度を表しています。精度は3回finetuningした平均値です。

** 参考文献 [#c8ee1db1]
柴田 知秀, 河原 大輔, 黒橋 禎夫: BERTによる日本語構文解析の精度向上, 言語処理学会 第25回年次大会,  pp.205-208,  名古屋,  (2019.3). ([[pdf:http://www.anlp.jp/proceedings/annual_meeting/2019/pdf_dir/F2-4.pdf]], [[slide:https://speakerdeck.com/tomohideshibata/nlp2019-bert-parsing-shibata]])

** 公開モデルを試していただいたサイト [#n18d5d52]
- [[BERT導入手順おさらい個人メモ:https://qiita.com/takahashi_yukou/items/b81319b8ef6cee13cb1b]]
- [[PYTORCHでBERTの日本語学習済みモデルを利用する - 文章埋め込み編:https://yag-ays.github.io/project/pytorch_bert_japanese/]]
- [[BERTによる文書分類:https://orizuru.io/blog/machine-learning/bert/]]
- [[BERTの日本語事前学習済みモデルでテキスト埋め込みをやってみる:https://dev.classmethod.jp/machine-learning/bert-text-embedding/]]
- [[自然言語処理で注目のBERT ~取り敢えず動かしてみる編~:https://qiita.com/neonsk/items/27424d6122e00fe632b0]]
- [[pytorch-transformersを触ってみる②:http://kento1109.hatenablog.com/entry/2019/08/21/155810]]
- [[すぐに試せる日本語BERTのDocker Imageを作ってみた:https://yukoishizaki.hatenablog.com/entry/2019/11/27/151018]]
- [[BERTについて解説!日本語モデルを使って予測をしてみようー!:https://toukei-lab.com/bert]]
** ライセンス [#h539a5ce]
- [[Apache License, Version 2.0:http://www.apache.org/licenses/LICENSE-2.0]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS