日本語ALBERTモデルを公開したというお話と起こったことの記録

こんにちは。軽量版BERTことALBERTの日本語モデルを学習したので公開しました。

TL;DR;

(追記; 2020/05/05)
v2を公開しました

やったこと

https://github.com/yoheikikuta/bert-japanese をフォークしましてモデルをALBERTに差し替えて学習しました。(bert-japaneseを公開してくださったKikutaさまとalbertのコードを公開してくださったGoogleさま、本当にありがとうございます。) Wikipedia日本語版データを使っています。

ここをご覧の皆様はすでにご存知だと思いますが、ALBERTは以下の論文に記載されています。

きっかけ

「BERT、高性能だけどモデルのサイズでかいよね」ということを感じていました。加えて(私事ですが)、最近会社を起こしまして「ようやく好きなことができる!」という開放感も手伝って作業しました。こちらの作業は会社の活動として実施したものです(PR)。

性能

readmeにも書きましたがLivedoorコーパスでBERTと遜色ない性能がでました。モデルのファイルサイズはckpt形式で138MBなことを考えると十分に思えます。

                      precision    recall  f1-score   support

dokujo-tsushin       0.99      0.91      0.95       178
 it-life-hack       0.93      0.95      0.94       172
kaden-channel       0.96      0.98      0.97       176
livedoor-homme       0.83      0.86      0.85        95
  movie-enter       0.98      0.99      0.99       158
       peachy       0.91      0.93      0.92       174
         smax       0.98      0.96      0.97       167
 sports-watch       0.99      0.96      0.98       190
   topic-news       0.94      0.97      0.95       163

     accuracy                           0.95      1473
    macro avg       0.94      0.95      0.94      1473
 weighted avg       0.95      0.95      0.95      1473

参考までにKikutaさまのBERTモデルは以下の性能だそうです。

BERT with SentencePiece

               precision    recall  f1-score   support

dokujo-tsushin       0.98      0.94      0.96       178
 it-life-hack       0.96      0.97      0.96       172
kaden-channel       0.99      0.98      0.99       176
livedoor-homme       0.98      0.88      0.93        95
  movie-enter       0.96      0.99      0.98       158
       peachy       0.94      0.98      0.96       174
         smax       0.98      0.99      0.99       167
 sports-watch       0.98      1.00      0.99       190
   topic-news       0.99      0.98      0.98       163

    micro avg       0.97      0.97      0.97      1473
    macro avg       0.97      0.97      0.97      1473
 weighted avg       0.97      0.97      0.97      1473

ただし、1/5データの場合はちょっと性能が下がっていましたのでデータ量によってなにかあるかもしれません。

なお、学習の速度は12時間で30万反復ほどでした。

公開した理由

誰でも思いつくことですし、私が公開しなくてもきっと他の誰かがやって公開すると思われたためです。独占して持っている意味はあまりなさそうです。

苦労したこと

・sentencepieceがメモリ不足で学習できない
今回sentencepieceの学習は手元のPCで行いました。メモリ32GBあるのですが、wikipedia全文を食わせるとメモリオーバーで落ちました。15M文をランダムサンプリングすることでなんとか学習しました。

・学習データの生成が落ちる&重い
元スクリプトの不具合だと思うのですが、日本語データを食わせるとたまに文字コードの処理に失敗するみたいでstr型を想定しているところにbyte型データがやってきて落ちることがありました。また、処理が妙に重く、時間がかかります。
この問題を対処するために適当にパッチを当てました。もう一度精査して問題なさそうなら本家様にPR出したいと思います。
なお、出来上がったtfrecordのファイルは全部で45GBほどになりました。

解決していない問題

・AHがないんだけど…
はじめのステップでwikiextractorを使ってテキストを取り出すんですが、連番と思われた出力フォルダに何故かAHだけ出力されていません。これはそんなものなのでしょうか…

画像1

・pretrainingスクリプトが最後の最後で落ちるんだけど…
学習が終わって最後の最後、evaluationのステップで落ちます。未調査ですが、学習は終わっているみたいなのでいいことにしました。

INFO:tensorflow:***** Running evaluation *****
I1217 10:42:20.689312 140668324767616 run_pretraining.py:540] ***** Running evaluation *****
INFO:tensorflow:  Batch size = 64
I1217 10:42:20.689432 140668324767616 run_pretraining.py:541]   Batch size = 64
Traceback (most recent call last):
 File "albert-japanese/ALBERT/run_pretraining.py", line 581, in <module>
   tf.app.run()
 File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/platform/app.py", line 40, in run
   _run(main=main, argv=argv, flags_parser=_parse_flags_tolerate_undef)
 File "/usr/local/lib/python3.6/dist-packages/absl/app.py", line 299, in run
   _run_main(main, args)
 File "/usr/local/lib/python3.6/dist-packages/absl/app.py", line 250, in _run_main
   sys.exit(main(argv))
 File "albert-japanese/ALBERT/run_pretraining.py", line 545, in main
   tf.gfile.MakeDirs(FLAGS.export_dir)
 File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/lib/io/file_io.py", line 438, in recursive_create_dir
   recursive_create_dir_v2(dirname)
 File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/lib/io/file_io.py", line 453, in recursive_create_dir_v2
   pywrap_tensorflow.RecursivelyCreateDir(compat.as_bytes(path))
 File "/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/util/compat.py", line 71, in as_bytes
   (bytes_or_text,))
TypeError: Expected binary or unicode string, got None

さいごに

Livedoorコーパスの評価で性能を見ましたが、性能の数値が95%とかになってくるとモデルがコーパスをオーバーキルしている印象です。厳密な性能比較にはもう少し難しいタスクで比較したほうがいいのかもしれませんね。

この記事が気に入ったらサポートをしてみませんか?