【第二回】日本語pre-trained modelで試すBERT

Pocket

はじめに

前回は、Googleが発表したpre-trainedの汎用言語表現モデルであるBERTについて、自然言語処理分野の背景も交えてご紹介しました。

第二回となるこの記事では、BERTを実際のタスクに使用し、その性能を確認してみたいと思います!

1.タスク設定

BERTを用いて精度を確かめるタスクとして、小説の著者当てを行いたいと思います。分類させる小説家として夏目漱石と森鴎外を選び、著作として夏目漱石は「こころ」、森鴎外は「雁」を青空文庫からダウンロードしました。ファイルサイズは「こころ」が366KB、「雁」が164KBでした。データのバランスが少し気になりますが、今回はこのままいきます。

2.前処理

このままでは検証に利用できないので、前処理を行います。まずは必要なライブラリをインポートします。

次に前処理部分を関数化します。

それぞれの小説データに前処理を適用し、分類のためのラベルを付けます。

やはりデータ数もアンバランスになってしまいました。最後にデータを結合し、train、dev、testデータに分割、tsvファイルとして出力します。

これでデータの準備ができました。

3.fine-tuning部分の実装

次にBERTに分類タスクを解かせるための実装を行います。BERTのコードやpre-trained modelはgoogle-reserch/bertリポジトリで公開されています。モデルはmultilingual.md“BERT-Base, Multilingual Cased (New, recommended)” をダウンロードしてください。今回はタイトルにもある通り日本語pre-trained model を使用するため、fine-tuning部分のみの実装です。run_classifier.pyが分類タスクを解かせるためのコードであるため、これを一部改変します。

まずはタスク処理のためのクラスを追加します。run_classifier.py内には、もともとXnliProcessor、MnliProcessor、MrpcProcessor、ColaProcessorが用意されているので、その後ろに追加しましょう。

main関数のprocessorsの中に、作成したProcessorのキーを任意のタスク名として追加します。実行時にタスク名を指定しますが、入力にかかわらずすべて小文字に変換されるため、タスク名はすべて小文字にする必要があります。 

上記のように改変を行いました。

4.モデルの学習

学習の実行コマンドは以下の通りです。[path]の部分は適切に置き換えてください。

実行時間はAWSのEC2のp2.xlargeインスタンス上で694秒でした。アウトプットとして以下のようなものが出てきます。

モデルの後ろの数字はデータによって変わります。今回は「model.ckpt-381」を使います。

5.推論/精度確認・比較

推論の実行コマンドは以下の通りです。[path]の部分は適切に置き換えてください。また[model]の部分は、上記の通り今回は「model.ckpt-381」を指定します。

実行時間は4.モデルの学習と同様の環境で42秒でした。アウトプットとしては以下のようなものが出てきます。

今回は評価方法として、予測結果全体と、答えがどれぐらい一致しているかを判断する指標であるaccuracyを使います。出力されたtest_results.tsvを評価するとaccuracyは0.9506でした。

ベンチマークとしてDoc2VecとSVM、XGBoostを用いて同様のタスクを行った結果のaccuracyは以下の通りでした。

Doc2Vec + SVM: 0.9278

Doc2Vec + XGBoost: 0.9065

比較すると、BERTの精度が上回りました!

まとめ

差自体は大きいものではありませんでしたが、90%以上でさらにスコアを伸ばすためにはより高い情報の表現力が必要だと考えられます。今回の結果は、BERTが高い表現力を備えていることのあらわれといえるでしょう。加えて簡単な分類タスクであれば、わずかなコーディングのみでできる手軽さも実感できました。BERTが自然言語処理における新たなスタンダードとなるかもしれない。と言われる理由の一端を確認することができたのではないでしょうか。今回行ったタスク以外にも、BERTが高い性能を示したものはたくさんあります。今後もBERTを使って様々な問題に挑戦していきたいと思います!

お問い合わせ先

執筆者プロフィール

Matsushita Ryosuke
Matsushita Ryosuketdi AI・コグニティブ推進部
配属以降、自然言語処理を中心として機械学習について取り組んできました。自然言語処理のポテンシャルに、大きな期待を抱いています。
現在の目標は、kaggleでメダルを取ること。
Pocket

関連記事