15장 — 브라운 운동, 랑주뱅, 포커–플랑크

샘플러의 온도: 스텝 크기와 노이즈의 비

이제 이 장 첫머리의 물음으로 돌아가자. 경사하강에 더하는 노이즈는 왜 스텝 크기 η가 아니라 √(2η)여야 했을까? 그리고 스텝 크기와 노이즈를 따로 조절하는 샘플러는 저마다 어떤 분포를 뽑고 있는 것일까?

스텝 크기 a와 노이즈 σ로 온도 읽기

SGLD처럼 ζ = 1, 스텝 크기 η, 노이즈 √(2η)로 두면 ζD = 1이라 샘플러는 e^(−U), 곧 U = −ln π로 정한 목표 분포 π를 뽑는다. 노이즈에 η를 곱하면 ζD = η/2라서 샘플러는 e^(−U/(η/2))를 뽑는데, U = θ²/2이면 이것은 분산이 η/2인 정규분포다. η = 0.01에서 0.005, 이 장 첫머리에서 체인 4000개로 잰 분산 0.0051이 바로 이 분산 η/2 = 0.005다. 더 일반적으로, 어떤 알고리즘이 한 스텝에 x ← x − a∇U + σz로 움직인다고 하자. 학습률 η 대신 a로 쓴 것은 SGLD에 한정하지 않고 아무 알고리즘의 스텝 크기를 가리키려는 것이고, σ는 노이즈의 표준편차다. 이 한 스텝을 랑주뱅 방정식의 한 스텝 x ← x − (Δt/ζ)∇U + √(2DΔt)z와 맞대면 Δt/ζ = a, 2DΔt = σ²이다. 둘째 식을 첫째 식으로 나누면 2ζD = σ²/a, 곧 ζD = σ²/(2a)이고, 끌려가는 흐름과 퍼지는 흐름이 상쇄되는 분포 e^(−U/(ζD))에서 온도 자리에 오는 것이 ζD였으므로 이 알고리즘은 온도 kT = σ²/(2a)의 볼츠만 분포를 향해 간다. 이 σ²/(2a)를 샘플러의 온도 (한 스텝에 x ← x − a∇U + σz로 움직이는 알고리즘이 향하는 볼츠만 분포의 온도)라 부르자. 스텝 크기와 노이즈의 크기를 따로 조절하는 샘플러는 모두 이 식으로 자기가 몇 도에서 샘플을 뽑는지 읽을 수 있다.

직접 움직여 보기샘플러의 온도 σ²/(2a)새 창에서 열기 ↗

ML에서: SGLD의 「알맞은 양의 노이즈」

웰링과 테(2011)의 SGLD는 사후분포의 −ln을 위치에너지로 두고 미니배치로 그 그래디언트를 어림한다.

θn+1=θn−η ∇U~(θn)+2η  zn,U~(θ)=−ln⁡p(θ)−N∣B∣∑i∈Bln⁡p(xi∣θ)\textcolor{#1b9e77}{\theta}_{n+1} = \textcolor{#1b9e77}{\theta}_{n} - \textcolor{#006600}{\eta}\,\nabla \tilde{\textcolor{#a6761d}{U}}(\textcolor{#1b9e77}{\theta}_{n}) + \sqrt{2\textcolor{#006600}{\eta}}\;\textcolor{#1f6066}{\mathbf{z}}_n, \qquad \tilde{\textcolor{#a6761d}{U}}(\textcolor{#1b9e77}{\theta}) = -\ln \textcolor{#e377c2}{p}(\textcolor{#1b9e77}{\theta}) - \frac{\textcolor{#1f77b4}{N}}{|\textcolor{#6d45e6}{\mathcal{B}}|}\sum_{i \in \textcolor{#6d45e6}{\mathcal{B}}} \ln \textcolor{#e377c2}{p}(\textcolor{#1b9e77}{x}_i \mid \textcolor{#1b9e77}{\theta})
θ모델 파라미터 (움직이는 입자)U~미니배치로 어림한 위치에너지 = −ln 사후분포 (상수 제외)p(θ), p(xi∣θ)사전분포, 데이터 하나의 우도N, B전체 데이터 수, 미니배치 (크기 |B|)η스텝 크기 (논문의 ϵt/2)xii번째 데이터zn표준정규 노이즈 (스텝마다 새로 뽑음)\begin{array}{ll} \textcolor{#1b9e77}{\theta} & \text{모델 파라미터 (움직이는 입자)} \\ \tilde{\textcolor{#a6761d}{U}} & \text{미니배치로 어림한 위치에너지 = −ln 사후분포 (상수 제외)} \\ \textcolor{#e377c2}{p}(\textcolor{#1b9e77}{\theta}),\ \textcolor{#e377c2}{p}(\textcolor{#1b9e77}{x}_i \mid \textcolor{#1b9e77}{\theta}) & \text{사전분포, 데이터 하나의 우도} \\ \textcolor{#1f77b4}{N},\ \textcolor{#6d45e6}{\mathcal{B}} & \text{전체 데이터 수, 미니배치 (크기 |B|)} \\ \textcolor{#006600}{\eta} & \text{스텝 크기 (논문의 } \epsilon_t/2\text{)} \\ \textcolor{#1b9e77}{x}_i & \text{i번째 데이터} \\ \textcolor{#1f6066}{\mathbf{z}}_n & \text{표준정규 노이즈 (스텝마다 새로 뽑음)} \end{array}

논문은 그래디언트 항에 ε/2를, 노이즈의 분산에 ε를 두었는데, 이것은 스텝 크기 η = ε/2에 노이즈 √(2η)를 붙인 것과 같아서 온도 kT = σ²/(2a) = 2η/(2η) = 1인 랑주뱅 방정식이다. 그런데 미니배치로 어림한 그래디언트에는 이미 오차가 섞여 있다. 그렇다면 노이즈를 따로 넣지 않은 SGD(stochastic gradient descent, 미니배치로 어림한 그래디언트를 따라가는 확률적 경사하강)도 몇 도에선가 샘플을 뽑는 샘플러라고 할 수 있을까? 이 물음은 아래 문제 13에서 따져 보자. 웰링과 테가 말한 「알맞은 양의 노이즈」는 스텝 크기 η에 대해 분산이 2η인 노이즈, 곧 샘플러의 온도 σ²/(2a)가 1이 되는 노이즈다.

ML에서: 에너지 기반 모델의 샘플러는 몇 도에서 뽑는가

에너지 기반 모델(energy-based model, EBM)을 학습하려면 모델 분포 e^(−E_θ(x))/Z에서 샘플을 뽑아 모델 분포에서 뽑은 샘플로 내는 평균(음의 단계, negative phase)을 어림해야 한다. 두와 모다치(2019)는 입력 x를 에너지의 내리막으로 옮기며 노이즈를 더하는 랑주뱅 방정식을 썼다.

xk=xk−1−a ∇xEθ(xk−1)+σ zk,kT실제=σ22a\textcolor{#1b9e77}{\mathbf{x}}^{k} = \textcolor{#1b9e77}{\mathbf{x}}^{k-1} - \textcolor{#006600}{a}\,\nabla_{\textcolor{#1b9e77}{\mathbf{x}}} \textcolor{#ff7f0e}{E_\theta}(\textcolor{#1b9e77}{\mathbf{x}}^{k-1}) + \textcolor{#4c5d80}{\sigma}\,\textcolor{#1f6066}{\mathbf{z}}^{k}, \qquad \textcolor{#7f7f7f}{k}\textcolor{#8c564b}{T}_{\text{실제}} = \frac{\textcolor{#4c5d80}{\sigma}^2}{2\textcolor{#006600}{a}}
Eθ(x)모델의 에너지 (위치에너지 자리)a, σ그래디언트 스텝 크기와 노이즈의 표준편차 (논문의 식은 a=λ/2, σ2=λ)kT실제이 샘플러가 향하는 볼츠만 분포의 온도xk, zkk번째 스텝의 샘플과 표준정규 노이즈 (위첨자 k는 스텝 번호로, 볼츠만 상수 k와 다르다)\begin{array}{ll} \textcolor{#ff7f0e}{E_\theta}(\textcolor{#1b9e77}{\mathbf{x}}) & \text{모델의 에너지 (위치에너지 자리)} \\ \textcolor{#006600}{a},\ \textcolor{#4c5d80}{\sigma} & \text{그래디언트 스텝 크기와 노이즈의 표준편차 (논문의 식은 } \textcolor{#006600}{a} = \lambda/2,\ \textcolor{#4c5d80}{\sigma}^2 = \lambda\text{)} \\ \textcolor{#7f7f7f}{k}\textcolor{#8c564b}{T}_{\text{실제}} & \text{이 샘플러가 향하는 볼츠만 분포의 온도} \\ \textcolor{#1b9e77}{\mathbf{x}}^{k},\ \textcolor{#1f6066}{\mathbf{z}}^{k} & \text{k번째 스텝의 샘플과 표준정규 노이즈 (위첨자 k는 스텝 번호로, 볼츠만 상수 k와 다르다)} \end{array}

논문의 식은 a = λ/2, σ² = λ로 온도 1에 맞춰져 있다. 그런데 CIFAR-10(가로세로 32픽셀 컬러 이미지 6만 장의 데이터 모음) 실험에서는 랑주뱅 60스텝을 가면서 그래디언트 스텝 크기를 10으로, 노이즈의 표준편차를 0.005로 두었다고 적었다. 이 샘플러가 실제로 몇 도의 분포를 향하는지는 아래 문제 13에서 직접 읽어 보자. 논문은 「EBM 학습은 MCMC 한 스텝(전이)의 크기에 가장 민감하다」고 적었다(MCMC는 Markov chain Monte Carlo의 머리글자로, 마르코프 체인을 돌려 샘플을 뽑는 방법을 통틀어 부르는 말이다).

문제 11. 어항 수온은 얼마나 흔들리나

어항의 목표 수온은 25°C다. 히터는 1분마다 목표와의 차이의 10%를 되돌리고, 그 1분 동안 물의 순환과 창문 바람이 수온을 표준편차 0.2°C만큼 무작위로 흔든다. (가) 오래 두면 수온은 목표 둘레에서 표준편차 얼마로 흔들리는가? (나) 히터가 30초마다 5%씩 되돌리게 바꾸고 무작위로 흔드는 양도 30초 단위로 적는다. 30초 동안 흔드는 양의 표준편차는 얼마로 두어야 하는가? (목표와의 차이를 x로 보면 위젯 2의 샘플러 x ← x − a∇U + σz와 같은 꼴이다. 「문제 11 (가) 불러오기」 단추로, (나)는 「문제 11 (나) 민준의 값」 단추와 숫자 칸으로 직접 재어 비교해 보자.)

이서연 S01
이서연

목표와의 차이가 e ← 0.9e + 0.2z로 바뀌니까, 오래 두어 분산 V가 멈추면 V = 0.81V + 0.04예요. V = 0.211, 표준편차 0.46°C고요.

김민준 M11
김민준

(나)는 시간이 절반이니까 흔드는 표준편차도 절반인 0.1°C요. 돌려 보니 표준편차가 0.32°C, 15초로 쪼개 0.05°C를 넣으면 0.23°C예요. 식을 잘게 쓸수록 어항이 조용해지네요?

이서연 S06
이서연

식을 어떻게 쪼개든 실제 어항은 그대로여야지. 30초짜리 무작위 변화 두 개가 1분짜리 무작위 변화 하나가 되는데, 서로 독립이면 더해지는 건 분산이야. 0.1²을 두 번 더하면 0.02인데 1분짜리 변화의 분산은 0.04잖아.

선생님 T14
선생님

그래요. 30초짜리 무작위 변화는 분산이 절반, 표준편차는 0.2/√2 = 0.141°C예요. 그러면 30초 단위로 0.453°C, 15초 단위로 0.450°C로 거의 그대로죠. 히터가 되돌리는 비율은 시간에 비례하고, 무작위 변화의 표준편차는 시간의 제곱근에 비례해야 해요.

김민준 M07
김민준

배달 알바를 두 번에 나눠 뛴다고 그날 수입의 들쭉날쭉이 반으로 줄지는 않는 거네요.

문제 12. 원하는 온도에 맞춘 노이즈

손실 U(θ) = θ²/2의 볼츠만 분포에서 샘플을 얻으려고 경사하강 θ ← θ − η∇U에 노이즈 σz를 더한다. (가) 온도 kT = 0.1인 분포, 곧 분산 0.1인 정규분포에서 뽑고 싶다. η = 0.01이면 σ는 얼마로 두어야 하는가? (나) 온도 1을 목표로 SGLD처럼 σ = √(2η)를 쓰면 η = 0.01에서는 분산이 1에 가깝지만 η = 0.1에서는 1.04 남짓으로 조금 크게 나온다. 왜 그런가? 스텝 크기를 줄이지 않고 이 편향을 없앨 수 있는가? ((가)에서 고른 노이즈는 위젯 2의 숫자 칸에 넣어 확인해 보자.)

김민준 M04
김민준

온도 1이면 노이즈가 √(2η) = 0.141이니까, 온도를 10분의 1로 하려면 0.1을 곱해서 0.0141이요. 돌렸더니… 분산이 0.0100이에요. 목표는 0.1인데요.

이서연 S11
이서연

한 스텝이 x ← x − a∇U + σz면 온도가 σ²/(2a)잖아. 너는 0.0141²/(2 × 0.01) = 0.01, 온도를 100분의 1로 만든 거야. 온도는 σ가 아니라 σ²에 비례해.

김민준 M07
김민준

어항에서 분산 대신 표준편차를 절반으로 줄였던 실수랑 같은 모양이네요. 온도를 10분의 1로 하려면 σ²을 10분의 1로, σ = √(2 × 0.01 × 0.1) = 0.0447이에요.

선생님 T14
선생님

0.0447로 돌려 보세요.

김민준 M03
김민준

0.100이요. 이제 맞네요. 그런데 (나)처럼 η = 0.1에서 √(2η)로 돌리면 1.04예요. 왜 조금 크게 나오죠?

이서연 S02
이서연

정확히 풀어 볼게. 분산을 v로 두면 한 스텝 뒤의 분산 (1 − η)²v + 2η가 다시 v여야 하니까…

김민준 M08
김민준

정리하면 v = 2η/(2η − η²) = 1/(1 − η/2)네. η = 0.1이면 1.053이야.

이서연 S07
이서연

스텝 크기가 유한해서 생기는 편향이고, 스텝 크기를 줄이면 1로 가.

선생님 T01
선생님

스텝 크기를 줄이지 않고 이 편향을 없애려면, 한 스텝을 제안으로 보고 메트로폴리스 수락 단계를 붙이면 돼요. 랑주뱅 한 스텝에 수락 단계를 붙인 이 방법을 MALA(Metropolis-adjusted Langevin algorithm)라고 불러요.

이서연 S08
이서연

근데 왜 하필 제곱근이어야 하는지가 확률론 수업에서 본 거랑 똑같네요. 독립인 변수 n개를 더해서 √n으로 나누면 정규분포가 남고, n으로 나누면 큰 수의 법칙처럼 0으로 가잖아요. 노이즈에 η를 곱하는 건 n으로 나누는 경우예요.

문제 13. 이 샘플러는 몇 도에서 뽑나

(가) 손실 U(θ) = θ²/2에서 노이즈를 따로 넣지 않은 SGD를 돌린다. 미니배치로 어림한 그래디언트는 참 그래디언트에 표준편차 1인 오차가 스텝마다 독립으로 섞인 것이다. 학습률 η = 0.01과 0.001에서 θ는 몇 도의 분포를 향하는가? (나) 두와 모다치(2019)는 CIFAR-10 실험에서 랑주뱅 한 스텝의 그래디언트 스텝 크기 a를 10, 노이즈의 표준편차 σ를 0.005로 두고 60스텝을 갔다. 이 샘플러의 온도는?

김민준 M02
김민준

(가)는 SGD도 미니배치 노이즈가 원래 있으니까 샘플러인 셈이죠. 온도 1 근처 아닐까요?

이서연 S12
이서연

그래디언트 오차에 η가 곱해지니까 한 스텝 노이즈는 σ = η × 1이야.

김민준 M03
김민준

그걸 아까 그 온도 식에 넣으면?

이서연 S11
이서연

σ²/(2a) = η²/(2η) = η/2이니까 0.005와 0.0005야. 학습률을 줄이면 식어.

김민준 M07
김민준

헉, SGD는 처음부터 노이즈에 스텝 크기를 곱하고 있었던 거네요.

선생님 T14
선생님

학습률이 크면 미니배치 노이즈도 무시할 수 없는 온도를 만들지만, 그 온도는 학습률, 미니배치 크기, 그래디언트의 분산에 따라 정해질 뿐 목표 온도 1에 맞춘 것이 아니에요. 그래서 SGLD는 노이즈를 따로 넣어요.

선생님 T01
선생님

(나)로 가 볼까요? 논문의 식은 a = λ/2, σ² = λ로 온도 1에 맞춰져 있었어요.

김민준 M06
김민준

0.005²/(2 × 10) = 1.25 × 10⁻⁶이요. 온도가 80만 분의 1이에요!

이서연 S01
이서연

그 온도면 노이즈는 없는 거나 마찬가지고, 60스텝은 사실상 에너지의 내리막을 따라가는 경사하강이야. 모델 분포 e^(−E_θ)가 아니라 그보다 80만 배 낮은 온도의 분포를 향해 가는 거지.

선생님 T13
선생님

그래요. 논문이 「EBM 학습은 MCMC 한 스텝의 크기에 가장 민감하다」고 적은 것도 그래서예요. 이렇게 학습된 E_θ를 온도 1의 볼츠만 분포 그대로 읽으려면 조심해야 해요.

김민준 M11
김민준

보고서에는 「무작위로 골랐다」고 써 놓고 실제로는 늘 1등만 고른 셈이네요.