13. DPO의 진화 — 하나의 알고리즘이 낳은 가계도

KTO: 쌍 없이, 기준점과 견준다

링크 함수를 고쳐도 DPO를 돌리는 데 드는 비용은 그대로다. DPO의 데이터는 (프롬프트, 선호 응답, 비선호 응답) 세 개가 한 묶음이라, 같은 프롬프트에 대한 응답이 꼭 두 개 있어야 한다. 이런 짝은 모으기 어렵고 비싸다. 반대로 서비스에는 응답 하나에 "좋아요/싫어요"를 누른 기록이 쌓이지만, DPO는 이것을 그대로 쓰지 못한다. 응답 하나에 좋다·나쁘다만 붙어 있어도 배울 수는 없을까?

약점 3: 꼭 쌍이 필요하다 — KTO

2024년 에타야라지(Kawin Ethayarajh)와 동료들의 KTO(ICML 2024)는 응답 하나에 붙은 “좋다(1) / 나쁘다(0)” 한 비트로 배운다. 쌍이 없으면 비교할 상대가 없는데, KTO는 상대 대신 기준점과 견준다.

생각은 행동경제학의 전망 이론(prospect theory)에서 왔다. 사람은 결과를 재산의 총액이 아니라 기준점에서 얼마나 늘었나, 줄었나로 느끼고, 기준점에서 멀어질수록 같은 1만 원의 느낌이 무뎌진다. 그리고 같은 크기라면 손해를 이득보다 크게 느낀다(손실 회피). 트버스키(Amos Tversky)와 카너먼(Daniel Kahneman)이 1992년 돈을 거는 선택을 사람들에게 물어 잰 값으로는, 손해 쪽 기울기가 이득 쪽의 약 2.25배였다(KTO 논문이 인용한 값).

KTO에서 응답 하나가 얼마나 "올랐나"는 레퍼런스 대비 로그비율 log⁡πθ(y)πref(y)\log\frac{\pi_\theta(y)}{\pi_\text{ref}(y)} 로 잰다. DPO가 보상으로 읽던 바로 그 양이다. 숫자로 먼저 보자. 기준점을 0.5, 크기 계수를 1로 두고, 응답 넷의 "느낌 값"을 시그모이드로 매긴다. 좋은 응답은 로그비율이 기준점보다 높을수록, 나쁜 응답은 낮을수록 느낌 값이 1에 가깝다. 손실은 1 − 느낌 값이다.

응답 라벨 로그비율 기준점과의 차 느낌 값 손실 그래디언트 가중치
A 좋다 2.5 +2.0 0.881 0.119 0.105
B 좋다 0.5 0 0.500 0.500 0.250
C 나쁘다 −1.5 −2.0 0.881 0.119 0.105
D 나쁘다 1.5 +1.0 0.269 0.731 0.197

마지막 칸의 그래디언트 가중치(곱하는 수 — 신경망 파라미터가 아니다)는 손실이 로그비율에 얼마나 민감한지다. 이미 기준점에서 멀리 바른 쪽에 있는 A와 C는 약하게 밀리고, 기준점 근처의 B와 거꾸로 올라간 D는 세게 밀린다. 짝이 없어도 응답마다 "기준점보다 얼마나 나은가"가 학습 신호(시그널)가 된다.

0 0.5 1 기준점 -4 -2 0 +2 +4 응답의 로그비율 − 기준점 좋은 응답 나쁜 응답 A 0.881 B 0.500 C 0.881 D 0.269 느낌 값

식으로 쓰면 다음과 같다.

LKTO=E[λy−v(x,y)],v(x,y)={λD σ(β(rθ−z0))좋은 응답λU σ(β(z0−rθ))나쁜 응답\textcolor{#d62728}{\mathcal{L}_\text{KTO}} = \mathbb{E}\big[\textcolor{#536020}{\lambda_y} - \textcolor{#cc00ff}{v}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y})\big], \qquad \textcolor{#cc00ff}{v}(\textcolor{#0093b8}{x}, \textcolor{#1c9c60}{y}) = \begin{cases} \textcolor{#536020}{\lambda_D}\,\sigma\big(\textcolor{#827717}{\beta}(\textcolor{#d9670b}{r_\theta} - \textcolor{#993600}{z_0})\big) & \text{좋은 응답} \\ \textcolor{#536020}{\lambda_U}\,\sigma\big(\textcolor{#827717}{\beta}(\textcolor{#993600}{z_0} - \textcolor{#d9670b}{r_\theta})\big) & \text{나쁜 응답} \end{cases}
rθ=log⁡πθ(y∣x)πref(y∣x),z0=DKL(πθ(⋅∣x) ∥ πref(⋅∣x))\textcolor{#d9670b}{r_\theta} = \log\frac{\textcolor{#1565c0}{\pi_\theta}(\textcolor{#1c9c60}{y} \mid \textcolor{#0093b8}{x})}{\textcolor{#6f6f78}{\pi_\text{ref}}(\textcolor{#1c9c60}{y} \mid \textcolor{#0093b8}{x})}, \qquad \textcolor{#993600}{z_0} = \textcolor{#8c564b}{D_\text{KL}}\big(\textcolor{#1565c0}{\pi_\theta}(\cdot \mid \textcolor{#0093b8}{x}) \,\|\, \textcolor{#6f6f78}{\pi_\text{ref}}(\cdot \mid \textcolor{#0093b8}{x})\big)
LKTOKTO 손실v느낌 값: 응답이 기준점보다 바른 쪽으로 얼마나 갔는지를 0과 λy 사이로rθ그 응답의 레퍼런스 대비 로그비율 (DPO의 암묵적 보상과 같은 양)z0기준점: 학습 모델이 레퍼런스에서 평균적으로 얼마나 멀어졌는지 (KL)λD, λU, λy좋은 응답, 나쁜 응답에 거는 무게. λy 는 그 응답의 라벨에 맞는 쪽βDPO의 KL 강도 자리의 계수: 기준점에서 멀어질 때 느낌 값이 얼마나 빨리 포화하는지DKLKL 발산πθ, πref학습 중인 정책, 레퍼런스x, y프롬프트와 응답 \small\begin{array}{ll} \textcolor{#d62728}{\mathcal{L}_\text{KTO}} & \text{KTO 손실} \\ \textcolor{#cc00ff}{v} & \text{느낌 값: 응답이 기준점보다 바른 쪽으로 얼마나 갔는지를 0과 } \textcolor{#536020}{\lambda_y} \text{ 사이로} \\ \textcolor{#d9670b}{r_\theta} & \text{그 응답의 레퍼런스 대비 로그비율 (DPO의 암묵적 보상과 같은 양)} \\ \textcolor{#993600}{z_0} & \text{기준점: 학습 모델이 레퍼런스에서 평균적으로 얼마나 멀어졌는지 (KL)} \\ \textcolor{#536020}{\lambda_D},\ \textcolor{#536020}{\lambda_U},\ \textcolor{#536020}{\lambda_y} & \text{좋은 응답, 나쁜 응답에 거는 무게. } \textcolor{#536020}{\lambda_y} \text{ 는 그 응답의 라벨에 맞는 쪽} \\ \textcolor{#827717}{\beta} & \text{DPO의 KL 강도 자리의 계수: 기준점에서 멀어질 때 느낌 값이 얼마나 빨리 포화하는지} \\ \textcolor{#8c564b}{D_\text{KL}} & \text{KL 발산} \\ \textcolor{#1565c0}{\pi_\theta},\ \textcolor{#6f6f78}{\pi_\text{ref}} & \text{학습 중인 정책, 레퍼런스} \\ \textcolor{#0093b8}{x},\ \textcolor{#1c9c60}{y} & \text{프롬프트와 응답} \end{array}

글자는 KTO 논문을 따랐다. 기준점 z0\textcolor{#993600}{z_0} 는 전망 이론에서 기준점을 부르는 글자이고, 이 장에서 DPO의 마진을 부르는 zz 와는 다른 양이다. 느낌 값 v\textcolor{#cc00ff}{v} 는 전망 이론의 가치 함수(value function)에서 왔다. λ는 전망 이론에서 손실 회피의 크기를 부르던 글자다.

KTO가 전망 이론에서 가져온 것은 기준점과, 멀어질수록 무뎌지는 모양이다. 손실 회피의 크기는 λD\textcolor{#536020}{\lambda_D}, λU\textcolor{#536020}{\lambda_U} 로 따로 정한다. 논문의 기본값은 둘 다 1이고, 좋은 예가 nDn_D 개, 나쁜 예가 nUn_U 개면 λDnD/(λUnU)\textcolor{#536020}{\lambda_D} n_D / (\textcolor{#536020}{\lambda_U} n_U) 가 1에서 1.5 사이가 되게 맞추라고 권한다. 기준점 z0\textcolor{#993600}{z_0} 를 정의대로 계산하려면 모델에서 응답을 뽑아야 해서 느리다. 그래서 실제로는 미니배치 안에서 프롬프트와 응답의 짝을 엇갈리게 맞춰 어림한다.

얻는 것과 잃는 것이 분명하다. 이미 쌓인 “좋아요/싫어요” 기록을 그대로 쓰고 쌍을 만드는 비용이 사라진다. 대신 같은 프롬프트의 두 응답을 나란히 놓고 견주는 쌍비교의 "상대적 우열"이라는 학습 신호를 포기한다.

문제 4 — 만 원을 잃는 아픔

계산 모형: 이 사람은 결과를 기준점에서 늘어난 액수와 줄어든 액수로 느끼고, 줄어든 것은 같은 액수의 늘어난 것보다 2배 아프게 느낀다(느낌 값 = 늘어난 액수, 또는 −2 × 줄어든 액수). (가) 앞면이면 xx 원을 따고 뒷면이면 1만 원을 잃는 동전 던지기가 있다. 느낌 값의 평균이 0 이상일 때만 응한다면 xx 는 얼마 이상이어야 하는가? (나) 오늘 계좌에 95만 원이 있다. 90만 원을 넣은 A와 100만 원을 넣은 B의 느낌 값은 각각 얼마인가?

김민준 (자신만만)
김민준
반반이니까 1만 원보다 많이 따기만 하면 이득이죠. xx 는 1만 원 초과.
선생님 (질문)
선생님
민준 학생, 그건 돈의 평균이에요. 이 사람의 느낌 값으로 평균을 내면요?
김민준 (당황)
김민준
0.5x−0.5×2×10,000≥00.5x - 0.5 \times 2 \times 10{,}000 \ge 0 이니까… 2만 원은 따야 응하네요.
이서연 (평상)
이서연
(나)는 같은 95만 원인데 A는 +5만, B는 5만이 줄었으니 −10만이야. 금액보다 기준점이 느낌을 정하네.
김민준 (평상)
김민준
조교 장학금도 그래요. 기대 안 했으면 10만 원도 신나는데, 20만 원 줄 줄 알았으면 10만 원은 서운하거든요.

정리 (가) 0.5x−0.5×2×10,000≥00.5x - 0.5 \times 2 \times 10{,}000 \ge 0 → x≥20,000x \ge 20{,}000 원. (나) A는 +5만, B는 −10만. 같은 결과도 기준점에 따라 이득이 되기도 손해가 되기도 하고, 손해는 더 크게 느껴진다.

문제 5 — 기준점이 올라가면

KTO에서 β=0.5\textcolor{#827717}{\beta} = 0.5, λD=λU=1\textcolor{#536020}{\lambda_D} = \textcolor{#536020}{\lambda_U} = 1 이다. 좋은 응답 하나는 rθ=3\textcolor{#d9670b}{r_\theta} = 3, 나쁜 응답 하나는 rθ=1\textcolor{#d9670b}{r_\theta} = 1 이다. (가) 기준점 z0=1\textcolor{#993600}{z_0} = 1 일 때 두 응답의 손실 λy−v\textcolor{#536020}{\lambda_y} - \textcolor{#cc00ff}{v} 를 구하시오. (나) 학습이 진행되어 모델이 레퍼런스에서 전체로 더 멀어져 z0=3\textcolor{#993600}{z_0} = 3 이 되었다. 두 응답의 rθ\textcolor{#d9670b}{r_\theta} 는 그대로다. 손실은 어떻게 되는가? (다) 그래디언트 가중치 β v(1−v)\textcolor{#827717}{\beta}\,\textcolor{#cc00ff}{v}(1-\textcolor{#cc00ff}{v}) 로 보면 z0=3\textcolor{#993600}{z_0} = 3 에서 어느 응답이 더 세게 밀리는가?

김민준 (자신만만)
김민준
rθ\textcolor{#d9670b}{r_\theta} 가 그대로니까 손실도 그대로죠. (가)만 계산하면 돼요. 좋은 응답은 σ(0.5×2)=0.731\sigma(0.5 \times 2) = 0.731 이라 손실 0.269, 나쁜 응답은 σ(0)=0.5\sigma(0) = 0.5 라 손실 0.5.
선생님 (질문)
선생님
민준 학생, 손실 식에서 rθ\textcolor{#d9670b}{r_\theta} 는 혼자 들어가나요, 무엇과 함께 들어가나요?
김민준 (당황)
김민준
rθ−z0\textcolor{#d9670b}{r_\theta} - \textcolor{#993600}{z_0} 로 들어가요… z0=3\textcolor{#993600}{z_0} = 3 이면 좋은 응답은 σ(0)=0.5\sigma(0) = 0.5 라서 손실 0.5, 나쁜 응답은 σ(0.5×2)=0.731\sigma(0.5 \times 2) = 0.731 이라 손실 0.269. 뒤집혔네요.
이서연 (평상)
이서연
나쁜 응답은 rθ=1\textcolor{#d9670b}{r_\theta} = 1 이면 레퍼런스보다 확률이 오른 건데, 모델 전체가 3만큼 움직였으니 상대로는 내려간 셈이네. 좋은 응답도 3만큼 올렸지만 다들 그만큼 움직였으면 평범한 거고.
선생님 (평상)
선생님
그래요. (다)는요?
이서연 (평상)
이서연
가중치는 v\textcolor{#cc00ff}{v} 가 0.5일 때 가장 커요. z0=3\textcolor{#993600}{z_0} = 3 에서는 좋은 응답이 0.5×0.25=0.1250.5 \times 0.25 = 0.125 로 더 세게 밀리고, 나쁜 응답은 0.5×0.731×0.269≈0.0980.5 \times 0.731 \times 0.269 \approx 0.098 로 덜 밀려요.
이서연 (깨달음)
이서연
통계 수업의 표준점수랑 같네요. 원점수가 그대로여도 평균이 오르면 표준점수는 내려가요. 좋은 응답을 올렸다는 건 남들보다 더 올렸다는 뜻이어야 하는 거고요.
김민준 (평상)
김민준
아까 계좌 문제랑 같네요. 95만 원은 그대로인데 기준점이 바뀌니까 느낌이 바뀌었잖아요.

정리 (가) z0=1\textcolor{#993600}{z_0} = 1: 좋은 응답 손실 0.269, 나쁜 응답 0.5. (나) z0=3\textcolor{#993600}{z_0} = 3: 좋은 응답 0.5, 나쁜 응답 0.269. rθ\textcolor{#d9670b}{r_\theta} 가 그대로여도 기준점이 오르면 좋은 응답은 덜 좋아 보이고 나쁜 응답은 덜 나빠 보인다. (다) 좋은 응답 0.125, 나쁜 응답 약 0.098. 기준점 근처에 있게 된 좋은 응답이 더 세게 밀린다.