Best-Worst Scaling
Potato의 Best-Worst Scaling을 활용한 효율적인 비교 어노테이션 — 비교 튜플을 자동으로 생성하고 선택 결과를 연속적인 품질 점수로 변환합니다.
v2.3.0에서 추가됨
Best-Worst Scaling(BWS)은 MaxDiff라고도 하며, 어노테이터에게 항목 튜플(보통 4개)을 보여주고 어떤 기준에 따라 가장 좋은 항목과 가장 나쁜 항목을 고르게 합니다. 튜플당 두 번의 클릭으로 평정 하나보다 많은 정보를 얻을 수 있고, 판단이 비교 방식이므로 한 어노테이터의 7점이 다른 어노테이터에게는 5점일 수 있다는 문제를 피할 수 있습니다.
BWS는 다음과 같은 경우에 설정할 만한 가치가 있습니다.
- 직접적인 수치 평정에서 어노테이터마다 척도를 쓰는 방식이 달라 문제가 될 때
- 수백 또는 수천 개 항목에 대한 신뢰할 수 있는 순위가 필요할 때
- 품질 차원이 본질적으로 상대적일 때(예: 어느 번역이 가장 유창하게 읽히는지)
Potato의 비교 어노테이션을 위한 best-worst scaling 인터페이스
구성
BWS 작업은 두 부분으로 이루어집니다. 스키마는 어노테이터에게 무엇을 물을지 정하고, 최상위 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 | 한 튜플에 나타나는 항목 수 |
num_tuples | 생성할 전체 튜플 수 |
min_item_appearances | 각 항목이 등장하는 최소 튜플 수 |
seed | 샘플링을 고정해 실행을 재현할 수 있게 함 |
scoring.method | counting, bradley_terry 또는 plackett_luce |
min_item_appearances를 높이면 비교 횟수가 늘어나는 대신 모든 항목의 점수가 더 정밀해집니다. 점수에 잡음이 많을 때 조정할 값이 바로 이것입니다.
데이터 형식
데이터 파일의 각 행은 항목 하나이며, 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 세 가지입니다.
카운팅
기본값이며 가장 투명한 방법입니다. 항목의 점수는 가장 좋은 항목으로 선택된 비율에서 가장 나쁜 항목으로 선택된 비율을 뺀 값이므로, 점수는 -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
각 판단을 두 번의 선택으로 다룹니다. 먼저 튜플 전체에서 가장 좋은 항목을 고르고, 이어서 남은 항목 중에서 가장 나쁜 항목을 고르는 것으로, best-worst 판단이 내려지는 방식을 나타내는 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는 Potato가 이미 설치하는 scipy를 사용합니다.
여러 차원을 한 번에
같은 항목에 BWS 스키마 두 개를 두면 튜플마다 판단 두 개를 수집합니다. 말뭉치를 한 번 더 훑는 대신 클릭 한 쌍만 더하면 됩니다.
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더 읽어보기
구현 세부 사항은 원본 문서를 참조하세요.