7. 선호 쌍의 조건 — 어떤 데이터가 DPO를 움직이는가

쌍비교: 꼭 둘을 비교해야 하나

DPO는 (yw,yl)(\textcolor{#e000a5}{y_w}, \textcolor{#e000a5}{y_l}) 쌍을 입력받는다. 그런데 서비스에 쌓이는 피드백은 대개 응답 하나에 붙은 👍/👎 다. 왜 하나의 응답에 “좋다/나쁘다” 점수를 매기지 않고, 반드시 둘을 비교하는가?

역사: 저울이 없는 것을 재는 법

1920년대 심리학에는 감각을 재는 방법이 이미 있었다. 무게나 밝기처럼 물리량을 아는 자극 둘을 보여 주고 "어느 쪽이 더 큰가"를 물어, 사람이 얼마나 작은 차이까지 가려내는지를 쟀다(정신물리학). 이때 자극의 실제 크기는 실험자가 이미 안다. 시카고 대학의 심리학자 루이스 서스톤(L. L. Thurstone)은 이 방법을 거꾸로 쓰려 했다. 범죄의 심각함처럼 저울이 아예 없는 가치를 재는 것이다.

1927년 논문 「The Method of Paired Comparisons for Social Values」에서 그는 범죄 19가지(살인, 방화, 위조, 밀주 판매 …)를 가능한 모든 쌍 171개로 묶어 시카고 대학 학생 266명에게 보이고, 쌍마다 더 심각한 쪽에 표시만 하게 했다. 몇 점인지는 묻지 않았다. 이를테면 위조가 밀주 판매보다 심각하다고 표시한 학생은 75.4%였다. 서스톤은 "몇 %가 이쪽을 골랐나"만으로 모든 범죄를 한 줄 눈금 위에 놓았다. 표가 반반에 가깝게 갈린 쌍은 눈금에서 가깝고, 한쪽으로 쏠린 쌍은 멀다. 점수를 한 번도 묻지 않았는데 범죄 사이의 거리가 나왔다.

쌍비교 결과를 항목마다의 점수로 바꾸는 확률 모델은 그 뒤로 더 다듬어졌고, DPO 손실의 σ\sigma 는 그 가운데 브래들리-테리 모델에서 온다.

왜 쌍인가

사람이 매긴 절대 점수는 그대로 모아 쓰기 어렵다고들 한다. 무엇이 문제인지는 아래 문제 6에서 숫자로 확인하자. 사람만 그런 것도 아니다. UltraFeedback을 만든 사람들은 GPT-4의 채점조차 실행할 때마다 점수가 흔들릴까 봐, 한 질문의 네 답을 한 프롬프트에 함께 넣어 나란히 채점하게 했다. RLHF의 보상 모델도 쌍비교 데이터로 학습되고, DPO는 그 보상 모델을 생략했을 뿐 데이터 형식은 물려받았다.

ML에서: 실제로 쌍을 빼서 성공한 사례
알고리즘 데이터 핵심 아이디어
KTO (Kahneman-Tversky Optimization, 에타야라지(Kawin Ethayarajh)와 동료들, 2024) 응답 하나 + “바람직/바람직하지 않음” 라벨 카너먼-트버스키 전망 이론(prospect theory) — 손실이 같은 크기의 이득보다 더 아프다는 비대칭을 손실함수에 내장

KTO 논문은 응답마다 좋다/나쁘다 한 비트만 주는 이 방식이 파라미터 10억~300억 개 모델에서 쌍을 쓰는 방법과 비슷하거나 더 나은 성능을 냈다고 보고했다. 두 데이터의 모양을 나란히 놓으면 이렇다.

쌍비교 데이터 (DPO) 질문 x 답 가 답 나 가 ≻ 나 → yw, yl 같은 사람이 같은 질문의 두 답을 나란히 보고 고른다 단일 라벨 데이터 (KTO) 질문 x₁ 답 y 좋음 질문 x₂ 답 y 나쁨 질문 x₃ 답 y 좋음

KTO의 이름은 전망 이론을 1979년 Econometrica에 발표한 대니얼 카너먼(Daniel Kahneman)과 아모스 트버스키(Amos Tversky)에서 왔다.

문제 6 — 후한 평가자, 짠 평가자

맛집 앱에서 갑과 을 두 사람이 식당 A를 둘 다 가 봤다. 갑은 A에 9점, 을은 A에 5점을 줬다. 식당 C는 갑만 가서 7점, 식당 D는 을만 가서 6점을 줬다(10점 만점). (가) 점수만 보면 C와 D 가운데 어디가 나은가? (나) 두 사람이 A에 준 점수를 기준으로 삼으면? (다) 갑과 을에게 점수 대신 “A와 C 가운데 어디가 낫나”, "A와 D 가운데 어디가 낫나"만 물었다면 무엇을 알 수 있었을까?

김민준 (자신만만)
김민준
(가)는 C죠. 7점이 6점보다 높잖아요.
선생님 (질문)
선생님
민준 학생, 같은 식당 A에 두 사람이 준 점수는 얼마였죠?
김민준 (난처함)
김민준
갑 9점, 을 5점… 같은 식당인데 4점이나 차이 나네요. 갑이 후한 거였어요.
이서연 (평상)
이서연
그럼 각자 A를 기준으로 재야겠다. C는 갑의 A보다 2점 낮고, D는 을의 A보다 1점 높아. 순서는 C < A < D, D가 나아.
선생님 (평상)
선생님
그래요. 점수에는 식당의 좋음과 평가자의 기준점이 섞여 있어요. 그럼 점수를 아예 묻지 않고 두 식당 가운데 어느 쪽이 나은지만 물었다면, 갑의 후함은 어디로 가죠?
이서연 (아하)
이서연
갑은 A와 C를 둘 다 자기 기준으로 재니까, 후한 만큼이 양쪽에 똑같이 들어가서 비교하면 지워져요. 갑은 “A가 낫다”, 을은 "D가 낫다"고 답할 테고, 그 둘만으로 C < A < D 가 나와요.
김민준 (평상)
김민준
교양 수업 발표 채점 같네요. 교수님마다 짜고 후한 게 달라서 점수끼리는 비교가 안 되는데, 한 교수님 안에서 누가 더 잘했는지는 믿을 만한.

정리 (가) 점수만 보면 C(7) > D(6). (나) 갑은 을보다 A에 4점 후하다. C는 갑의 A보다 2점 낮고 D는 을의 A보다 1점 높으므로 C < A < D. (다) 갑의 “A가 낫다”, 을의 "D가 낫다"만으로 같은 순서가 나온다. 한 사람이 두 대상을 나란히 비교하면 그 사람의 기준점이 양쪽에 똑같이 들어가 지워진다.

문제 7 — 쌍이 없는 로그

서비스에 👍/👎 버튼 로그 10만 건이 쌓였지만, 같은 프롬프트에 대한 두 응답의 비교는 없다. DPO와 KTO 중 무엇을 쓸 수 있는가? 무엇을 잃는가?

이서연 (평상)
이서연
쌍이 없으니까 DPO는 못 쓰지. KTO는 응답 하나에 좋다/나쁘다 라벨만 있으면 되니까 KTO.
김민준 (자신만만)
김민준
같은 프롬프트에 👍 하나, 👎 하나가 우연히 있는 것만 모아서 쌍으로 만들면 DPO도 되지. 그게 더 정확하잖아.
선생님 (질문)
선생님
그렇게 모으면 10만 건 중에 몇 건이 남을까요? 사용자들이 같은 질문을 토씨 하나 안 틀리고 두 번 할까요?
김민준 (당황)
김민준
아… 프롬프트가 거의 다 다르니까 대부분 날아가겠네요. 남는 건 “안녕” 같은 것뿐이고.
선생님 (평상)
선생님
맞아요. 가능은 하지만 데이터를 크게 버리고, 남는 쌍도 한쪽으로 치우쳐요. 그럼 KTO는 무엇을 잃죠?
이서연 (평상)
이서연
"A가 B보다 낫다"는 상대 정보요. 👍를 받은 응답들끼리 누가 더 나은지는 모르니까.
김민준 (평상)
김민준
설문조사 과제 할 때랑 같네. 문항을 짝지어 비교하게 설계 안 했으면, 나중에 억지로 짝 맞추려 해도 응답자가 다 달라서 못 쓰는.

정리 KTO를 쓸 수 있다. 쌍을 억지로 맞추면 대부분의 데이터를 버린다. KTO는 대신 같은 맥락에서의 상대 비교 신호를 잃는다.