Skip to content

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の設定に手間をかける価値があるのは、次のような場合です。

  • 直接の数値評価が、アノテーターごとのスケールの使い方の違いに左右される
  • 数百から数千のアイテムにわたる信頼できるランキングが必要である
  • 品質の次元が本質的に相対的である(例えば、どの翻訳が最も流暢に読めるか)

Best-Worst ScalingのアノテーションインターフェースPotatoにおける比較アノテーションのためのBest-Worst Scalingインターフェース

設定

BWSタスクは2つの部分からなります。スキーマはアノテーターに何を尋ねるかを定め、トップレベルのbws_configブロックはタプルの作り方とスコアの付け方を定めます。

yaml
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_size1つのタプルに表示するアイテム数
num_tuples生成するタプルの総数
min_item_appearances各アイテムが登場するタプルの最小数
seedサンプリングを固定し、実行を再現できるようにする
scoring.methodcounting、bradley_terry、plackett_luceのいずれか

min_item_appearancesを大きくすると、比較の回数が増える代わりに各アイテムのスコアの精度が上がります。スコアのばらつきが大きいときに調整するのはこの値です。

データ形式

データファイルの各行が1つのアイテムで、Potatoはこのプールからタプルをサンプリングします。

json
{"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を設定すると、この割り当てを再現できます。

スコアリング

スコアリングはデータ収集の後にコマンドラインから実行します。

bash
python -m potato.bws_scoring --config config.yaml --method counting

--outputで別のパスを指定しない限り、結果は出力ディレクトリのbws_scores.tsvに書き込まれます。フラグは--config、--method、--outputの3つです。

カウント法

デフォルトの方法で、最も透明性があります。アイテムのスコアは、最良に選ばれた割合から最悪に選ばれた割合を引いたもので、スコアは-1.0から+1.0の範囲になります。追加の依存関係は不要で、読者が手で再計算できるようにしたいときに報告すべき方法です。

bash
python -m potato.bws_scoring --config config.yaml --method counting --output scores.tsv

Bradley-Terry

各タプルから導かれるペアワイズ比較にモデルを当てはめます。最良のアイテムはタプル内の他のすべてのアイテムに勝ち、他のすべてのアイテムは最悪のアイテムに勝つとみなします。データが疎な場合はカウント法よりうまく扱えます。

bash
python -m potato.bws_scoring --config config.yaml --method bradley_terry

Plackett-Luce

各判断を2つの選択として扱います。まずタプル全体から最良を選び、次に残りのアイテムから最悪を選ぶというもので、これはベストワースト判断がどのように下されるかを表すMaxDiffモデルです。アイテムごとの効用を最尤法で推定します。2.10.2より前はBradley-Terryと同じペアを当てはめて同一のスコアを返していたため、この方法の結果を報告した場合は2.10.2以降でスコアを計算し直してください。

bash
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組分です。

yaml
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"

出力の内容

各スキーマは、最良に選ばれたアイテムと最悪に選ばれたアイテムを記録します。

json
{
  "fluency": {"best": "sys_d", "worst": "sys_c"},
  "adequacy": {"best": "sys_a", "worst": "sys_c"}
}

スコアはこのファイルには含まれません。スコアは後からpotato.bws_scoringが計算します。そのため、完了した研究を別の方法で再スコアリングする際に、データを集め直す必要はありません。

モニタリング

管理ダッシュボードにはBWSタブがあり、アノテーションの進捗と現在のアイテムスコアを表示します。これを見れば、収集を止めるかどうか決める前に、ランキングが安定したかどうかを確認できます。

完全な例

yaml
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

アノテーションを集めてから、スコアを計算します。

bash
potato start config.yaml -p 8000
python -m potato.bws_scoring --config config.yaml --method bradley_terry

参考資料

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