コンテンツへスキップ

自分のアノテーションでモデルを学習する

研究のラベルから管理者用Trainingページでモデルを学習し、ホールドアウトした項目でスコアを測り、予測をアノテーターに事前ラベルとして見せます。

v2.14.0の新機能

モデル学習は、アノテーターがすでに付けたラベルでモデルを学習し、学習から外したホールドアウトの項目でモデルのスコアを測ります。モデルの答えは、確認または修正してもらう事前ラベルとしてアノテーターに見せることもできます。このページでは、学習ループ、管理者用のTrainingページ、タスク別のトレーナー、そして各部分の詳細を扱うページとチュートリアルを説明します。対象は、セルフホストのPotatoサーバーを運用する研究の担当者と管理者です。Trainingページとsklearn-textトレーナーは、Potato 2.11から利用できます。バージョン2.14.0では、37のトレーナー、GPUサーバーとSLURMクラスターでのリモート学習、Runsテーブルのホールドアウトスコア、Hugging Face Hubへの公開が加わります。

学習ループ

ループは1周ごとに、これまでに集まった人手ラベルでモデルを学習し、モデルの答えを次のアノテーターに出発点として渡します。ループは6つのステップで進みます。

  1. アノテーションする。 アノテーターはいつもどおり項目にラベルを付けます。Potatoは、1つの項目に付いた複数のアノテーターのラベルを1つのラベルに統合します。既定はDawid-Skeneで、多数決も選べます。
  2. 学習する。 実行は、ラベル付きの項目をtrain、val、testの各分割に分け、別プロセスでモデルを学習します。分割は項目IDのシード付きハッシュで決まるため、どの項目も実行のたびに同じ分割に入ります。
  3. スコアを測る。 実行は、ホールドアウトしたvalとtestの項目でモデルのスコアを測ります。
  4. 書き戻す。 実行の予測は、選んだスキームの事前ラベルとして各項目のデータに入ります。信頼度のしきい値に届かない予測と、train分割の項目への予測は除かれます。
  5. 修正する。 次のアノテーターには、モデルの答えがすでに入力された状態で項目が表示されます。アノテーターは答えを確認するか、変更します。レビュー担当者は、モデルが正しかったかどうかを記録することもできます。
  6. 再学習する。 次の実行は新しいラベルで学習し、レビュー担当者が修正した項目はすべてtrain分割に入ります。

学習を有効にする

モデル学習は既定でオフで、1つの設定キーで有効になります。既存の設定に次のブロックを追加します。

yaml
model_training:
  enabled: true

サーバーを再起動し、管理者セッションまたは管理者APIキーで/admin/trainingを開きます。enabled: trueがないと、学習用のルートは存在しません。学習を有効にしても、アノテーターに見えるものは何も変わりません。事前ラベルはwriteback.schemasに挙げたスキームにだけ表示され、このリストは既定で空だからです。

Trainingページ上部のStart a runパネルには、実行に必要な設定がすべてあります。Schemaには研究のアノテーションスキームが並びます。Trainerには、選んだスキームの種類と項目に合うトレーナーが並びます。Runs onには、実行できる場所が並びます。Parameters欄はJSONを受け取り、選んだトレーナーのmodel_training.trainer_paramsの項目から始まります。欄の下の注記には、そのトレーナーが受け取るすべてのパラメーターが書かれています。Train nowで実行を開始します。別の実行が進行中に開始した実行はキューで待ち、実行テーブルにwaiting #NとCancel runボタンつきで表示されます。

sklearn-text、sentimentスキーム、localバックエンドを選んだPotatoのTrainingページ。上部の下には、ホールドアウトスコア0.847と0.840の完了した2つの実行がRunsテーブルに並んでいるsentimentスキームで実行した2つのsklearn-textの結果。各スコアは、モデルが学習していないレビューで測ったものです

実行テーブルの各実行IDを開くと、/admin/training/runs/<run_id>の実行ページが表示されます。実行ページには、実行の状態、トレーナー、バックエンド、分割のサイズ、ホールドアウトスコア、パラメーターが表示され、続いて実行が記録したすべての指標と実行のログが並びます。失敗した実行にはWhat went wrongセクションが加わります。実行ページからは、実行のval、test、train項目をデータセットのバージョンとして保存したり、モデルをHugging Face Hubに公開したりすることもできます。サンプルプロジェクトでGPUなしの最初の実行を一通り試すには、最初のモデルを学習するに従ってください。

タスク別のトレーナー

Potato 2.14.0には38のトレーナーがあり、Trainerメニューには登録名で表示されます。次の表は、トレーナーが学習元とするアノテーションの種類ごとにトレーナーをまとめたものです。

タスクトレーナー詳細
テキストのラベルsklearn-text, hf-text-classification, setfit最初のモデルを学習する
スパン、関係、会話ツリー、グロスhf-token-classification, hf-relation, hf-conversation-tree, byt5-glossトレーナー
LLMと報酬モデルllm-sft, llm-dpo, reward-model, prm-rewardLLMのファインチューニング
画像、スライド、顕微鏡画像、地図、ページレイアウトhf-image-classification, torchvision-detect, ultralytics-detect, torchvision-segment, ultralytics-segment, cellpose, sam-finetune, layoutlmv3, vlm-sft視覚モデル
音声hf-audio-tagger, whisper-asr, diarization音声モデル
ボリューム、点群、動画volume-unet, external-3d, video-trackボリューム、点群、動画
分子、スペクトル、信号、ロボットのエピソードrdkit-property, peak-cnn, signal-cnn, episode-model科学分野のモデル
判断モデル(Laya、Jev、OpenJev)decision-calibrate, laya-finetune, openjev-finetuneトレーナー
すでに別の場所で動かしているモデルlabel-studio-ml, hf-inference, openai-vlm-boxes, roboflow, cvat-nuclio手持ちのモデルを使う

最後の行の5つのトレーナーは、何も学習しません。5つはそれぞれ、ホールドアウトした項目を別の場所で動いているモデルに送ります。Potatoは、その答えを学習済みモデルの答えと同じように、スコアリング、書き戻し、レビューの対象にします。sklearn-textは通常のPotatoのインストール以外に何も必要とせず、pip install "potato-annotation[train]"で、テキスト、画像、音声、LLMのトレーナーに必要なものがインストールされます。インストールされていないトレーナーは、Trainingページに「not installed」と表示され、インストール用のコマンドが添えられます。トレーナーには、各トレーナーのアノテーションタイプ、項目タイプ、インストールコマンド、パラメーターがまとめてあります。

実行の場所

実行はバックエンドで動きます。バックエンドは、Runs onメニューで実行ごとに選ぶか、model_training.backendで既定として指定します。Potatoのバックエンドは4種類です。

  • **local**は、Potatoサーバー上のサブプロセスで学習します。device: autoは、CUDA、AppleのMetal、CPUの順に選びます。
  • **ssh**は、鍵認証のsshで接続できるGPUサーバーで学習します。PotatoはPotatoのソースコードをサーバーにコピーし、そこで実行を開始し、実行が成功するとモデルをコピーして戻します。
  • **slurm**は、同じ方法でクラスターのログインノードに接続し、sbatchで計算ノードに学習ジョブを投入します。このバックエンドが呼ぶのはsbatch、squeue、scancel、scontrolだけです。そのため、srunやsacctのないクラスターでも動きます。
  • **agent**は、NATの内側にあるワークステーションなど、Potatoから到達できないマシンのためのものです。そのマシンでpotato training agentがサーバーにジョブを問い合わせ、モデルのファイルはそのマシンに残ります。

potato training check <backend> config.yamlは、最初の実行の前にバックエンドを検査します。TrainingページのCheckボタンも同じことをします。設定にはバックエンドのキーがすべて載っています。GPUサーバーまたはクラスターで学習するでは、3種類のリモートバックエンドを順を追って設定します。

ホールドアウトスコア

どの実行も、スキームのアノテーションタイプに合った指標で、valとtestの項目でモデルのスコアを測ります。単一ラベルの分類器にはmacro-F1、スパンのタガーにはスパンF1、ボックス検出器にはIoU 0.5でのmAP、書き起こしモデルには1から単語誤り率を引いた値が使われます。実行テーブルには実行ごとに代表のスコアが1つ表示され、実行ページには、val_macro_f1やtest_f1のように指標名に分割名を含めて、すべての指標が並びます。ラベルがあって予測がない項目は、不正解として数えられます。そのため、トレーナーは難しい項目を飛ばしてスコアを上げることはできません。トレーナーがval項目で最良のチェックポイントを選ぶ場合、valのスコアがすでにモデルに影響しているため、代表のスコアはtest項目から取られます。sklearn-textのように、valで何も選ばないトレーナーは、代表のスコアをval項目から取ります。設定には、すべてのアノテーションタイプの指標が載っています。

事前ラベルとモデルレビューキュー

事前ラベルは、モデルの答えをアノテーションページに入力済みにして、アノテーターが確認または変更できるようにしたものです。書き戻しは、実行の予測をwriteback.schemasに挙げたスキームの事前ラベルに変えます。pre_annotationブロックは必要ありません。model_trainingの下にwritebackブロックを追加します。

yaml
model_training:
  enabled: true
  writeback:
    schemas: [sentiment]
    min_confidence: 0.6
    include_unlabeled: true

このブロックでは、信頼度が0.6未満のsentimentの予測は保存されますが、表示されません。include_unlabeled: trueにすると、各実行は、まだ誰もラベルを付けていない項目も予測します。この設定がなければ、実行が予測するのは、ホールドアウトしたvalとtestの項目だけです。実行のtrain分割の項目に事前ラベルが付くことはなく、書き戻しが人手のラベルを変えることもありません。事前ラベルがアノテーターの答えになるのは、アノテーターが事前ラベルを編集するか、次の項目に進んだときだけです。

アノテーションページに表示されたレビュー。アノテーターが答える前から、モデルによってPositiveがすでに選択されている新しいアノテーターには、モデルの答えが選択された状態で表示され、アノテーターはそれを確認するか変更します

assignment_strategy: model_reviewは、事前ラベルの付いた項目を、信頼度の低い順にレビュー担当者に渡します。レビュー担当者は、各項目にaccept、correct、rejectのいずれかの判定を記録します。却下された事前ラベルは項目から外れ、二度と表示されません。以降の実行はどれも、correctの判定が付いた項目で学習し、その項目でモデルのスコアを測ることはありません。事前ラベルは、アノテーターをモデルの答えに引き寄せます。ホールドアウトスコアでモデルの水準が裏づけられてからinclude_unlabeledをオンにし、事前ラベル付きデータで確認とゴム印押しを見分ける方法を使って、事前ラベルを読まずに受け入れるアノテーターを見つけてください。ループの中のモデルでは、1つのプロジェクトで書き戻し、レビュー、再学習を順に見ていきます。

アノテーションが届くたびに再学習する

auto_retrainは、アノテーションが届くたびに自動で実行を開始し、新しい実行は前の実行の事前ラベルを置き換えます。model_trainingの下にブロックを追加します。

yaml
model_training:
  enabled: true
  auto_retrain:
    enabled: true
    trainer: sklearn-text
    schemas: [sentiment]
    update_frequency: 25
    min_interval_s: 600

この値では、前回の自動実行以降に25件のアノテーションが届き、前回の実行が終わってから600秒が経過すると、実行が始まります。設定には、auto_retrainのすべてのキーと、チェックが実行を見送る理由が載っています。ループの中のモデルでは、再学習をいつオンにするかを示しています。

モデルをHugging Face Hubに公開する

モデルがPotatoサーバー上にある成功した実行には、実行ページにPublish to the Hugging Face Hubフォームがあります。プッシュでは、モデルの重み、設定、トークナイザーのファイルと、実行から作られたREADME.mdのモデルカードがアップロードされます。モデルカードには、トレーナー、ベースモデル、スキーム、ラベル、分割のサイズ、ホールドアウトスコアが記載されます。実行の予測と、学習データのコピーはサーバーに残ります。

リポジトリ名は2回入力し、2つの名前が一致したときにだけプッシュが進みます。Privateは既定でオンで、Hugging Faceのトークンは、ページからではなくサーバー上の環境変数(既定はHF_TOKEN)から取られます。リモートホストやエージェントのマシンに残ったモデルは、実行ページからはプッシュできません。設定には、アップロードされるファイルとAPIのルートが載っており、アノテーションでLLMをファインチューニングするでは、プッシュを最初から最後まで実行します。

モデル学習とラベリングエンジン

ラベリングエンジンは、同じトレーナーを使います。蒸留をオンにする(features.distill)と、エンジンは、エンジンの人手ラベルと、契約によって認証された機械ラベルを使ってトレーナー(既定はsklearn-text)でモデルを学習し、そのモデルを設定済みのカスケードの前にtrainedソースとして置きます。エンジンのcert分割とaudit分割の項目が、蒸留の学習セットに入ることはありません。trainedソースは、実行のモデルディレクトリをartifact_dirにして、学習実行のモデルを読み込むこともできます。ラベリングエンジンの設定には、蒸留のキーが載っています。

モデル学習と能動学習

Potatoの能動学習は、研究のラベルでモデルを学習しますが、その目的はモデル学習より限られています。能動学習は、update_frequency件のアノテーションごとにサーバープロセス内でscikit-learnの分類器を学習し、その分類器を使って、最も不確実な項目から順にキューを並べ替えます。アノテーターが並べ替えられたキューを受け取るのは、assignment_strategy: active_learningのときだけです。能動学習の分類器は、学習に使った項目でスコアを測り、その予測がアノテーターに見せられることはありません。

モデル学習は、38のトレーナーのどれでも別プロセスまたは別のマシンで実行し、ホールドアウトした項目でモデルのスコアを測り、モデルの答えを事前ラベルとして見せます。モデル学習でもキューを並べ替えることができます。assignment_strategy: llm_confidenceでは、公開済みの事前ラベルの信頼度が最も低い項目が先に来ます。hf-text-classificationとhf-image-classificationのacquisitionパラメーターは、その順序をマージン、エントロピー、BALD、コアセットのスコアに置き換えます。次にどの項目にラベルを付けるかを決めるには、能動学習を使います。ホールドアウトの項目でスコアを測ったモデル、アノテーター向けの事前ラベル、公開するモデルが必要なときには、モデル学習を使います。

チュートリアル

各チュートリアルは、インストールからスコア付きの実行まで、1つの構成を通して進めます。

関連ドキュメント

実装の詳細については、ソースドキュメントを参照してください。