AutoNLPとProdigyを使用したアクティブラーニング
Active Learning using AutoNLP and Prodigy.
機械学習の文脈におけるアクティブラーニングは、ラベル付きデータを反復的に追加し、モデルを再トレーニングしてエンドユーザーに提供するプロセスです。これは終わりのないプロセスであり、データのラベリング/作成には人間の介入が必要です。この記事では、AutoNLPとProdigyを使用してアクティブラーニングパイプラインを構築する方法について説明します。
AutoNLP
AutoNLPは、Hugging Faceが作成したフレームワークであり、ほとんどコーディングを行わずに独自のデータセット上で最先端のディープラーニングモデルを構築するのに役立ちます。AutoNLPは、Hugging Faceのtransformers、datasets、inference-apiなどのツールに基づいて構築されています。
AutoNLPを使用すると、独自のカスタムデータセットでSOTAトランスフォーマーモデルをトレーニングし、それらを微調整(自動的に)してエンドユーザーに提供することができます。AutoNLPでトレーニングされたすべてのモデルは最先端でプロダクションに対応しています。
この記事の執筆時点では、AutoNLPはバイナリ分類、回帰、マルチクラス分類、トークン分類(固有表現認識や品詞など)、質問応答、要約などのタスクをサポートしています。すべてのサポートされているタスクのリストはこちらで確認できます。AutoNLPは、英語、フランス語、ドイツ語、スペイン語、ヒンディー語、オランダ語、スウェーデン語などの言語をサポートしています。AutoNLPでは、カスタムトークナイザーを使用したカスタムモデルもサポートされています(AutoNLPでサポートされていない場合)。
Prodigy
Prodigyは、spaCyの開発元であるExplosionによって開発された注釈ツールです。これはリアルタイムでデータを注釈付けするためのWebベースのツールです。Prodigyは、固有表現認識(NER)やテキスト分類などのNLPタスクをサポートしていますが、NLPに限定されません!コンピュータビジョンのタスクや独自のタスクの作成もサポートしています!Prodigyのデモはこちらでお試しいただけます。
Prodigyは商用ツールですので、詳細についてはこちらでご確認ください。
私たちは、データのラベリングに最も人気のあるツールの1つであり、無限にカスタマイズ可能なProdigyを選びました。また、セットアップや使用も非常に簡単です。
データセット
さあ、この記事の最も興味深い部分が始まります。さまざまなデータセットや問題の種類を調査した後、私たちはKaggleのBBCニュース分類データセットに出くわしました。このデータセットは、クラス内競技で使用され、こちらでアクセスできます。
このデータセットを見てみましょう:
このデータセットは分類データセットです。ニュース記事のテキストであるText
列と、記事のクラスであるCategory
列があります。全体として、5つの異なるクラスがあります:business
、entertainment
、politics
、sport
、tech
。
AutoNLPを使用してこのデータセットでマルチクラス分類モデルをトレーニングするのは簡単です。
ステップ1:データセットをダウンロードします。
ステップ2:AutoNLPを開き、新しいプロジェクトを作成します。
ステップ3:トレーニングデータセットをアップロードし、自動分割を選択します。
ステップ4:価格を承認し、モデルをトレーニングします。
上記の例では、15種類の異なるマルチクラス分類モデルをトレーニングしています。AutoNLPの価格は1つあたり10ドル以下になることもあります。AutoNLPは最適なモデルを選択し、ハイパーパラメータの調整を自動で行います。したがって、今すぐ座って結果を待つだけです。
約15分後、すべてのモデルのトレーニングが完了し、結果が利用可能になりました。最も優れたモデルの精度は98.67%のようです!
したがって、このデータセットの記事を98.67%の精度で分類することができます!しかし、アクティブラーニングとProdigyについて話していましたが、それらはどうなったのでしょうか?🤔 すでにProdigyを使用したことを確認します。私たちは、このデータセットを固有表現認識のタスクのためにラベル付けするためにProdigyを使用しました。ラベリングの部分を始める前に、ニュース記事のエンティティを検出するだけでなく、それらを分類するプロジェクトを持つことがクールだと思いました。そのため、既存のラベルでこの分類モデルを構築しました。
アクティブラーニング
使用したデータセットにはカテゴリがありましたが、エンティティ認識のためのラベルはありませんでした。そのため、私たちは別のタスクでデータセットにラベルを付けるためにProdigyを使用することにしました:固有表現認識。
Prodigyをインストールしたら、次のコマンドを実行するだけです:
$ prodigy ner.manual bbc blank:en BBC_News_Train.csv --label PERSON,ORG,PRODUCT,LOCATION
さまざまな値を見てみましょう:
bbc
はProdigyによって作成されるデータセットです。blank:en
は使用されているspaCy
トークナイザーです。BBC_News_Train.csv
はラベリングに使用されるデータセットです。PERSON,ORG,PRODUCT,LOCATION
はラベリングに使用されるラベルのリストです。
上記のコマンドを実行したら、Prodigyのウェブインターフェース(通常はlocalhost:8080)に移動し、データセットのラベリングを開始できます。Prodigyのインターフェースは非常にシンプルで直感的で使いやすいです。インターフェースは次のようになります:
する必要があるのは、どのエンティティをラベル付けするか(PERSON、ORG、PRODUCT、LOCATION)を選択し、エンティティに属するテキストを選択するだけです。1つのドキュメントが完了したら、緑のボタンをクリックすると、Prodigyが自動的に次のラベル付けされていないドキュメントを提供します。
Prodigyを使用して、データセットにラベルを付け始めました。約20のサンプルが揃ったとき、AutoNLPを使用してモデルをトレーニングしました。ProdigyはAutoNLP形式でデータをエクスポートしないため、データをAutoNLP形式に変換するために簡単なスクリプトを書きました:
import json
import spacy
from prodigy.components.db import connect
db = connect()
prodigy_annotations = db.get_dataset("bbc")
examples = ((eg["text"], eg) for eg in prodigy_annotations)
nlp = spacy.blank("en")
dataset = []
for doc, eg in nlp.pipe(examples, as_tuples=True):
try:
doc.ents = [doc.char_span(s["start"], s["end"], s["label"]) for s in eg["spans"]]
iob_tags = [f"{t.ent_iob_}-{t.ent_type_}" if t.ent_iob_ else "O" for t in doc]
iob_tags = [t.strip("-") for t in iob_tags]
tokens = [str(t) for t in doc]
temp_data = {
"tokens": tokens,
"tags": iob_tags
}
dataset.append(temp_data)
except:
pass
with open('data.jsonl', 'w') as outfile:
for entry in dataset:
json.dump(entry, outfile)
outfile.write('\n')
これにより、AutoNLPを使用してモデルをトレーニングするために使用できるJSONL
ファイルが生成されます。手順は以前と同じですが、AutoNLPプロジェクトを作成する際にToken Classification
タスクを選択します。初期データを使用して、AutoNLPを使用してモデルをトレーニングしました。最良のモデルの精度は約86%で、適合率と再現率は0です。モデルは何も学習していないことがわかりました。明らかに、サンプル数は約20個しかありませんでした。
約70のサンプルをラベリングした後、いくつかの結果が得られるようになりました。精度は92%になり、適合率は0.52、再現率は約0.42でした。いくつかの結果が得られていましたが、まだ十分ではありませんでした。次の画像では、このモデルが未知のサンプルでどのように機能するかを示しています。
ご覧の通り、モデルは苦戦しています。しかし、以前よりはるかに良くなりました!以前は、同じテキスト内の何も予測できない状態でした。少なくとも今では、Bruce
とDavid
が名前であることがわかります。
したがって、私たちは続けました。さらにいくつかのサンプルをラベリングしました。
各反復ごとに、データセットは大きくなっています。新しいデータセットをAutoNLPにアップロードし、残りの作業を任せるだけです。
~150のサンプルをラベリングした後、良い結果が得られるようになりました。正確性は95.7%に上がり、精度は0.64、再現率は約0.76でした。
同じ未知のサンプルでこのモデルのパフォーマンスを見てみましょう。
わあ!これは素晴らしいです!ご覧の通り、モデルは非常に優れたパフォーマンスを発揮しています!同じテキスト内の多くのエンティティを検出することができます。精度と再現率はまだ少し低いですので、さらにデータをラベリングしました。~250のサンプルをラベリングした後、精度と再現率が最も良い結果を得ました。正確性は約95.9%に上がり、精度と再現率はそれぞれ0.73と0.79でした。この時点で、ラベリングをやめて実験プロセスを終了することにしました。次のグラフは、サンプルをデータセットに追加するにつれて、最良のモデルの正確性がどのように向上したかを示しています:
よく知られている事実ですが、関連性の高いデータはより良いモデルと結果につながります。この実験を通じて、私たちはニュース記事のエンティティを分類するだけでなく、それらをカテゴリー分けするモデルを成功裏に作成しました。ProdigyやAutoNLPのようなツールを使用することで、データセットのラベリングに時間と労力を費やすだけで済みました(それさえもProdigyのインターフェースのおかげで簡単になりました)。AutoNLPは多くの時間と労力を節約してくれました。どのモデルを使用するか、どのようにトレーニングするか、どのように評価するか、パラメータを調整するか、どのオプティマイザとスケジューラを使用するか、前処理、後処理などを考える必要がありませんでした。私たちがする必要があったのは、データセットにラベルを付け、AutoNLPにその他のすべてを任せることだけでした。
AutoNLPやProdigyのようなツールを使えば、データと最先端のモデルを簡単に作成できます。そして、全体のプロセスはほとんどコーディングを必要としないため、コーディングのバックグラウンドを持たない人でも一般には利用できないデータセットを作成し、AutoNLPを使用して独自のモデルをトレーニングし、コミュニティの他の人とモデルを共有する(または独自の研究/ビジネスに使用する)ことができます。
このプロセスを使用して作成された最良のモデルはオープンソース化されています。こちらでお試しください。ラベル付けされたデータセットはこちらからダウンロードできます。
モデルは訓練されたデータによってのみ最先端です。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles