BERTを用いた日本語文書分類タスクの学習・ハイパーパラメータチューニングの実践例

Yuki Yoshida
KARAKURI Techblog
Published in
15 min readOct 6, 2019

--

  • BERT を用いて livedoorニュースコーパス分類タスクを学習
  • ハイパーパラメータチューニングによって,テスト正答率を 87.6% から 96.7% まで改善
  • おまけ:カテゴリ「エスマックス」の判別は極めて容易

カラクリ株式会社の Research & development チーム(長いので以下 AIチーム)の吉田です.おはこんばんにちは.

本記事では,BERT (Bidirectional Encoder Representations from Transformers) を用いて日本語文書分類タスクを学習し,さらに精度向上のためにハイパーパラメータチューニングを実施した場合の実践例について記しました.

BERTは,文章(正確にはトークン列)が入力されるとその特徴ベクトルを出力する,巨大なニューラルネットワークです.2018年10月にGoogleから発表された論文で提案された手法であり,自然言語を入力とする様々な機械学習ベンチマークタスクの SOTA(state-of-the-art,世界最高性能)を塗り替えたことで有名になりました.詳細な技術的説明に関しては,原論文や解説ブログ等をご参照ください.

本記事では,BERT を用いて livedoorニュースコーパス分類タスクを学習する状況を扱います.本記事は,ケースレポートとしての側面を重視し,なるべく「再現可能な形で示す」「具体的な値を記す」ように努めました.

予備実験

データセット

livedoorニュースコーパスは,株式会社ロンウィットが公開している日本語ニュース記事のデータセットで,9つのカテゴリ(トピックニュース,Sports Watch,ITライフハック,家電チャンネル,MOVIE ENTER,独女通信,エスマックス,livedoor HOMME,Peachy)に属する記事,合計7367本からなります(各カテゴリの記事数は511〜900本).下図は,その一部を表示したものです.

livedoor ニュースコーパスデータセット.記事タイトル (title),記事本文 (text),記事カテゴリ (label_name) の組 7367 データからなる.

今回は,「記事本文(タイトルは含まない.上表の text 列)からその記事のカテゴリ(上表の label_name 列)を予測する」という 9 値分類タスクを扱います.

上記の 7367 件のデータを,訓練用・検証用・テスト用に分割します.この比は 6:2:2 としました.検証用データは,早期終了 (early-stopping) に使用します.それほど不均衡データではないため,stratified splitting(ラベルごとに正確に上記の比率で分割する)は行っていません.

ネットワーク構造・事前学習済モデル

ニューラルネットワークの構造は,原論文の BERT-BASE モデルに倣いました.すなわち,12個の注意ヘッドをもつTransformer層が12層からなるモデルを用いました.また,事前学習済モデルは,菊田様の日本語版Wikipedia全文学習済モデルを使用させていただきました.(トークナイザーも前記モデルに付随する学習済 sentencepiece モデルを使用させていただきました.)この事前学習済の BERT-BASE の最後に,ランダム初期化された全結合層(最終層の[CLS]トークンに対応する特徴ベクトルを受け取り,logits を出力する)を1層追加し,分類用のモデルとしました.

ハイパーパラメータ

基本の設定は,以下の通りとしました:

  • 入力の最大系列長(入力文をトークナイズした結果トークン数がこの値を超える場合,以下の「系列のトリミング方法」に従って一部トリミングされます):128
  • ミニバッチサイズ:16
  • 学習係数(ウォームアップ終了時点での Adam の alpha の値):5e-5
  • ウォームアップ時間の割合(以下の「エポック数」にこの値を掛けた時間をウォームアップ時間(学習初期に学習係数を0から徐々に増やしていく時間帯)とします):0.1
  • 系列のトリミング方法:末尾からトリミング(i.e. 先頭から数えて規定トークン数を超えたら,それ以降の末尾までが切り捨てられます)
  • エポック数:30(ただし以下の「早期終了基準」により途中終了となる場合があります)
  • 早期終了基準: 検証誤差の最小値が 3 エポック連続更新されない
  • ドロップアウト率 (注意重みに対するドロップアウト,FFNの直後のドロップアウトの両者とも):0.1.

ハードウェア

全ての学習には,GPU (Tesla K80) を 1 枚使用しました.

学習結果

まずは上記の設定の下で,BERT の訓練を行いました.その際の学習曲線を以下に示します.

3 エポック終了時点から 3 エポック連続で検証誤差の最小値を更新できなかったため,早期終了されています.検証誤差が最小となった 3 エポック終了時点でのモデルを用いてテストを行ったところ,テスト正答率は 87.6% となりました.

しかし,ハイパーパラメータ次第では,より高い正答率を実現できる可能性があります.

ハイパーパラメータチューニング(1)

まずは,以下のハイパーパラメータの範囲についてチューニングを行いました:

  • 最大系列長:64, 128, 256 のいずれか.
  • ミニバッチサイズ:8, 16, 24 のいずれか.
  • 学習係数:2e-5, 5e-5, 2e-4 のいずれか.
  • ウォームアップ時間の割合:0.0, 0.1 のいずれか.
  • 早期終了基準:「最小検証誤差」「最大検証正答率」のいずれか.

これらの組み合わせ,計 108 通りの設定をグリッドサーチしました.それらの結果を「検証正答率が大きな順」に並べたものを,下表に示します.

108通りのハイパーパラメータ設定の下での学習結果を,検証正答率の降順に並べたもの(上位・下位部分のみ抜粋).msl: 最大系列長,tbs: ミニバッチサイズ,lr: 学習係数,wp: ウォームアップ時間割合,scs: 早期終了基準,test_accuracy: テスト正答率,early_stopped_epoch: 学習エポック数(早期終了のため実験ごとに異なる),elapsed_time: 学習に要した時間(秒).

最も影響が大きかったのは,最大系列長(上表の msl)と早期終了基準(上表の scs)でした

明らかに,最大系列長が 64 よりも 128,128 よりも 256 の方が,検証正答率が改善しました.これは,今回のデータセットの記事には 256 トークン以上の記事も多く含まれることから,妥当な結果と考えられます.

また,早期終了基準として「最小検証誤差」よりも「最大検証正答率」を用いる方が,検証正答率が改善することがわかりました(「悪化しない」ことは定義より明らかですが.なお,テスト正答率も改善しました).ただし,早期終了までのエポック数も増加しました.(多くの学習の試行において,検証誤差が増加に転じてからも最大検証正答率が増加し続けている期間が生じていました.クロスエントロピー誤差の性質を考えると,このような期間が生じる要因としては「自信のない正答」や「自信のある誤答」が相対的に増加していることが考えられます.この辺りの話はもう少し深掘りしてみたいです.)

次に影響が大きかったのは,ミニバッチサイズでした.8 よりも 16,16 よりも 24 の方が,高い検証正答率を得られる傾向がありました.これについては,BERT のハイパーパラメータを吟味した RoBERTa 論文でも,より大きなミニバッチサイズで学習することが有効であると指摘されています(ただし論文で指摘されているのは事前学習の場合であり,fine-tuning の場合ではありません).

学習係数 (上表の lr)に関しては,2e-4 は明らかに弱く,2e-5と5e-5 では明らかな優劣は見られませんでした.ウォームアップ時間の割合(上表のwp)に関しては,今回調べた範囲では 0.0 と 0.1 に明らかな優劣は見られませんでした.

ハイパーパラメータチューニング(2)

上述の実験によって,少なくとも今回のタスクでは,最大系列長が大きいことによって入力列の広い範囲が「見える」ことが重要であることが示唆されました.しかしながら,今回のタスクに含まれる入力列は,256トークンよりもさらに長いものが多く,それらはトリミングされてしまっています.そこで次に,入力列のどこが「見える」ことが重要かを調べてみました.以下のハイパーパラメータ範囲についてチューニングを行いました:

  • 系列のトリミング方法:「末尾から」「先頭から」「入力列全体のうち先頭から25%の位置から」「入力列全体のうち先頭から50%の位置から」「入力列全体のうち先頭から75%の位置から」「(1トークンごとに)ランダムに」のいずれか
  • ドロップアウト率:0.0, 0.1, 0.2 のいずれか(こちらはついでです).

なお,他のハイパーパラメータは,前記実験結果を踏まえて以下のようにしました:最大系列長:256 ,ミニバッチサイズ:24 ,学習係数:5e-5,ウォームアップ時間の割合:0.1,早期終了基準:最大検証正答率.

計 18 通りの設定に対して実験を行い,結果を検証正答率の大きな順に並べたものを次表に示します.

18通りのハイパーパラメータ設定の下での学習結果を,検証正答率の降順に並べたもの.trunc: 系列のトリミング方法(random: ランダムに,tail: 末尾から,head: 先頭から,[数値]: 先頭から[数値] の割合の位置から),dropout_prob: ドロップアウト率.他は前表のキャプションを参照.

結果を見ると,系列のトリミング方法にパフォーマンスが大きく依存していることがわかります.真ん中から取り除く(つまり「中略」する)ことが,パフォーマンスの向上に大きく寄与することがわかりました.(なお,今回の設定ではドロップアウト率はあまりパフォーマンスに影響しませんでした.)

上表の 1 行目の設定での学習時の学習曲線.

上記実験において検証正答率が最大となったハイパーパラメータ設定下でのテスト正答率は,96.7%となりました.

おまけ:「エスマックス」の分類は非常に簡単

上述のように,系列のトリミング方法を tail から tail 以外に変更することで精度が大幅に改善しました.このことから,記事の末尾付近に「分類する上で非常に重要な情報」が存在する可能性が疑われます.特定カテゴリのニュース記事に固有の表現や定型文が存在するかもしれません.これを調べてみました.

まずは,記事の末尾を実際に眺めてみることにします.以下の表に,いくつかの記事の末尾を示しました.

各記事の末尾を抽出したもの(text_tail 列).\n は改行文字.

予感は的中しており,例えばカテゴリ「エスマックス」の記事の末尾に (S-MAX)という文字列が見え隠れしています.もう少し詳細に調べると,「エスマックス」の記事のほとんどの末尾付近に,文字列 (S-MAX)\n・エスマックス\nは改行文字)が含まれていることがわかります.

そこで,次のような「エスマックスの記事か否か判定器」を考えます:

"(S-MAX)\n・エスマックス" が含まれるならば「エスマックスの記事である」と判定し,含まれないならば「エスマックスの記事ではない」と判定する.

調べてみると,この判定方法により,エスマックスの記事 870 件のうち 9 件を除いて「エスマックスの記事である」と正しく判定でき,また,エスマックスではない記事 6497 件のうち 1 件を除いて「エスマックスの記事ではない」と正しく判定できることがわかりました.混同行列を書くと以下のようになります.

"(S-MAX)\n・エスマックス" の有無でエスマックスの記事か否かを判定した場合の混同行列.

こうして,エスマックスの記事か否かの判定は非常に簡単であることがわかりました.

しかし,このようなキーワードは他にはないのでしょうか?すなわち「それが含まれているか否か」で特定クラスに属するか否かがほぼ判定できてしまうようなキーワードは (S-MAX)\n・エスマックス の他には存在しないのでしょうか?

これを調べるため,任意の5文字以下の文字列 string と任意のクラスラベル label に対して「文書が label に属するか否かを『その文書が string を含むか否か』で判定しようとした時の F1-score」を求めました.そして,各クラスラベル label ごとに,最も高い F1-score を与える文字列 string を調べました.結果は,以下のようになりました.

探索対象を 5文字以下の全ての文字列としているため,上の結果の中には「5文字より長いフレーズ」の一部分だけが表示されているケースもあります.例えば,エスマックスの行に表示されている文字列たちは (S-MAX)\n・エスマックスという文字列の一部が見えているものです.livedoor HOMME の行の文字列たちは,文字列 livedoorの一部です.トピックニュースの行の文字列たちは,文字列 \n【関連情報】の一部です.

上記結果において「エスマックス」の次に F1-score が高かったのは「家電チャンネル」の __\n\n■でした(※ _ は実際は半角スペース).すなわち「この文字列を含むか否か」が「その記事が家電チャンネルの記事か否か」を比較的高い精度で予測できるということです.混同行列は以下のようになりました.

"__\n\n■" (_ は半角スペース)の有無で家電チャンネルの記事か否かを判定した場合の混同行列.

先ほど記した(S-MAX)\n・エスマックスの混同行列と比較すると,偽陰性率(197件/864件)も偽陽性率(16件/6503件)も大きいことがわかります.

こうして, (S-MAX)\n・エスマックスほど極端に「文字列の存在だけからクラスを判定可能」なものは他に存在しないことがわかりました.

まとめ

BERT を用いて livedoorニュースコーパス分類タスクを学習しました.また,ハイパーパラメータチューニングによって,テスト正答率を 87.6% から 96.7% まで改善することができました.

今回は fine-tuning のみに焦点を当て,事前学習の手法やBERTのネットワーク構造そのものについては検討を行いませんでしたが,近年 RoBERTaALBERT など,BERTの事前学習法やネットワーク構造を変更したモデルが次々と提案され,オリジナルのBERTを上回るパフォーマンスを達成しています.今後は,事前学習に伴う様々なメタパラメータについても,できる範囲で調査を行っていきたいと思います.

ちなみにカラクリは,カスタマーサポート向けのチャットボットサービスを開発しています.私の属しているAIチームでは,チャットボットの学習や推論のエンジン部分の開発はもちろん,機械学習の基礎研究的なタスクも幅広くやっています.その成果はなるべく本ブログにも載せていきたいと思っております.時々で構いませんので, KARAKURI Techblog をチェックしていただければ嬉しいです!

参考文献

--

--