— 지금까지의 도구(정책 그래디언트, DPO, GRPO)는 모두 출력의 로그확률을 계산할 수 있는 텍스트 위에서 자랐다. 그런데 강화학습이 더 절실한 곳은 출력이 연속값이고 좋은 답이 여러 갈래인 곳이다 — 그림과 영상의 픽셀, 로봇 팔의 관절 각도, 자동차의 조향각. 좋은 출력이 여러 봉우리로 퍼져 있으면 평균 하나를 내는 모델은 어느 봉우리에도 없는 값을 낸다. 노이즈에서 출발해 출력을 조금씩 만들어 내는 디퓨전 모델은 여러 번 뽑으면 서로 다른 봉우리에 닿는다. 이 파트의 물음은 하나다: 앞의 도구들을 디퓨전 모델 위에서 쓰려면 무엇이 달라지는가?
Chapter 19: 디퓨전에서 DPO를 쓰려면 — 로그확률의 벽
의문
이미지 생성 서비스에도 「같은 프롬프트로 만든 두 그림 가운데 어느 쪽이 나은가」를 고른 기록이 수십만 건씩 쌓인다. 이 기록으로 디퓨전 모델을 DPO로 다듬으려면 각 그림의 로그확률 logπ(y∣x)가 필요하다(π는 정책, 곧 답을 내는 모델이다). 디퓨전 모델에서 이 값을 구할 수 있는가?
디퓨전의 로그확률: 이미지는 못 재도 한 스텝은 잰다
DPO는 선호 응답의 logπ(yw∣x)와 비선호 응답의 logπ(yl∣x)를 레퍼런스(학습 전 모델을 얼려 둔 기준)와 비교해 마진을 벌린다. LLM에서는 이 값을 정확히 구할 수 있었다 — 토큰별 조건부 확률의 곱(= 로그의 합)이니까.
디퓨전 모델에서는 간단하지 않다.
역사: 열역학에서 온 생성 모델
2015년의 고민은 생성 모델의 오래된 맞바꿈이었다. 데이터를 잘 흉내 낼 만큼 유연한 모델은 확률을 계산하기 어렵고, 확률을 계산하기 쉬운 모델은 표현할 수 있는 것이 좁았다. 스탠퍼드의 야샤 솔-딕스타인(Jascha Sohl-Dickstein)과 동료들은 비평형 통계물리에서 빌린 생각으로 이 맞바꿈을 피해 갔다. 데이터의 구조를 아주 조금씩, 천천히 노이즈로 무너뜨리는 과정을 정해 두고, 그 과정을 거꾸로 밟아 구조를 되살리는 법을 학습한다. 한 걸음이 충분히 작으면 거꾸로 밟는 한 걸음도 정방향과 같은 꼴로 적을 수 있다는 근거로 윌리엄 펠러(William Feller)의 1949년 확산 과정 논문을 들었다. 대가는 걸음 수였다. 이미지 실험은 1000스텝을 밟았다. 이 방법으로 손글씨 숫자(MNIST)와 작은 사진(CIFAR-10)의 로그확률 하한을 계산해 보였지만, 그림의 품질로 눈길을 끌지는 못했다.
5년 뒤 버클리의 조너선 호(Jonathan Ho)·아제이 자인(Ajay Jain)·피터 아빌(Pieter Abbeel)은 DDPM(Denoising Diffusion Probabilistic Models, 노이즈를 걷어 내는 확률적 디퓨전 모델) 논문 머리에 「디퓨전 모델이 품질 높은 샘플을 만들 수 있음을 보인 예는 아직 없다」고 적었다. 그리고 1000스텝은 그대로 둔 채 학습 목표를 바꿔, CIFAR-10에서 그때까지 가장 좋은 FID(만든 그림과 실제 그림이 얼마나 비슷한 분포인지 재는 점수, 낮을수록 좋다) 3.17을 얻었다. 무엇을 바꿨는지는 이 절의 끝에서 다시 본다.
디퓨전 논문들은 그림을 x로 적는 관습이 있어 이 장도 따른다. 앞에서 프롬프트를 x, 응답을 y로 적던 것과 글자만 다르다. 이 장의 x0은 모델이 내놓은 그림, 곧 응답의 자리이고, xt는 스텝 t에서 노이즈가 섞인 그림이다.
이미지 한 장의 확률
계산
LLM (자기회귀)
P(y)=P(y1)P(y2∣y1)P(y3∣y1:2)⋯
각 항을 모델이 직접 출력한다. 곱하면 끝
디퓨전
p(x0)=∫p(x0,x1,…,xT)dx1⋯dxT
모든 중간 상태에 대해 적분해야 한다. 차원이 수만–수십만이라 식 하나로 정리해 풀 수 없다
차이의 핵심은 같은 이미지 x0에 도달하는 경로가 무수히 많다는 것이다. LLM에서는 문장 하나에 경로(토큰 순서)가 하나뿐이지만, 디퓨전에서는 서로 다른 노이즈 궤적들이 같은 그림으로 모인다.
완벽한 전체 적분은 어렵다. 하지만 한 스텝씩 뜯어보면 이야기가 달라진다. 어차피 현실의 이미지 모델은 수십 개의 이산 스텝으로 나눈 샘플러(노이즈에서 그림까지 가는 길을 몇 걸음으로 나눠 밟는 계산법. 미분방정식을 한 걸음씩 가장 단순하게 푸는 오일러(Euler) 방법, 같은 학습으로 걸음 수를 크게 줄인 DDIM(Denoising Diffusion Implicit Models) 등)를 쓰니, 그 스텝 하나하나를 보자.
한 스텝은 가우시안이다
순방향 과정은 원래 가우시안이다 — 매 스텝 가우시안 노이즈를 더하니까: q(xt∣xt−1)=N(1−βtxt−1,βtI)(여기서 βt는 스텝 t 에서 더하는 노이즈의 양을 정하는 스케줄 값이다 — DPO의 KL 강도 β(레퍼런스 쪽으로 당기는 목줄의 강도) 와는 글자만 같은 다른 기호다). 그런데 수학적으로 중요한 사실이 있다: 스텝이 충분히 작으면, 역방향 과정도 가우시안에 가깝다(Feller, 1949). 아주 작은 노이즈를 더했다면, 그것을 되돌리는 분포도 가우시안으로 잘 근사된다.
θ는 모델의 파라미터, μθ의 μ는 평균, σt의 σ는 표준편차를 부르는 관례적인 글자다. 모델은 지금 그림 xt를 보고 한 스텝 전 그림이 있을 법한 자리 μθ를 찍고, 그 둘레에 폭 σt짜리 종을 씌운다. 실제 도착점 xt−1이 종의 어디에 떨어지느냐가 그 스텝의 확률이다.
실제로는 스텝이 꽤 듬성듬성해도 어느 정도 통한다. DDPM의 1000스텝에서 DDIM의 50스텝, 최근의 4–8스텝까지 줄여도 이미지가 나오는 이유다.
각 스텝이 가우시안이면 로그확률을 적분 없이 식 하나로(닫힌 형태로) 구할 수 있다. 필요한 것은 평균과 분산뿐이다.
분산이 작은 후반 스텝에서는 같은 오차도 훨씬 큰 벌점을 받는다. 후반일수록 모델의 예측이 정확해야 한다는 뜻이다.
전체 경로의 로그확률은 스텝별 로그확률의 합이다: logpθ(x0:T)=∑tlogpθ(xt−1∣xt). LLM의 "토큰별 로그확률의 합"이 "타임스텝별 로그확률의 합"으로 바뀌었을 뿐이다. 다만 이것은 한 경로의 확률이고, 이미지 x0의 확률 p(x0)는 여전히 모든 경로의 적분이다. 그래서 디퓨전에서는 정확한 값 대신 하한 (증거 하한 / evidence lower bound, ELBO) — 로그확률보다 항상 작거나 같은, 계산할 수 있는 값 — 을 쓴다. ELBO는 머리글자를 이은 이름이고 「엘보」라고 읽는다. 「증거(evidence)」는 데이터의 로그확률 logp(x0)를 부르는 이름이라, 「증거의 아래쪽 경계」라는 뜻이다.
ML에서: DDPM은 이 벌점의 무게를 일부러 버렸다
위 식대로라면 그림의 로그확률(의 하한)은 스텝마다 다른 무게를 단 오차의 합이고, 후반 스텝일수록 무게가 크다. 앞의 역사에서 DDPM이 바꾼 학습 목표가 바로 이 무게다. 호와 동료들은 모델이 평균 μθ를 직접 내는 대신, 그림에 섞인 노이즈 ε을 맞히게 했다. 그리고 그 맞히기 오차를 스텝마다 똑같은 무게로 더한 단순한 손실로 학습했다. 논문의 설명으로는 이렇게 하면 노이즈가 아주 적은 스텝의 몫이 낮아져, 네트워크가 노이즈가 많은 더 어려운 스텝에 힘을 쏟는다. 정확한 로그확률을 따르는 것보다 그림이 더 좋았다. 디퓨전용 DPO 손실이 「타임스텝 가중치」를 상수에 흡수해 쓰는 것도 이 전통을 잇는다.
문제 1 — 내일 기온 예보, 어느 쪽이 더 빗나갔나
날씨 앱이 같은 날의 최고 기온을 두 번 예보했다. 사흘 전 예보는 「20도, 오차 폭 3도」, 전날 예보는 「24.5도, 오차 폭 1도」였다(오차 폭은 그 예보가 보통 이만큼 빗나간다는 표준편차). 실제 최고 기온은 23도였다. 빗나간 정도를 벌점 (빗나간도수)2/(2×오차폭2)으로 매기자. (가) 두 예보의 벌점은? (나) 어느 예보가 더 크게 빗나갔다고 봐야 하는가?
김민준
사흘 전 예보는 3도, 전날 예보는 1.5도 틀렸으니까 사흘 전 예보가 두 배 더 빗나갔죠.
선생님
민준 학생, 사흘 전 예보는 스스로 「3도쯤은 틀릴 수 있다」고 했어요. 전날 예보는 얼마까지 틀릴 수 있다고 했죠?
김민준
1도요… 그럼 1.5도는 자기가 말한 폭을 넘은 거네요. 식에 넣으면 사흘 전은 9 ÷ 18 = 0.5, 전날은 2.25 ÷ 2 = 1.125. 전날 예보의 벌점이 두 배가 넘어요.
이서연
빗나간 양을 그대로 견주면 안 되고, 그 예보가 말한 폭으로 재서 견줘야 하는 거네. 폭이 좁다고 장담한 예보일수록 같은 실수가 비싸.
정리 (가) 사흘 전 0.5, 전날 1.125. (나) 전날 예보. 빗나간 양은 절반이지만 스스로 말한 폭이 3분의 1이라, 폭으로 잰 빗나감이 더 크다.
문제 2 — 같은 오차, 다른 벌점
디노이징 한 스텝의 오차가 ∥xt−1−μθ∥2=0.04로 같을 때, 초반 스텝(σt=1.0)과 후반 스텝(σt=0.1)의 로그확률(상수 제외)을 각각 구하시오. 어느 쪽 벌점이 몇 배 큰가?
거의 다 그린 그림에서 틀리는 게 훨씬 비싸다는 거예요. 후반엔 원래 불확실성이 작으니까 같은 오차도 더 “있을 법하지 않은” 사건이 되고요.
김민준
아까 날씨 예보랑 같네요. 후반 스텝이 「폭 1도」라고 장담한 전날 예보예요. 다만 여기선 폭이 10분의 1이고, 제곱으로 들어가니까 100배고요.
정리 초반 −0.02, 후반 −2. 분산이 1/100이라 벌점이 100배다. 디노이징 후반의 작은 실수가 로그확률에 훨씬 크게 반영된다.
문제 3 — 주사위 두 개로 7 만들기
주사위 두 개를 차례로 던진다. (가) 첫째가 1, 둘째가 6이 나올 확률은? (나) 두 눈의 합이 7일 확률은? (다) (가)의 값을 (나)의 답이라고 말하면 몇 배 작게 말한 셈인가?
김민준
합이 7이려면 1 다음에 6이 나오면 되니까 (가)랑 (나)는 똑같이 1/36이죠.
선생님
민준 학생, 첫째 주사위가 2가 나와도 합이 7이 될 수 있나요?
김민준
2 다음 5… 3 다음 4도 있네요. (1, 6)부터 (6, 1)까지 여섯 길이에요. 그럼 (나)는 6/36 = 1/6.
이서연
길 하나의 확률은 「합이 7」의 여섯 조각 가운데 하나일 뿐이네. 하나만 보면 여섯 배 작게 말하게 되고.
정리 (가) 1/36. (나) 6/36 = 1/6 — 합이 7이 되는 길 여섯의 확률을 모두 더한다. (다) 6배. 결과 하나의 확률은 그 결과에 이르는 모든 길의 확률을 더한 것이다.
문제 4 — 경로의 확률 vs 이미지의 확률
두 스텝짜리 장난감 디퓨전을 생각하자. 순수 노이즈 x2에서 출발하면 중간 상태 x1은 u 또는 v가 각각 0.5의 확률로 나온다. 마지막 그림 x0은 u에서는 고양이 그림 A가 0.8, 개 그림 B가 0.2의 확률로, v에서는 A가 0.3, B가 0.7의 확률로 나온다. (가) 경로 x2 → u → A의 로그확률(스텝별 로그확률의 합)은? (나) 그림 A의 로그확률 logp(x0=A)는? (다) 실제 이미지 모델에서 (나)를 같은 방법으로 구하려면 무엇을 모두 더해야 하는가? 그것이 가능한가?
김민준
(가)는 log 0.5 + log 0.8 ≈ −0.916이요. (나)는 아까 주사위처럼 A로 가는 길을 다 더하면 0.4 + 0.15 = 0.55, log 0.55 ≈ −0.598. 경로 하나는 그림의 확률을 작게 말하네요.
선생님
좋아요. 그럼 실제 이미지 모델에서는요?
김민준
똑같이 하면 되죠. 경로를 몇 개 뽑아서 확률을 더하면 그림의 확률이 나와요.
이서연
장난감에서는 x₁이 u, v 둘뿐이라 다 셀 수 있었어. 그런데 진짜 디퓨전은 x0가 같아도 거기까지 온 x1,…,xT가 무한히 많아.
선생님
그럼 이미지의 확률은 경로 확률들과 어떤 관계죠?
이서연
모든 경로에 대해 적분한 거예요. p(x0)=∫p(x0:T)dx1:T. 경로 하나의 확률은 그 적분의 한 조각일 뿐이고요.
선생님
민준 학생, x₁ 하나가 수만 차원의 연속값이면, 경로를 몇 개 뽑아야 그 적분을 다 덮을까요?
김민준
주사위는 여섯 길이었는데 여기는 셀 수가 없네요. 몇 개 더해서는 어림도 안 되겠어요.
선생님
그래요. 민준 학생은 장난감에서 셀 수 있던 합을 실제 모델에서도 셀 수 있다고 봤어요. 그래서 디퓨전에서는 정확한 값 대신 하한, ELBO를 써요.
김민준
주사위랑 구조는 같은데, 주사위 눈이 수만 차원의 실수가 된 거네요.
정리 (가) log0.5+log0.8≈−0.916. (나) A로 가는 경로 둘의 확률을 더해 0.4+0.15=0.55, log0.55≈−0.598. 경로 하나의 로그확률은 그림의 로그확률이 아니다. (다) 중간 상태 x1,…,xT의 모든 경로를 더해야(적분해야) 하는데, 수만 차원의 연속값이라 셀 수 없다. 그래서 ELBO(하한)를 쓴다.