20. DDPO — 디퓨전의 정책 그래디언트

디노이징 MDP: 스텝 하나가 행동 하나

앞에서 막힌 곳은 이미지 전체의 로그확률 log⁡p(x0)\log p(x_0) 였다. 같은 이미지에 이르는 디노이징 경로가 무수히 많아서 구할 수 없었다. 그런데 정책 그래디언트 식을 다시 보면, 필요한 것은 「내가 뽑은 출력」의 로그확률이다. 디퓨전이 이미지 한 장을 뽑을 때 실제로 한 일은 수십 번의 작은 스텝이었다. 그렇다면 정책 그래디언트에 꼭 필요한 것은 이미지의 확률일까, 내가 실제로 밟은 경로의 확률일까?

역사: 한 번의 행동으로 보던 시도, 여러 번으로 본 DDPO

2023년 초 디퓨전 모델을 보상에 맞추려던 시도들은 생성 전체를 한 번의 행동으로 봤다. 구글 리서치의 한 연구진은 사람 피드백으로 학습한 점수로 생성 이미지마다 가중치(곱하는 수 — 신경망 파라미터가 아니다)를 매기고, 그 가중치를 곱한 디퓨전 학습 손실을 줄였다. 로봇 학습에서 온 보상 가중 회귀(RWR)를 한 번 돌린 셈이다. 문제는 디퓨전의 학습 손실이 이미지 로그확률 그 자체가 아니라 그 아래 한계(ELBO)라는 데 있다. 이 방법은 원래 목표를 어림으로만 좇는다.

같은 해 세르게이 레빈(Sergey Levine) 연구실의 케빈 블랙(Kevin Black)과 동료들은 「Training Diffusion Models with Reinforcement Learning」에서 이 점을 짚었다. 어림이 생긴 까닭은 마지막 이미지 x0x_0 만 보고 디노이징의 순서를 버렸기 때문이다. 디노이징을 여러 스텝에 걸친 결정 과정(MDP, Markov decision process — 상태를 보고 행동을 고르는 일이 이어지는 과정)으로 보면, 스텝마다의 로그확률을 어림 없이 쓸 수 있다. 그들이 붙인 이름이 DDPO다. 같은 보상으로 견준 실험에서 DDPO는 RWR 방식을 여러 번 되풀이한 것보다도 보상을 크게 올렸다.

스텝을 행동으로 보기

DDPO(Denoising Diffusion Policy Optimization)의 관점 전환은 단순하다. 이미지 하나를 한 번의 행동으로 보지 말고, 디노이징 TT스텝을 TT번의 행동으로 보라. 언어모델에서 응답을 토큰 TT개의 연쇄로 봤던 것과 같다.

RL 용어 언어모델 디퓨전 (DDPO)
상태 sts_t 프롬프트 + 지금까지의 토큰 프롬프트 + 현재 노이즈 낀 이미지 xtx_t + 시점 tt
행동 ata_t 다음 토큰 한 스텝 덜 노이즈 낀 이미지 xt−1x_{t-1}
정책 소프트맥스 분포 가우시안 N(μθ(xt,t), σt2I)\mathcal{N}(\mu_\theta(x_t, t),\ \sigma_t^2 I)
보상 응답이 끝난 뒤 한 번 이미지가 완성된 뒤(x0x_0) 한 번
xT 순수 노이즈 xt xt−1 x0 완성 … … 행동 하나 = 한 스텝 μθ + σtε 상태: 지금 그림 + 시점 + 프롬프트 보상 R(x0)은 끝에 한 번 중간 스텝에는 보상이 없다

역방향 한 스텝은 xt−1=μθ(xt,t)+σtεx_{t-1} = \mu_\theta(x_t, t) + \sigma_t \varepsilon 다(ε\varepsilon 은 앞에서처럼 표준 정규 노이즈). μθ\mu_\theta는 모델의 예측이라 그래디언트가 여기로 흐르고, σtε\sigma_t \varepsilon는 파라미터와 무관한 노이즈라 탐색을 제공한다. 그리고 각 스텝이 가우시안이므로 이 경로의 로그확률은 적분 없이 식 하나로(닫힌 형태로) 정확히 계산된다.

log⁡pθ(xt−1∣xt)=−∥xt−1−μθ(xt,t)∥22 σt2+(θ 와 무관한 상수)\log \textcolor{#1565c0}{p_\theta}(\textcolor{#1c9c60}{x_{t-1}} \mid \textcolor{#1c9c60}{x_t}) = -\frac{\lVert \textcolor{#1c9c60}{x_{t-1}} - \textcolor{#1565c0}{\mu_\theta}(\textcolor{#1c9c60}{x_t}, t) \rVert^2}{2\,\textcolor{#993600}{\sigma_t}^2} + (\theta \text{ 와 무관한 상수})
pθ디퓨전 모델의 한 디노이징 스텝 (정책)xt, xt−1스텝 앞의 이미지(상태), 스텝 뒤의 이미지(행동)μθ모델이 예측한 다음 이미지의 평균 (학습되는 판단)σt시점 t 의 스텝 노이즈 크기 (정해진 값) \small\begin{array}{ll} \textcolor{#1565c0}{p_\theta} & \text{디퓨전 모델의 한 디노이징 스텝 (정책)} \\ \textcolor{#1c9c60}{x_t},\ \textcolor{#1c9c60}{x_{t-1}} & \text{스텝 앞의 이미지(상태), 스텝 뒤의 이미지(행동)} \\ \textcolor{#1565c0}{\mu_\theta} & \text{모델이 예측한 다음 이미지의 평균 (학습되는 판단)} \\ \textcolor{#993600}{\sigma_t} & \text{시점 } t \text{ 의 스텝 노이즈 크기 (정해진 값)} \end{array}

이미지 전체의 확률은 몰라도, 내가 실제로 밟은 경로의 스텝마다 이 값을 안다. 정책 그래디언트에는 그것이면 충분하다.

∇θJ=E[R(x0)∑t=1T∇θlog⁡pθ(xt−1∣xt)]\nabla_\theta \textcolor{#d62728}{J} = \mathbb{E}\Big[\textcolor{#d9670b}{R}(\textcolor{#1c9c60}{x_0}) \sum_{t=1}^{\textcolor{#915a08}{T}} \nabla_\theta \log \textcolor{#1565c0}{p_\theta}(\textcolor{#1c9c60}{x_{t-1}} \mid \textcolor{#1c9c60}{x_t})\Big]
J기대 보상 (목적함수)R완성된 이미지 x0 의 점수pθ디퓨전 모델의 한 디노이징 스텝 (정책)T디노이징 스텝 수 (행동의 개수) \small\begin{array}{ll} \textcolor{#d62728}{J} & \text{기대 보상 (목적함수)} \\ \textcolor{#d9670b}{R} & \text{완성된 이미지 } x_0 \text{ 의 점수} \\ \textcolor{#1565c0}{p_\theta} & \text{디퓨전 모델의 한 디노이징 스텝 (정책)} \\ \textcolor{#915a08}{T} & \text{디노이징 스텝 수 (행동의 개수)} \end{array}

언어모델의 정책 그래디언트 식에서 "토큰"을 "디노이징 스텝"으로 바꿨을 뿐이다. 보상이 끝에 한 번 오는 것까지 똑같다.

같은 시작점 xT\textcolor{#1c9c60}{x_T}에서도 스텝마다 다른 노이즈가 섞이면 다른 경로, 다른 이미지, 다른 보상이 나온다. 보상이 좋은 경로에서 μθ\textcolor{#1565c0}{\mu_\theta}가 내린 판단은 강화되고, 나쁜 경로의 판단은 약화된다. 로봇 RL의 가우시안 정책 π(a∣s)=N(μθ(s),σ2)\pi(\textcolor{#1c9c60}{a} \mid \textcolor{#0093b8}{s}) = \mathcal{N}(\textcolor{#1565c0}{\mu_\theta}(\textcolor{#0093b8}{s}), \textcolor{#993600}{\sigma}^2)과 똑같은 구조다 — σ\textcolor{#993600}{\sigma}가 탐색, μθ\textcolor{#1565c0}{\mu_\theta}가 학습된 판단이다.

문제 3 — 같은 6g, 다른 빵집

두 빵집이 표시 무게 500g 식빵을 판다. 빵집 가의 식빵은 날마다 무게가 표준편차 10g으로 흔들리고, 빵집 나는 2g으로 흔들린다(둘 다 정규분포). 오늘 두 집에서 산 식빵이 모두 506g이었다. (가) 각 빵집에서 506g은 평균에서 표준편차 몇 개만큼 벗어난 값인가? (나) 정규분포 밀도로 견주면 506g이 나올 밀도는 500g이 나올 밀도의 몇 분의 1인가? (다) 「오늘 반죽 기계가 바뀌었나」 의심할 만한 곳은 어느 빵집인가?

김민준 (자신만만)
김민준
둘 다 6g 더 나갔으니 똑같이 수상하죠.
선생님 (질문)
선생님
민준 학생, 나 빵집은 평소에 2g 안팎으로만 흔들리는 집이에요. 거기서 6g은 평소 흔들림의 몇 배죠? 가 빵집에서는요?
김민준 (난처함)
김민준
나는 6/2=36/2 = 3 개, 가는 6/10=0.66/10 = 0.6 개만큼이네요. 같은 6g이 아니었어요.
이서연 (평상)
이서연
(나)는 밀도가 e−(표준편차 개수)2/2e^{-(\text{표준편차 개수})^2/2} 배로 줄어드니까, 가는 e−0.18≈0.84e^{-0.18} \approx 0.84, 나는 e−4.5≈0.011e^{-4.5} \approx 0.011.
김민준 (평상)
김민준
exp(-0.6**2/2), exp(-3**2/2) 돌려 봐도 같아요.
김민준 (놀람)
김민준
나 빵집에서는 75배쯤 더 드문 일이에요. 의심할 곳은 나 빵집이네요. 늘 정확하던 집에서 벗어난 6g이 훨씬 큰 신호예요.

정리 (가) 가: 0.6개, 나: 3개. (나) 가: e−0.18≈0.84e^{-0.18} \approx 0.84, 나: e−4.5≈0.011e^{-4.5} \approx 0.011. (다) 나. 같은 편차도 흔들림(σ\sigma)이 작은 곳에서는 훨씬 드문 일이고, 그만큼 「무언가 바뀌었다」는 신호가 크다.

문제 4 — 스텝 로그확률의 그래디언트

한 디노이징 스텝에서 xt−1=μθ+σε\textcolor{#1c9c60}{x_{t-1}} = \textcolor{#1565c0}{\mu_\theta} + \textcolor{#993600}{\sigma}\textcolor{#b8860b}{\varepsilon} 로 샘플했다. ∂log⁡p/∂μθ\partial \log \textcolor{#1565c0}{p} / \partial \textcolor{#1565c0}{\mu_\theta} 를 ε\textcolor{#b8860b}{\varepsilon}과 σ\textcolor{#993600}{\sigma}로 쓰고, ε=0.5\textcolor{#b8860b}{\varepsilon} = 0.5일 때 σ=0.5\textcolor{#993600}{\sigma} = 0.5와 σ=0.1\textcolor{#993600}{\sigma} = 0.1에서 각각 값을 구하시오.

선생님 (질문)
선생님
노이즈 σ\textcolor{#993600}{\sigma}를 0.5에서 0.1로 줄이면, 샘플 하나의 그래디언트는 커질까요 작아질까요?
김민준 (자신만만)
김민준
빵집 문제만 보면 커질 것 같은데, 여기는 달라요. 벗어난 거리 σε\textcolor{#993600}{\sigma}\textcolor{#b8860b}{\varepsilon} 자체가 σ\textcolor{#993600}{\sigma} 에 비례해서 같이 줄잖아요. 표준편차 몇 개만큼 벗어났는지는 ε\textcolor{#b8860b}{\varepsilon} 그대로니까 그래디언트도 그대로예요.
이서연 (평상)
이서연
식으로 보자. log⁡p=−(x−μ)2/(2σ2)+c\log \textcolor{#1565c0}{p} = -(\textcolor{#1c9c60}{x} - \textcolor{#1565c0}{\mu})^2 / (2\textcolor{#993600}{\sigma}^2) + c 니까 μ\textcolor{#1565c0}{\mu}로 미분하면 (x−μ)/σ2=σε/σ2=ε/σ(\textcolor{#1c9c60}{x} - \textcolor{#1565c0}{\mu})/\textcolor{#993600}{\sigma}^2 = \textcolor{#993600}{\sigma} \textcolor{#b8860b}{\varepsilon} / \textcolor{#993600}{\sigma}^2 = \textcolor{#b8860b}{\varepsilon} / \textcolor{#993600}{\sigma}.
김민준 (놀람)
김민준
ε=0.5\textcolor{#b8860b}{\varepsilon}=0.5면 σ=0.5\textcolor{#993600}{\sigma}=0.5에서 1, σ=0.1\textcolor{#993600}{\sigma}=0.1에서 5… 커지네요.
선생님 (질문)
선생님
벗어난 거리는 다섯 배로 줄었는데 왜 커졌을까요?
이서연 (평상)
이서연
분모가 σ2\textcolor{#993600}{\sigma}^2 라서 스물다섯 배 줄었고, 분자는 다섯 배만 줄었어요. 분산이 작으면 같은 편차도 "드문 일"이라, 작은 σ\textcolor{#993600}{\sigma}에서 우연히 벗어난 방향이 로그확률에 크게 반영돼요.
김민준 (평상)
김민준
샘플은 덜 흔들려도 그걸 설명하는 기울기는 더 예민해지는 거네요. 빵집 문제의 「몇 개만큼 벗어났나」를 한 번 더 σ\textcolor{#993600}{\sigma}로 나눈 셈이에요. 오차 범위가 좁은 실험일수록 조교님이 작은 편차도 크게 감점하던 거랑 같아요.
선생님 (평상)
선생님
그래요. 디노이징 후반 스텝에서 같은 오차에 벌점이 훨씬 커지는 것과 같은 이유예요.

정리 ∂log⁡p/∂μθ=ε/σ\partial \log \textcolor{#1565c0}{p} / \partial \textcolor{#1565c0}{\mu_\theta} = \textcolor{#b8860b}{\varepsilon}/\textcolor{#993600}{\sigma}. σ=0.5\textcolor{#993600}{\sigma} = 0.5이면 1, σ=0.1\textcolor{#993600}{\sigma} = 0.1이면 5. 벗어난 거리는 σ\textcolor{#993600}{\sigma} 에 비례해 줄지만 분모의 σ2\textcolor{#993600}{\sigma}^2 가 더 빨리 줄어, 노이즈가 작을수록 샘플 하나의 그래디언트가 커지고 흔들림도 커진다.

문제 5 — 노이즈가 없으면?

결정론적 샘플러(DDIM — 노이즈를 섞지 않고 걷도록 고친 샘플러. 노이즈를 얼마나 섞을지 정하는 손잡이 η를 0으로 둔다)로 생성한 경로에 DDPO를 쓸 수 있는가? 문제 4의 식으로 설명하시오.

김민준 (평상)
김민준
σ=0\textcolor{#993600}{\sigma}=0이면 ε/σ\textcolor{#b8860b}{\varepsilon}/\textcolor{#993600}{\sigma}가 무한대라 계산이 안 되네요.
김민준 (자신만만)
김민준
그럼 σ=10−4\textcolor{#993600}{\sigma}=10^{-4} 같은 아주 작은 값을 넣고 계산하면 되잖아요.
선생님 (질문)
선생님
민준 학생, 문제 4에서 σ\textcolor{#993600}{\sigma}를 줄이면 그래디언트가 어떻게 됐죠?
김민준 (당황)
김민준
ε/σ\textcolor{#b8860b}{\varepsilon}/\textcolor{#993600}{\sigma}라서… 10−410^{-4}이면 ε\textcolor{#b8860b}{\varepsilon}의 만 배예요. 샘플마다 엄청나게 튀겠네요.
이서연 (평상)
이서연
더 근본적인 문제도 있어. η=0이면 경로에 실제로 노이즈가 섞이지 않았으니 ε\textcolor{#b8860b}{\varepsilon}가 없어. σ\textcolor{#993600}{\sigma}를 작게 "가정"해도 그 경로는 그 분포에서 뽑힌 게 아니야. 분포가 한 점에 몰려 있으니 확률밀도 자체가 정의되지 않고.
선생님 (평상)
선생님
그래요. 탐색은요?
김민준 (평상)
김민준
처음 xT\textcolor{#1c9c60}{x_T} 말고는 무작위성이 없으니, 같은 xT\textcolor{#1c9c60}{x_T}에서는 늘 같은 이미지예요. 스텝 단위로 이 경로가 저 경로보다 나았다는 비교를 못 해요.
김민준 (평상)
김민준
실험 조건을 하나도 안 바꿔 보고 민감도 분석을 하겠다는 셈이네요. 조교님이 변화를 줘봐야 뭐가 중요한지 안다고 했는데.
선생님 (평상)
선생님
맞아요. 무작위성 없는 미분방정식으로 샘플링하는 모델은 모두 바로 이 상황이에요. 그래서 같은 분포를 주면서 매 순간 노이즈가 섞이는 방정식으로 바꿔, 노이즈를 다시 넣는 방법이 나왔어요.

정리 쓸 수 없다. σ=0\textcolor{#993600}{\sigma} = 0이면 스텝 분포가 한 점이라 로그확률이 정의되지 않고(ε/σ\textcolor{#b8860b}{\varepsilon}/\textcolor{#993600}{\sigma}가 한없이 커짐), 스텝 단위의 탐색도 사라진다. 결정론적 샘플러에 RL을 쓰려면 같은 분포를 주면서 노이즈가 섞이는 샘플링으로 바꿔 노이즈를 다시 넣어야 한다.