投稿日
SeqAL: 系列ラベリング用のActive Learningツール
もくじ
はじめに
こんにちは。戦略技術センターの梁です。
私が所属している自然言語処理チームでは、機械学習用データのアノテーションに関する研究開発をしています。その中でも私は、ラベル付け対象のデータ量を減らす技術であるActive Learningに取り組んでいます。
Active Learningのツールは多数あります。しかし、系列ラベリングに使えるActive Learningのツールは少ないのが現状です。そこで、本記事では弊社が開発したSeqALを紹介します。
本記事の内容は、以下のとおりです。
- Active Learningとは
- Active Learningツールとその課題
- 系列ラベリング用Active Learningツール: SeqAL
- SeqALの使い方
Active Learningとは
機械学習、とくに教師あり学習を使う場合、アノテーション済のデータを用意する必要があります。たとえば、系列ラベリングの一種である固有表現認識では、図1のようにアノテーションされたデータが必要になります。ここでは、与えられたテキストに組織名や時間、場所などの情報をアノテーションしています。
アノテーションは見た目より大変な作業です。一見単純な作業に見えますが、数千〜数百万のテキストに対するアノテーションは、時間と労力がかかります。
アノテーションは大変な作業なので、教師データを作成する際、すべてのデータをアノテーションするのではなく、「モデルの学習に効果的なデータ」を優先してアノテーションすることにします。これにより、モデルの精度を維持しつつ、アノテーションの総量を減らせます。
これを実現しようとするのはActive Learningです。Active Learningとは、ラベルなしのデータから、学習効果の高いデータを選ぶ技術です。データの学習効果は情報量で判断します。たとえば、図2の文Bは、文Aの情報に加えて、「場所」の情報も含まれています。つまり、情報量の多い文Bを用いた方が、モデルを効果的に学習できると考えられます。
まとめると、Active Learingはアノテーションの負担を軽減するため、モデルの精度を保ちながら、データ量を削減する技術です。Active Learningについて詳しく知りたい方は、系列ラベリングにおけるActive Learningをご覧ください。
Active Learningツールとその課題
系列ラベリングにおけるActive Learningでも挙げたように、自然言語処理用のActive Learningツールはいくつか存在します。しかし、そのほとんどは分類向けであり、系列ラベリングに使える実用的なActive Learningツールはありませんでした。そこで、SeqALを開発しました。
系列ラベリング用Active Learningツール: SeqAL
SeqALの概要
SeqALは自然言語処理のモデルを簡単に構築するためのフレームワークである「flair」に基づいた系列ラベリング用のActive Learningツールです。手軽に利用できることを目指して開発を進めています。
SeqALの効果
SeqALのデータ数の削減効果について、実験結果を紹介します。
データ数の削減
Active Learningを用いた学習データの選択割合と、モデルの性能の関係を次のグラフに示します。グラフの横軸はデータの割合、縦軸はF1スコアを示しています。サンプリングアルゴリズムとしては、Random、Least Confidence(LC)、Maximum Normalized Log-Probability(MNLP)の3種類を用いています。Superviseはすべての学習データを学習したF1スコア(91.38)を表しています。
SeqALを使うことで、アノテーションするデータ数を減らせることがわかります。MNLPの線を例にすると、30%のデータを使った時のF1スコアは88.57です。つまり、100%のデータを使ったSuperviseのF1スコア(91.38)の97%の性能を、30%のデータ数で達成できていることを意味します。
また、サンプリングアルゴリズムが性能に影響を与えていることもわかります。図を見ると、Randomと比べて、LCとMNLPはデータ数が少ないうちから高いF1スコアに達しています。たとえば、データ数が10%の場合、RandomのF1は76.2、LCは82.67、MNLPは85.67です。このような結果になったのは、Randomではデータの情報量を考慮せずにサンプリングしているからだと考えられます。
SeqALの使い方
インストール方法
pip install seqal
利用方法
コードとActive Learningのサイクルを照らし合わせると、わかりやすくなります。ここはActive Learningのサイクルを簡単に紹介します。詳しく知りたい方は、系列ラベリングにおけるActive Learningをご覧ください。
(出典:Ren, Pengzhen, et al. “A survey of deep active learning.” 2020)
- Step 0: 少量の高品質な学習データ(Seed data)を作成
- Step 1: Seed dataからモデルを学習
- Step 2: 学習したモデルを使って、ラベルの付いていないデータにラベル付け
- Step 3: ラベル付け結果を使い、質の高いサンプルを選択(Query samples)
- Step 4: 選んだサンプルをアノテーター(Oracle)に振り分け、アノテーション
- Step 5: 新規のラベル付きサンプル(New labeled samples)を学習データに入れる
- Step 6: 改めて分類器を学習
- モデルの精度が閾値より大きい、もしくはアノテーションの予算がなくなるまで、Step2からStep6までのサイクルを繰り返す
from seqal.active_learner import ActiveLearner
from seqal.query_strategies import mnlp_sampling
from seqal.utils import add_tags
from xxxx import annotate_by_human # ユーザー自身が用意するメソッド
# Active Learnerの初期化
learner = ActiveLearner(
tagger_params=tagger_params, # モデルのパラメータ(hidden size, embeddingなど)
query_strategy=mnlp_sampling, # データ選択のアルゴリズム
corpus=corpus, # 学習・検証・テストデータ
trainer_params=trainer_params # トレーナーのパラメータ(epoch, batch sizeなど)
)
# Step 1: モデルの初期学習
learner.fit()
# Step 2&3: ラベルなしデータから、学習効果の高いデータを選択
_, query_samples = learner.query(data_pool)
query_samples = [{"text": sent.to_plain_string()} for sent in query_samples] # Sentenceクラスをプレーンテキストに変換
# query_samplesの中身
# [
# {
# "text": "I love Berlin"
# }
# ]
# Step 4: 選択したデータを人間がアノテーション
new_labels = annotate_by_human(query_samples)
# new_labelsの中身
# [
# {
# "text": "I love Berlin .",
# "labels": [ # アノテーションしたラベル
# {
# "start_pos": 7,
# "text": "Berlin",
# "label": "S-LOC"
# }
# ]
# }
# ]
# Step 4: ラベル付きデータを作成
new_labeled_samples = add_tags(new_labels)
# Step 5&6: 作成したラベル付きデータを学習データに加え、モデルを再学習
learner.teach(new_labeled_samples)
パラメータの設定、各ステップの設定などの詳細はSeqALのGitHubページを参照してください。
おわりに
本記事では、Active Learningを紹介し、系列ラベリング用のActive Learningツール「SeqAL」の性能と使い方を紹介しました。SeqALの課題として、モデルの再学習に約5分かかります。その間アノテータが作業できないため、再学習時間の短縮をすすめたいと考えています。
参考資料
本コンテンツはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。