Chapter 3: 로그확률 — 문장의 점수는 어떻게 매기나

의문

DPO 수식에 logπθ(yx)\log \pi_\theta(y \mid x)가 등장한다. 이 식의 의미는 무엇인가?

겁먹을 필요 없다. 이 식은 "모델 πθ\pi_\theta가 프롬프트 xx를 받았을 때, 응답 yy 전체를 만들어낼 확률"의 로그값이다. 계산 결과는 그냥 **숫자 하나(스칼라)**다. 예를 들어 −0.5, −2.4 같은 값이다. 이 장에서 보겠지만, 모델에 프롬프트와 응답을 한 번 통과시키면 바로 얻을 수 있는 값이다.

DPO 학습에서는 데이터셋의 모든 (프롬프트, 선호 응답, 비선호 응답) 쌍마다 이 숫자를 한 번씩 계산한다. 가령 데이터가 10,000쌍이면 10,000번에 걸쳐 계산하면서 그 값들을 모아 손실을 구한 뒤 모델을 갱신해나간다. 이것이 전부다.

그러면 이 숫자를 어떻게 구하는지 보자.

핵심: 자기회귀 분해 — 실제로 일어나는 두 단계

LLM이 토큰을 "하나씩 생성한다"는 말은, 실제로는 매 스텝마다 두 단계를 거친다는 뜻이다.

[1단계: 확률표 얻기]

입력: 프롬프트 + 지금까지 생성된 토큰들
출력: 다음에 올 수 있는 모든 토큰의 확률 분포 (= 확률표)

이 작업을 수행하는 것이 트랜스포머 모델이다.
어휘 크기가 128,000이면, 128,000개 토큰 각각에 확률이 할당된다.

예시 — 프롬프트: “대한민국의 수도는” 다음 토큰 확률표:

  • “서울” → 0.74
  • “부산” → 0.03
  • “대전” → 0.02
  • “인천” → 0.01
  • (128,000개 항목, 합 = 1)

[2단계: 샘플링]

확률표에서 하나의 토큰을 고른다.
여기서 temperature, top-k, top-p, min-p 같은 파라미터가 작동한다.

  • temperature = 1.0: 확률표 그대로 사용
  • temperature < 1.0: 높은 확률을 더 높이고, 낮은 확률을 더 낮춤 (보수적)
  • temperature > 1.0: 확률을 평탄화 (다양성 증가)
  • top-k = 50: 상위 50개 토큰만 남기고 나머지 확률을 0으로
  • min-p = 0.05: 최대 확률의 5% 미만인 토큰을 제거

이 파라미터들은 추론(inference) 시에만 의미가 있다.
→ 실제 서비스에서 모델이 “다음 단어를 고를 때” 사용하는 것.

강화학습에서는 2단계(샘플링)가 필요 없다.

DPO/GRPO 학습 시에는 이미 응답이 주어져 있다.
(데이터셋에 y_w = “서울입니다”, y_l = "부산입니다"가 적혀 있다.)

필요한 것은 각 토큰의 확률을 "조회"하는 것뿐이다:

  • 1단계만 실행: 프롬프트를 모델에 넣어서 확률표를 얻는다.
  • 2단계 대신: 데이터셋의 토큰이 확률표 상 어디에 위치하는지 찾는다. → 그 위치의 확률값을 가져온다.

"서울"의 로그확률 = log(0.74) = -0.30
"부산"의 로그확률 = log(0.03) = -3.51

→ 샘플링을 할 필요가 없다. 이미 답을 알고 있으니까.
→ 모델에게 "이 토큰이 나올 확률이 얼마였냐?"만 묻는 것이다.

이 구분이 중요한 이유:

추론 시: 1단계(확률표) → 2단계(샘플링) → 토큰 출력
학습 시: 1단계(확률표) → 데이터셋 토큰의 확률 조회 → 손실 계산

→ temperature, top-k 같은 파라미터는 학습에 영향을 주지 않는다.
(데이터셋 생성 시에는 영향을 준다 — 다양한 응답을 만들기 위해
높은 temperature를 쓸 수 있다. 하지만 학습 루프 안에서는 무관.)

→ 이것이 오프라인 DPO가 효율적인 이유 중 하나다.
한 번의 순전파(forward pass)로 모든 토큰의 확률을 동시에 얻을 수 있다.
(자기회귀 생성처럼 토큰 하나씩 순차적으로 할 필요 없이,
teacher forcing으로 전체 시퀀스를 한 번에 처리.)

아래 그림이 이 과정을 요약한다:

두 응답의 토큰별 로그확률 비교 로그확률 0 -1 -2 -3 -0.30 서울 -0.20 입니다 -2.10 부산 -0.30 입니다 y_w (선호) 합: -0.50 y_l (비선호) 합: -2.40 ← 분기 토큰("서울" vs "부산")이 마진의 대부분을 결정 →

이제 문장 전체의 확률을 구할 수 있다:

장난감 예제

질문: “대한민국의 수도는?”

y_w = [서울, 입니다]
-0.3 -0.2 → 합: -0.5

y_l = [부산, 입니다]
-2.1 -0.3 → 합: -2.4

Δ_θ = (-0.5) - (-2.4) = 1.9

→ “서울” vs “부산” 토큰 하나가 마진의 대부분을 결정
→ 공유 토큰(“입니다”)은 상쇄

시각화 계획

다음 장으로의 질문

이해했다. 로그확률의 합이 곧 문장 점수다. 그런데… 음수들을 더한 것이면, 토큰이 많을수록 점점 마이너스 쪽으로 멀어지지 않나? 긴 정답이 짧은 오답보다 점수가 더 마이너스로 나오는 거 아닌가?