Skip to content

心理測定エンジン

項目反応理論をアノテーションに持ち込みます。各ラベルは素の多数決ではなく事後確率と信頼区間を伴い、モデルの当てはめにゴールドラベルもLLMも必要ありません。

v2.7.0の新機能

Potatoは、アノテーション研究を実際にそうであるもの、つまり測定器として扱えます。心理測定レイヤーは、アノテーションが流れ込むのに合わせて項目反応理論(IRT)のモデルをライブで当てはめ、各アイテムの真のラベルを確率として、各アノテーターの能力を標準誤差つきで、各アイテムの難易度を、そしてコードブックのバグを示唆するアイテムごとの識別力の診断値を、同時に推定します。

ゴールドラベルは不要で、LLMも関与しません。モデル(GLADの多クラス一般化、Whitehill et al. 2009)は、一致のパターンそのものからすべてを立ち上げます。標準化テストが、誰にも宣言されずにどの問題が難しいかを学ぶのと同じ理屈です。当てはめは決定的で、アノテーション研究の規模ならミリ秒で終わります。

アノテーターの能力を信頼区間つきでライブに推定し、各ラベルが素の投票ではなく事後確率を伴うようにする。

設定

yaml
# Adaptive routing is opt-in via the standard assignment strategy key.
# Omit this line to keep your existing strategy and use psychometrics
# as a pure analytics layer.
assignment_strategy: psychometric
 
# Give items a redundancy target so early-stopped items translate into
# concrete saved judgments on the dashboard.
num_annotators_per_item: 4
 
psychometrics:
  enabled: true
  schema: sarcasm            # scheme to model; default: first radio/likert scheme
  refit_interval: 5          # refit after this many new labels (fits are ~ms)
  min_observations: 20       # cold-start gate before adaptive routing engages
  min_annotators_per_item: 2 # never early-stop an item below this many annotators
  confidence_threshold: 0.95 # posterior at which an item counts as resolved
  cost_per_judgment: 0.08    # optional: expresses savings in currency
  discrimination_flag_threshold: -0.2  # codebook-bug flag sensitivity

対応するスキーマは単一選択のカテゴリカルなもの、つまり radiolikert です(likertの各点は名義カテゴリとして扱われます)。複数選択のスキーマはモデル化されません。

エラーバーつきのラベル

エクスポートには sarcastic (2 of 3 votes) ではなく sarcastic, p = 0.94 [0.88 – 0.97] と出ます。この確率はモデルの事後確率で、何人が投票したかだけでなく誰が投票したかを重み付けしたものです。区間は能力推定値に対する±1標準誤差の感度幅です。

下流では、ソフトラベルで学習する、評価セットを高信頼のアイテムに絞る、低確率のアイテムをノイズではなく本当に曖昧なものとして扱う、といった使い方ができます。アノテーターから分布を直接集めるという補完的なやり方については、ソフトラベルアノテーションを参照してください。

アノテーターの能力を、正直に見せる

能力θは一致のパターンから推定されます。1.0は新しいアノテーターの事前値、0はそのラベルが情報を持たないこと、負の値は系統的に誤っていることを意味します。どの推定値にも標準誤差がついていて、ラベルが12件のアノテーターはひげが広く、ダッシュボードもそう表示します。

ひげの広い推定値から人事上の判断を下さないでください。標準誤差は近似(最頻値におけるFisher情報量)であり、作りのうえで多少楽観的です。

コードブックのバグ検出

アイテムの難易度は能力と同時に推定されますが、より使えるシグナルは識別力、つまり各アイテムにおけるアノテーターの能力と回答の正しさの相関です。

識別力が強く負のとき、つまり最も優秀なアノテーターこそが多数派のコンセンサスと食い違っているとき、そのアイテムについては、アノテーターではなくガイドラインのほうが誤っているか曖昧であるのが普通です。ダッシュボードはこれらを「コードブックのバグの疑い」としてまとめます。説明を直してから見直してください。チームがそれを解決する場としてよく使われるのがMultiplayer Roomsです。

適応的な割り当て

assignment_strategy: psychometric を設定すると、アノテーターが作業を要求したときに、残りのアイテムが「そのアノテーターそのアイテムにラベルを付けたときの1ステップ先の期待情報利得」の厳密な値で順位付けされます。不確実性の高いアイテムは能力の高いアノテーターに優先的に回り、事後確率がすでに confidence_threshold を超えたアイテム(min_annotators_per_item 人以上のアノテーターがついていること)は予算を使わなくなります。アイテムあたりN人固定の設計と比べて節約された判断数はダッシュボードで数えられ、cost_per_judgment を設定すれば金額でも示されます。

運用上の注意が2つあります。

  • コールドスタート。 ラベルが min_observations 件たまるまで、割り当てはランダムにフォールバックします。モデルが能力と難易度を切り分けるには、アノテーターの重なりが先に必要だからです。この間、ダッシュボードにはウォームアップ中のメーターが表示されます。
  • バッチ処理。 割り当てはユーザーのキューが補充されるときに起きます。キューが短いほど順位付けは新しく、ユーザーあたりのバッチが非常に大きいと適応性は薄まります。

費やす前の検出力分析

どのアノテーションプロジェクトも「アイテムあたり何人のアノテーターか」を当て推量しています。スタディデザイナーは、シード固定のモンテカルロシミュレーションでそれに答えます。

bash
python -m potato.psychometrics.design --items 500 --accuracy 0.75 \
    --classes 3 --target-ci 0.10 --cost 0.08
text
ann/item   alpha     95% interval   width  majority acc  judgments       cost
       2   0.392 [ 0.330,  0.439]   0.109         0.751       1000      80.00
       3   0.388 [ 0.338,  0.431]   0.093         0.864       1500     120.00  <- recommended

推奨されるのは、Krippendorff's αの95%区間が --target-ci より狭くなる最小の重複数です。これは、擁護できる程度に精密な一致度の推定値が得られる設計のうち、最も安いものにあたります。--accuracy の入力値は、小さなパイロットで測るのが一番です。同じ分析はダッシュボードからも、管理者APIからも利用できます(GET /psychometrics/api/design)。

アノテーション検出力計算機を使えば、ブラウザ上で対話的に実行することもできます。

エンドポイント

すべてのエンドポイントは管理者アクセスを必要とします(RBACの VIEW_ADMIN_DASHBOARD。デバッグモードと共有の管理者APIキーも通ります)。

エンドポイント目的
GET /psychometrics/dashboardライブダッシュボード
GET /psychometrics/api/statsダッシュボードの集計値(新しく当てはめ直します)
GET /psychometrics/api/export拡張エクスポート:事後確率、区間、能力
GET /psychometrics/api/design検出力分析

MACEとの関係

PotatoにはMACEも同梱されていて、アノテーターの能力と予測ラベルを事後的な分析として推定します。両者は同じ文献から出た親戚ですが、役割が違います。

MACE心理測定
アノテーターのモデル知っている/推測しているという能力標準誤差つきの連続的な能力
アイテムのモデルなし難易度 + 識別力(コードブックのバグのフラグ)
実行タイミングN件のアノテーション後のバッチ分析ライブ、割り当てループの中
割り当てを動かすかいいえはい。情報利得によるルーティングと早期打ち切り
ラベルの不確実性エントロピー事後確率 + 感度区間
研究前の計画なしモンテカルロによる検出力分析

カテゴリカルなスキーマの能力をさっと読み取りたいときはMACEを使ってください(multiselect にも対応します)。研究の進行中にその研究へ働きかける、難易度を織り込んだ測定がほしいときは心理測定を使ってください。

トラブルシューティング

  • ダッシュボードがいつまでも「ウォームアップ中」と出る。 モデルには最低でも2種類のラベルと、重なりのあるアノテーターが必要です。アノテーターが1人だけ、あるいはラベルが全員一致の場合、当てはめは仕様上退化します。アノテーターを増やすか min_observations を下げてください。
  • assignment_strategy: psychometric を設定したのに、割り当てがランダムに見える。 それはコールドスタートのフォールバックです。ウォームアップ中のメーターと min_observations を確認してください。
  • 能力がどれも1.0付近で、ひげが大きい。 まだ重なりが足りていません。アノテーターが共有アイテムを積み上げるにつれて能力は分離していきます。
  • /psychometrics/... が404になる。 設定に psychometrics.enabled: true のブロックがありません。

参考資料