Chapter 3: 로그확률 — 문장의 점수는 어떻게 매기나
의문
DPO 수식에
겁먹을 필요 없다. 이 식은 "모델
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으로 전체 시퀀스를 한 번에 처리.)
아래 그림이 이 과정을 요약한다:
이제 문장 전체의 확률을 구할 수 있다:
- 문장 확률 = 토큰별 조건부 확률의 곱 = 로그의 합:
- 마진을 결정하는 건 두 응답이 갈라지는 분기점 토큰
장난감 예제
질문: “대한민국의 수도는?”
y_w = [서울, 입니다]
-0.3 -0.2 → 합: -0.5y_l = [부산, 입니다]
-2.1 -0.3 → 합: -2.4Δ_θ = (-0.5) - (-2.4) = 1.9
→ “서울” vs “부산” 토큰 하나가 마진의 대부분을 결정
→ 공유 토큰(“입니다”)은 상쇄
시각화 계획
- 두 응답의 토큰별 로그확률 막대그래프 (공유 토큰 회색, 분기 토큰 빨강/파랑)
- 인터랙티브: 토큰 로그확률 슬라이더 → 마진 실시간 변화
다음 장으로의 질문
이해했다. 로그확률의 합이 곧 문장 점수다. 그런데… 음수들을 더한 것이면, 토큰이 많을수록 점점 마이너스 쪽으로 멀어지지 않나? 긴 정답이 짧은 오답보다 점수가 더 마이너스로 나오는 거 아닌가?