日本語文書分類・固有表現抽出タスクに対するData Augmentationの性能検証

概要

こんにちは@kajyuuenです。 本記事では日本語データセットに対して、Data Augmentation(データ拡張)を行い、モデルの性能が向上するか検証します。

今回は文書分類と固有表現抽出の2つのタスクに対して、実験を行いました。 その結果、文書分類タスクでは学習に用いた文章数が500文, 2000文, 5000文のどの場合においても性能が向上し、Data Augmentationなしのモデルと比べて、最大2.5ポイントAccuracyが向上しました。 固有表現抽出タスクでは50文, 150文, 500文に対してData Augmentationの効果を検証しました。 文章数によっては性能が下がった場合もありましたが、Data Augmentationによって最も性能が向上したケースではF1が2.7ポイント向上しました。

データ拡張に用いたライブラリdaajaやData Augmentation手法の詳細に関しては下記の記事をご覧ください。

kajyuuen.hatenablog.com

文書分類

実験に用いたコードはこちらです。

データセット

今回、文書分類タスクに用いたデータセットlivedoorニュースコーパスです。 これは9個のトピックのニュース記事をまとめたデータセットで、全7378記事から構成されています。

全7378記事のうちランダムに500記事, 2000記事, 5000記事を抽出してサブセットを作成し、これらをtrainセットとしました。またtrainセットに含まれていない2378記事を二分割したものをvalidセットとtestセットとしてパラメータ探索と評価に利用しました。

Data Augmentation

文書分類のData Augmentation手法にはEDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasksを用いました。

EDAではどのくらいの確率で文章中の単語を置き換えるか、EDAによって一つの文から何個データを生成するかといったパラメータを決める必要があります。 今回の実験では論文の著者が推奨するパラメータをそのまま採用しています。

EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasksより引用

daajaではラベルと文章が\tで区切られたtsvに対して、EDAによってデータを増やすコマンドを用意しているので、これを用いてかさ増したデータセットを作成します。

python -m daaja.eda.run --input input.tsv --output output.tsv --alpha_sr 0.05 --alpha_rd 0.05 --alpha_ri 0.05 --alpha_rs 0.05 --num_aug 16

モデル

モデルにはBertForSequenceClassificationを用いています。 事前学習モデルにはcl-tohoku/bert-base-japanese-whole-word-maskingを選びました。

from transformers import BertForSequenceClassification
MODEL_NAME = 'cl-tohoku/bert-base-japanese-whole-word-masking'
model = BertForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=9)

結果

testデータに対するAccuracyは以下の表のとおりです。

文章数 500 2000 5000
BERT 77.1% 84.6% 88.8%
BERT+EDA 78.4% 87.1% 91.0%
EDAによる効果 +1.3ポイント +2.5ポイント +2.2ポイント

今回の結果ではすべての文章数において、性能が改善しています。

この結果を見る限り、対象のドメインやタスクの複雑さにもよりますが、文書分類タスクでデータが少ないときはとりあえずEDAを適用してみてもいいのかもしれません。

固有表現抽出

実験に用いたコードはこちらです。

データセット

固有表現抽出タスクに用いたデータセットja.wikipedia.conllです。このデータはWikipedia日本語版から抽出した全1,000文から構成されている固有表現抽出データセットです。

1,000文のうちランダムに取り出したサブセット50, 150, 500文をtrainセットとし、trainセットに含まれていない500文をそれぞれ半分づつvalidセットとtestセットとしました。

Data Augmentation

固有表現抽出ではAn Analysis of Simple Data Augmentation for Named Entity Recognition(SDA)で提案されている手法を用いてデータの拡張を行います。

SDAでは著者が推奨するパラメータがないため、論文同様に$p = \lbrace 0.1, 0.3, 0.5, 0.7 \rbrace $と$n_{\rm aug} = \lbrace 1, 3, 6, 10 \rbrace$に対してパラメータ探索を行い、最も良いモデルを採用しました。

EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasksより引用

トークンとBIOラベルが\tで区切られたconllフォーマットに対してデータ拡張を行うdaajaのコマンドは次の通りです。

python -m daaja.ner_sda.run --input input.tsv--output output.tsv --p_lwtr 0.7 --p_mr 0.7 --p_sis 0.7 --p_sr 0.7 --num_aug 10

モデル

モデルにはBertForTokenClassificationを用いています。 事前学習モデルにはnlp-waseda/roberta-base-japaneseを選びました。

from transformers import BertForTokenClassification
MODEL_NAME = 'nlp-waseda/roberta-base-japanese'
model = BertForTokenClassification.from_pretrained(MODEL_NAME, num_labels=22)

結果

testデータに対するF1は以下の表のとおりです。

文章数 50 150 500
BERT 65.5% 77.4% 81.3%
BERT+SDA 68.2% 76.7% 82.0%
SDAによる効果 +2.7ポイント -0.7ポイント +0.7ポイント

150文のときSDAを用いたモデルの性能が下がっていますが、それ以外の文章数ではF1が向上しています。

各文章数に対して、最も良かったパラメータは以下の通りです。

文章数 $p$ $n_{\rm aug}$
50 0.5 3
150 0.7 3
500 0.7 3

まとめと今後

今回の実験を通じて、Data Augmentationは日本語においても有効なことがわかりました。 実験で使ったData Augmentation手法はどれも単語の削除や交換、シノニムの追加といった単純な操作ですが、文書分類と固有表現抽出の両タスクの殆どの状況で性能向上を達成できているのは驚きです。

今後はシンプルなData Augmentation手法だけではなくWord2VecやTransformerを用いた手法をdaajaに実装し、性能の検証をしていきたいです。

参考