日本語文書分類・固有表現抽出タスクに対する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手法の詳細に関しては下記の記事をご覧ください。
文書分類
実験に用いたコードはこちらです。
データセット
今回、文書分類タスクに用いたデータセットは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によって一つの文から何個データを生成するかといったパラメータを決める必要があります。 今回の実験では論文の著者が推奨するパラメータをそのまま採用しています。
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$に対してパラメータ探索を行い、最も良いモデルを採用しました。
各トークンと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
に実装し、性能の検証をしていきたいです。