Chapter 4: 길이 편향 — 합이 공정한가?

의문

로그확률은 항상 0\leq 0이다. 합산하면 토큰이 많을수록 마이너스 방향으로 멀어진다. 길이가 다른 두 응답의 마진 비교는 공정한가?

세 개의 공간에서 바라보기

이 문제를 제대로 이해하려면, 같은 현상을 세 가지 다른 공간에서 바라봐야 한다.

[1] 확률 공간: P(y|x) = P(t₁) × P(t₂|t₁) × P(t₃|t₁,t₂) × …

  각 토큰은 0과 1 사이의 확률이다.
  토큰이 추가될 때마다 곱한다.
  0.9 × 0.8 × 0.7 × 0.9 × ... → 곱할수록 0에 가까워진다.
  아무리 좋은 답이어도, 길기만 하면 확률이 바닥으로 간다.

  → 확률 공간에서 길이는 무조건 불리하다.

[2] 로그확률 공간: log P(y|x) = Σᵢ log P(tᵢ|…)

  곱을 합으로 바꿨지만, log P는 항상 ≤ 0이다.
  -0.1 + (-0.2) + (-0.4) + (-0.1) + ... → 더할수록 마이너스 쪽으로 멀어진다.
  DPO가 작동하는 공간이 바로 여기다.

  → 로그확률 공간에서도 길이는 무조건 불리하다.

[3] 로그오즈 공간: log odds = log(P / (1−P))

  이제 다르다.
  odds = P/(1−P) — "일어날 확률 / 안 일어날 확률"의 비율.
  log odds는 음수일 수도, 양수일 수도 있다.

  P = 0.9  →  odds = 9    →  log odds = +2.2  (강한 긍정 증거)
  P = 0.5  →  odds = 1    →  log odds = 0     (중립)
  P = 0.1  →  odds = 0.11 →  log odds = -2.2  (강한 부정 증거)

로그오즈 공간에서 토큰은 증거다:

베이지안 업데이트의 로그오즈 형태:

  사후 log odds = 사전 log odds + 증거의 log likelihood ratio

각 토큰이 생성될 때:
  - "이 토큰이 나올 법하다" → 양수 증거 → log odds 증가
  - "이 토큰이 이상하다" → 음수 증거 → log odds 감소

로그확률 공간: 증거가 많을수록 합이 마이너스 방향으로 밀려간다 (음수끼리 더하니까)
로그오즈 공간: 좋은 증거는 더하고, 나쁜 증거만 깎는다

→ 로그오즈 공간에서는 "길지만 좋은 답"이 "짧지만 나쁜 답"을 이길 수 있다.

답: DPO는 로그확률 공간에서 작동하므로 공정하지 않다

빼면? — 공간을 바꾸거나, 길이를 정규화하거나

접근 1: 길이 정규화 — SimPO

접근 2: 공간 자체를 바꾸기 — ORPO

DPO의 비교 단위:
  P_θ(y_w|x) / P_θ(y_l|x)  — 확률의 비율
  → 로그를 취하면 로그확률의 차이
  → 길이에 비례해서 왜곡된다

ORPO의 비교 단위:
  odds_θ(y_w|x) / odds_θ(y_l|x)  — 오즈의 비율
  여기서 odds_θ(y|x) = P_θ(y|x) / (1 − P_θ(y|x))

왜 이게 다른가?
  확률 비율: "y_w를 생성할 확률이 y_l의 몇 배인가"
  오즈 비율: "y_w를 생성할 가능성 대 불가능성의 비가,
             y_l의 그것보다 몇 배 더 유리한가"

  오즈 비율은 확률 비율보다 더 안정적이고 덜 극단적이다.
  특히 확률이 매우 낮을 때 (긴 응답) 차이가 두드러진다.

ORPO의 손실함수(LORPO\mathcal{L}_\text{ORPO}):

L_ORPO = L_SFT + λ × L_OR

L_SFT = 일반적인 SFT 손실 (선호 응답에 대해)
L_OR  = −log σ( log(odds_θ(y_w|x) / odds_θ(y_l|x)) )

→ SFT와 선호 정렬을 하나로 통합
→ 레퍼런스 모델 불필요
→ 별도의 정렬 단계 불필요 (monolithic)

ORPO가 길이 편향을 완화하는 이유:

짧은 응답 (4토큰):
  P = 0.05 (낮음)
  odds = 0.05/0.95 = 0.053
  log odds = -2.94

긴 응답 (12토큰):
  P = 0.001 (더 낮음 — 길이 때문에)
  odds = 0.001/0.999 = 0.001
  log odds = -6.91

확률 비율: 0.001/0.05 = 0.02 → 긴 응답이 50배 불리
오즈 비율: 0.001/0.053 = 0.019 → 여전히 불리하지만...

핵심: 오즈 비율은 "안 일어날 확률"을 분모에 넣음으로써
확률이 극도로 낮은 영역(긴 응답)에서의 왜곡을 완화한다.
1에 가까운 확률 영역에서는 차이가 미미하지만,
0에 가까운 영역에서 오즈가 더 부드럽게 작동한다.

→ 완전한 해결은 아니지만, DPO보다 길이에 덜 민감하다.
→ SimPO가 "평균"으로 정규화했다면, ORPO는 "공간 자체"를 바꿨다.

장난감 예제

세 공간에서의 같은 응답 비교:

y_w (12토큰, 좋은 답):
  확률 공간:    P = 0.9^12 ≈ 0.28
  로그확률 공간: log P ≈ -1.26  (12 × -0.105)
  로그오즈 공간: 12 × log(0.9/0.1) = 12 × 2.20 = +26.3

y_l (4토큰, 나쁜 답):
  확률 공간:    P = 0.6^4 ≈ 0.13
  로그확률 공간: log P ≈ -2.04  (4 × -0.511)
  로그오즈 공간: 4 × log(0.6/0.4) = 4 × 0.405 = +1.62

마진 (y_w − y_l):
  로그확률: -1.26 − (-2.04) = +0.78  ← y_w 승리 (이번엔 운 좋게)
  로그오즈: +26.3 − (+1.62) = +24.7  ← y_w 압도적 승리

→ 로그오즈 공간에서는 "좋은 증거가 많이 쌓인" 긴 응답이 정당하게 평가된다.
→ 로그확률 공간에서는 이 차이가 길이에 의해 묻힌다.
토큰 수 점수 0 확률 P log P log odds ↑ 확률: 항상 ↓ log P: 항상 ↓ log odds: ↑ 가능

좋은 토큰이 추가될수록 로그오즈 공간에서는 점수가 상승할 수 있다. 확률/로그확률 공간에서는 토큰 수가 늘어나면 무조건 하락한다.

graph LR
    subgraph solutions["길이 편향 해결 두 방법"]
        direction LR
        SimPO["<b>SimPO</b><br/>평균 정규화<br/>r = (1/|y|) Σ log π"] ---|"공통: ref 제거"| ORPO["<b>ORPO</b><br/>공간 전환<br/>odds ratio 사용"]
    end

    style SimPO fill:#e3f2fd,stroke:#1565C0
    style ORPO fill:#e8f5e9,stroke:#2E7D32

시각화 계획

같은 역설이 검색에서도 → 부록 F: BM25와 로그오즈\

다음 장으로의 질문

SimPO는 길이를 평균으로 정규화하고, ORPO는 오즈 공간으로 바꿨다.
두 방법 모두 레퍼런스 모델을 빼버렸다.
잠깐, 레퍼런스 모델은 대체 왜 필요했던 건가?
빼도 되는 거였어?