Best-Worst Scaling
PotatoでBest-Worst Scalingを実行します。アノテーターは各タプルで最良と最悪のアイテムを選び、カウント法、Bradley-Terry、Plackett-Luceのいずれかがその選択をスコアに変換します。
v2.3.0の新機能
Best-Worst Scaling(BWS)はMaxDiffとも呼ばれ、アノテーターにアイテムのタプル(通常は4つ)を提示し、ある基準で最良のものと最悪のものを選ばせます。タプルごとに2回クリックするだけで、評価値を1つ付けるよりも多くの情報が得られます。また判断が比較によるものなので、あるアノテーターの7が別のアノテーターの5に相当するという問題を避けられます。
BWSの設定に手間をかける価値があるのは、次のような場合です。
- 直接の数値評価が、アノテーターごとのスケールの使い方の違いに左右される
- 数百から数千のアイテムにわたる信頼できるランキングが必要である
- 品質の次元が本質的に相対的である(例えば、どの翻訳が最も流暢に読めるか)
Potatoにおける比較アノテーションのためのBest-Worst Scalingインターフェース
設定
BWSタスクは2つの部分からなります。スキーマはアノテーターに何を尋ねるかを定め、トップレベルのbws_configブロックはタプルの作り方とスコアの付け方を定めます。
bws_config:
tuple_size: 4 # items shown at once
min_item_appearances: 8 # how often each item must appear across tuples
seed: 42
scoring:
method: counting # counting | bradley_terry | plackett_luce
annotation_schemes:
- annotation_type: bws
name: fluency
description: "Select the BEST and WORST translation by fluency"
tuple_size: 4
best_description: "Most Fluent"
worst_description: "Least Fluent"
sequential_key_binding: true
label_requirement:
required: trueスキーマが受け付けるのはtuple_size、best_description、worst_description、sequential_key_binding、label_requirementだけです。タプルの生成やスコアリングに関するものはすべてbws_configに書きます。
bws_configブロックのないbwsスキーマは、空のアイテムリストに対して質問を表示します。BWSタスクが空白で表示される原因は、たいていこれです。
bws_configのオプション
| オプション | 説明 |
|---|---|
tuple_size | 1つのタプルに表示するアイテム数 |
num_tuples | 生成するタプルの総数 |
min_item_appearances | 各アイテムが登場するタプルの最小数 |
seed | サンプリングを固定し、実行を再現できるようにする |
scoring.method | counting、bradley_terry、plackett_luceのいずれか |
min_item_appearancesを大きくすると、比較の回数が増える代わりに各アイテムのスコアの精度が上がります。スコアのばらつきが大きいときに調整するのはこの値です。
データ形式
データファイルの各行が1つのアイテムで、Potatoはこのプールからタプルをサンプリングします。
{"id": "sys_a", "text": "Le chat s'est assis sur le tapis."}
{"id": "sys_b", "text": "Le chat a assis sur le tapis."}
{"id": "sys_c", "text": "Le chat etait assis sur le mat."}
{"id": "sys_d", "text": "Le chat se tenait sur le tapis."}タプルの生成は設計のバランスをとります。各アイテムはほぼ同じ回数だけ登場し、比較が必要なペアはスコアを比較できるだけの頻度で同じタプルに入ります。seedを設定すると、この割り当てを再現できます。
スコアリング
スコアリングはデータ収集の後にコマンドラインから実行します。
python -m potato.bws_scoring --config config.yaml --method counting--outputで別のパスを指定しない限り、結果は出力ディレクトリのbws_scores.tsvに書き込まれます。フラグは--config、--method、--outputの3つです。
カウント法
デフォルトの方法で、最も透明性があります。アイテムのスコアは、最良に選ばれた割合から最悪に選ばれた割合を引いたもので、スコアは-1.0から+1.0の範囲になります。追加の依存関係は不要で、読者が手で再計算できるようにしたいときに報告すべき方法です。
python -m potato.bws_scoring --config config.yaml --method counting --output scores.tsvBradley-Terry
各タプルから導かれるペアワイズ比較にモデルを当てはめます。最良のアイテムはタプル内の他のすべてのアイテムに勝ち、他のすべてのアイテムは最悪のアイテムに勝つとみなします。データが疎な場合はカウント法よりうまく扱えます。
python -m potato.bws_scoring --config config.yaml --method bradley_terryPlackett-Luce
各判断を2つの選択として扱います。まずタプル全体から最良を選び、次に残りのアイテムから最悪を選ぶというもので、これはベストワースト判断がどのように下されるかを表すMaxDiffモデルです。アイテムごとの効用を最尤法で推定します。2.10.2より前はBradley-Terryと同じペアを当てはめて同一のスコアを返していたため、この方法の結果を報告した場合は2.10.2以降でスコアを計算し直してください。
python -m potato.bws_scoring --config config.yaml --method plackett_luce方法の選び方
| 方法 | 速度 | 使用する情報 | 最適な用途 |
|---|---|---|---|
counting | 高速 | 最良と最悪の回数 | 探索的分析や、確認しやすくしたい結果 |
bradley_terry | 中程度 | 導かれるペアワイズ比較 | 通常のデフォルト |
plackett_luce | 低速 | 最良と最悪の各選択(選んだ順序どおり) | 判断そのものの尤度モデル |
bradley_terryにはpip install choixが必要です。plackett_luceが使うscipyは、Potatoがすでにインストールしています。
複数の次元を同時に扱う
同じアイテムに対して2つのBWSスキーマを設定すると、タプルごとに2つの判断を集められます。コーパス全体をもう一度回す必要はなく、追加のコストはクリック1組分です。
annotation_schemes:
- annotation_type: bws
name: fluency
description: "Select the BEST and WORST by fluency"
tuple_size: 4
best_description: "Most Fluent"
worst_description: "Least Fluent"
- annotation_type: bws
name: adequacy
description: "Select the BEST and WORST by meaning preservation"
tuple_size: 4
best_description: "Most Accurate"
worst_description: "Least Accurate"出力の内容
各スキーマは、最良に選ばれたアイテムと最悪に選ばれたアイテムを記録します。
{
"fluency": {"best": "sys_d", "worst": "sys_c"},
"adequacy": {"best": "sys_a", "worst": "sys_c"}
}スコアはこのファイルには含まれません。スコアは後からpotato.bws_scoringが計算します。そのため、完了した研究を別の方法で再スコアリングする際に、データを集め直す必要はありません。
モニタリング
管理ダッシュボードにはBWSタブがあり、アノテーションの進捗と現在のアイテムスコアを表示します。これを見れば、収集を止めるかどうか決める前に、ランキングが安定したかどうかを確認できます。
完全な例
annotation_task_name: "MT System Ranking (BWS)"
task_dir: "."
data_files:
- "data/mt_systems.jsonl"
item_properties:
id_key: id
text_key: text
bws_config:
tuple_size: 4
min_item_appearances: 8
seed: 42
scoring:
method: bradley_terry
annotation_schemes:
- annotation_type: bws
name: overall_quality
description: "Select the BEST and the WORST translation"
tuple_size: 4
best_description: "Best Translation"
worst_description: "Worst Translation"
sequential_key_binding: true
label_requirement:
required: true
output_annotation_dir: "annotation_output/"
export_annotation_format: jsonl
user_config:
allow_all_users: trueアノテーションを集めてから、スコアを計算します。
potato start config.yaml -p 8000
python -m potato.bws_scoring --config config.yaml --method bradley_terry参考資料
- ペアワイズ比較 - アイテムが2つの場合
- Likertスケール - 比較ではなく直接評価する方法
- エクスポート形式 - アノテーションの取り出し方
実装の詳細については、ソースドキュメントを参照してください。