15장 — 비평형 통계역학과 야르진스키 등식
이 장의 물음
확산 모델이나 에너지 기반 모델에서 샘플을 뽑아 본 사람은 샘플러의 걸음 수를 줄이면 생성은 빨라지지만 결과가 나빠진다는 것을 겪어 본다. 걸음을 줄이면 정확히 무엇이 나빠지는지 가장 단순한 분포로 재어 보자. 목표 분포는 −2와 +2에 표준편차 0.5인 봉우리가 하나씩 있고, 오른쪽 봉우리에 비중 0.8이 실린 분포다. 봉우리가 둘이면 그 사이 골짜기를 건너기 어려워서, 샘플러가 뒤처진 정도가 「오른쪽 봉우리에 선 샘플의 비율」이라는 수 하나로 드러난다. 송과 에르몬(2019)이 담금질 랑주뱅을 내놓으며 시험한 것도 비중이 1/5과 4/5인 두 봉우리였다(그들의 예는 2차원이다).
담금질 랑주뱅은 잡음을 크게 섞어 봉우리 사이 골짜기를 메운 분포에서 출발해, 섞는 잡음을 조금씩 줄여 가며 단계마다 랑주뱅 방정식(로그밀도가 커지는 쪽으로 한 걸음 옮기고 잡음을 조금 더하는 걷기 규칙)을 몇 걸음씩 돌리는 방법이다. 담금질(annealing)은 쇠를 달궜다가 천천히 식히는 일에서 온 이름으로, 다루기 쉬운 분포에서 목표 분포로 조금씩 옮겨 가는 것을 말한다. 잡음의 표준편차를 5에서 0.1까지 10단계로 줄이며 마르코프 사슬(따로 돌리는 샘플러 하나) 10만 개로 돌려 보면, 단계마다 100걸음을 줄 때는 오른쪽 봉우리에 선 사슬의 비율이 0.795로 참값 0.8에 가깝지만 10걸음이면 0.754, 1걸음이면 0.579로 뒤처진다. 분포를 바꾸는 빠르기를 샘플이 따라가지 못하는 것이다.
그런데 사슬마다 수 하나를 더 기록해 두면 이 뒤처짐을 정확히 되돌릴 수 있다. 잡음 수준을 바꾸는 순간에는 샘플이 그대로 있고 에너지 −ln p만 바뀐다. 그 바뀐 양을 사슬마다 모두 더한 값을 𝒲라 하고, 끝에서 사슬마다 e^(−𝒲)를 가중치(샘플마다 곱해 세는 중요도 가중치. 신경망의 가중치와는 다르다)로 달아 비율을 다시 세어 보자. 단계마다 100걸음, 10걸음, 1걸음을 준 세 경우 모두 0.803, 0.800, 0.801이 나오고, 랑주뱅을 한 걸음도 돌리지 않고 가중치만 달아도 0.800이다. 가중치의 평균 ⟨e^(−𝒲)⟩도 네 경우 모두 1.00 근처에 머문다.

샘플 자체는 목표 분포에 한참 못 미쳤다. 그런데 사슬마다 수 하나를 곱해 다시 세었을 뿐인데 어떻게 참값이 정확히 돌아올까? 이 물음은 몇 갈래로 나뉜다.
- 평형에 이를 시간을 주지 않고 끌고 다닌 샘플에서, 평형 분포의 양을 정확히 얻을 수 있는 까닭은 무엇일까?
- 랑주뱅을 한 걸음도 돌리지 않아도 답이 맞는다면, 걸음을 주는 것은 무엇을 얻기 위해서일까?
- 같은 걸음 수를 쓴다면 잡음을 줄이는 단계를 몇 개로 나누는 것이 좋을까?
- 가중치의 평균에 로그를 씌운 값은 왜 한쪽으로 치우쳐 나올까?
- 확산 모델을 처음 제안한 논문의 제목에는 왜 「비평형 열역학」이라는 말이 들어 있을까?
일: 덫을 조이는 데 드는 에너지
첫머리에서 사슬마다 더해 둔 𝒲는 잡음 수준을 바꾸는 순간, 샘플은 그대로 둔 채 에너지만 바뀐 양이었다. 샘플이 움직이며 바뀐 에너지는 세지 않았다. 왜 하필 이렇게 나눠 세었을까? 에너지를 이렇게 나누는 방법은 물리에서 먼저 나왔으니, 가장 단순한 물리계에서 보자.
용수철 덫 조이기
물속에 뜬 알갱이 하나가 용수철처럼 작용하는 덫에 붙잡혀 있다. 레이저 빛을 한 점에 모아 만드는 광학 집게가 이런 덫이다. 알갱이가 덫의 가운데서 x만큼 벗어나면 위치에너지가 κx²/2이고, κ(카파)는 덫이 얼마나 단단한지를 나타내는 용수철 상수다. 용수철 상수는 흔히 k로 쓰지만 이 책에서 k는 볼츠만 상수이므로 글자만 κ로 바꿔 쓴다. 물의 온도는 kT = 1로 두고, 알갱이는 처음에 κ = 1인 덫 안에서 평형을 이루고 있다. 그래서 알갱이의 위치는 평균 0, 분산 kT/κ = 1인 정규분포를 따른다.
이제 덫을 조여 κ를 1에서 4로 올린다. κ를 올리는 순간 알갱이가 어디에 있든 그 자리의 에너지가 올라가므로, 우리가 계에 일을 해 준 것이다. 알갱이가 x에 있을 때 κ를 dκ만큼 올리면 에너지가 x² × dκ/2만큼 늘고, 조이는 동안 이것을 모두 더한 값이 한 번 조이는 데 든 일 𝒲다. 조이는 동안 알갱이는 가만히 있지 않고 랑주뱅 방정식을 따라 움직인다. 덫을 한순간에 조이면 알갱이가 움직일 겨를이 없고, 천천히 조이면 알갱이가 좁아지는 덫을 따라 가운데로 모여들어 κ를 올릴 때마다 드는 일이 줄어든다.

일과 열
덫에서는 κ를 올리는 순간 알갱이가 있던 자리의 에너지가 늘어난 양을 일이라 불렀다. 그런데 조이는 동안 알갱이도 움직이므로 에너지는 두 가지 까닭으로 바뀐다. 덫이 아닌 다른 계, 예컨대 첫머리의 두 봉우리 사슬에서도 같은 계산을 하려면 이 둘 가운데 무엇을 일로 세어야 할까?
덫의 용수철 상수처럼 바깥에서 조절하는 매개변수를 λ라 하고, 그 값에 따라 위치에너지가 U_λ(x)로 정해진다고 하자. 매개변수를 λ₀에서 λ₁로 바꾸는 과정을 잘게 나누면, 한 칸마다 두 가지 변화가 번갈아 일어난다. 먼저 알갱이는 그 자리에 둔 채 매개변수만 λ_(k−1)에서 λ_k로 바꾸고, 다음으로 매개변수는 그대로 둔 채 알갱이가 열원과 부딪히며 x_(k−1)에서 x_k로 움직인다. 앞의 것이 바꾼 에너지를 모두 더한 것이 일이고, 뒤의 것이 바꾼 에너지를 모두 더한 것이 열이다.
𝒲를 일 (위치를 그대로 둔 채 매개변수를 바꿀 때 계의 에너지가 늘어난 양, work)이라 하고, 나머지 몫인 Q, 곧 매개변수를 그대로 둔 채 계가 움직이며 열원과 주고받은 에너지를 열(heat)이라 한다. 일을 필기체 𝒲로 쓰는 것은 경우의 수 W와 구별하기 위해서다. 둘을 더하면 처음과 끝의 에너지 차이가 되는데, 이것은 경로 하나하나에서 성립하는 에너지 보존, 곧 열역학 제1법칙이다.

조이는 빠르기와 일
그렇다면 덫을 조이는 빠르기는 일에 어떤 영향을 줄까? 같은 실험을 10만 번 되풀이하며 조이는 데 걸리는 시간을 0(한순간), 0.1, 1, 10으로 바꿔 보자. 조일 때마다 일 𝒲를 재어 그 평균과, e^(−𝒲)의 평균에 −ln을 씌운 값을 구하고, 다 조인 순간 알갱이 위치의 제곱 평균도 함께 적었다.
| 조이는 시간 | 일의 평균 ⟨𝒲⟩ | −ln⟨e^(−𝒲)⟩ | 끝에서 ⟨x²⟩ |
|---|---|---|---|
| 0 (한순간) | 1.500 | 0.6932 | 1.000 |
| 0.1 | 1.374 | 0.6957 | 0.758 |
| 1 | 0.937 | 0.6933 | 0.289 |
| 10 | 0.726 | 0.6938 | 0.252 |
세 가지가 눈에 띈다. 첫째, 일의 평균은 천천히 조일수록 줄어서 한순간에 조이면 1.500이던 것이 시간 10에서는 0.726이 된다. 둘째, 다 조인 순간의 알갱이는 새 덫의 평형에 있지 않다. κ = 4인 덫의 평형 분산은 kT/κ = 0.25인데, 한순간에 조이면 알갱이의 분포가 옛 덫의 것 그대로(1.000)이고 시간 0.1에서도 0.758로 한참 뒤처져 있다. 셋째, 그런데 e^(−𝒲)의 평균으로 계산한 마지막 칸은 조이는 빠르기와 상관없이 모두 0.693 근처다.
빠르기에 따라 일의 평균은 두 배 넘게 달라지는데 왜 지수 평균은 그대로일까? 0.693이라는 수는 무엇이고, 천천히 조일수록 일의 평균이 이 수에 다가가는 것처럼 보이는 까닭은 무엇일까?
ML에서: 잡음 수준을 바꾸는 순간의 일
첫머리의 담금질 랑주뱅에서는 잡음 수준이 바깥에서 조절하는 매개변수 λ이고, kT = 1로 두면 에너지는 −ln p다. 잡음 수준을 바꾸는 순간에는 샘플이 그대로 있으므로 그때 바뀐 −ln p가 일이고, 한 수준 안에서 랑주뱅 걸음으로 움직이며 바뀐 몫은 열이다. 첫머리에서 사슬마다 더해 둔 𝒲는 이 일의 합이다.
문제 1. 통장 잔고에서 월급 가려내기
민준이의 통장에 1월 1일 100만 원이 있었다. 1월 25일과 2월 25일에 월급이 200만 원씩 들어왔고, 3월 1일 잔고는 230만 원이었다. 그사이 카드값, 이자, 자동이체처럼 통장 안에서 저절로 오간 돈은 모두 합해 얼마인가? 잔고가 늘어난 130만 원을 「두 달 동안 들어온 월급」이라고 적으면 무엇이 틀리는가?

잔고가 130만 원 늘었으니까 두 달 동안 들어온 돈이 130만 원이죠.

월급날 바로 전과 바로 뒤의 잔고는 얼마나 달라졌을까요?

그날은 200만 원씩 뛰었겠죠. 아, 그럼 월급만 400만 원이고, 잔고는 130만 원만 늘었으니까 나머지 270만 원은 통장에서 빠져나간 거네요.

처음과 끝 잔고만 보면 둘을 못 가르겠다. 월급이 들어온 순간에 따로 적어 둬야 해.

그래요. 덫도 같아요. κ를 바꾼 순간의 에너지 변화를 따로 적어 둔 것이 일이고, 처음과 끝의 에너지 차이에서 그것을 뺀 나머지가 열이에요.
문제 2. 두 칸으로 조인 경로 하나
처음 κ = 1인 덫에서 x₀ = 1.2에 있던 알갱이의 덫을 두 칸에 걸쳐 조인다(kT = 1). 첫 칸에서 κ를 2.5로 올린 뒤 알갱이가 x₁ = 0.6으로 움직이고, 둘째 칸에서 κ를 4로 올린 뒤 x₂ = 0.5로 움직였다. 이 경로의 일 𝒲와 열 Q를 구하고, 둘의 합이 처음과 끝의 에너지 차이와 같은지 확인하라.

칸마다 κ가 늘어난 만큼에 x²/2를 곱하면 되죠. 첫 칸은 1.5 × 0.36/2 = 0.27, 둘째 칸은 1.5 × 0.25/2 = 0.1875라서 일은 0.4575예요.

합부터 볼게. 처음 에너지는 1.44/2 = 0.72, 끝 에너지는 4 × 0.25/2 = 0.5라서 차이는 −0.22야. 민준이 일을 빼면 열은 −0.6775고. 숫자는 맞는데…

κ를 2.5로 올린 순간 알갱이는 어디에 있었죠?

아, 올린 다음에 움직였으니까 0.6이 아니라 1.2에 있었네요. 첫 칸 1.5 × 1.44/2 = 1.08, 둘째 칸 1.5 × 0.36/2 = 0.27, 일은 1.35예요.

열은 κ를 둔 채 움직인 몫이니까 2.5 × (0.36 − 1.44)/2 = −1.35와 4 × (0.25 − 0.36)/2 = −0.22를 더해 −1.57이야. 1.35 − 1.57 = −0.22라서 처음과 끝의 에너지 차이와 같아. 그런데 이상하다. 민준이 틀린 0.4575로 열을 거꾸로 구해도 합은 −0.22였잖아.

좋은 걸 봤어요. 제1법칙은 합만 정해 줘서, 일과 열을 어떻게 나눴는지는 가려 주지 못해요. 나누는 기준은 순서예요. 이 실험은 κ를 먼저 바꾸고 그다음 움직였으니, 바꾸는 순간의 위치 x₀, x₁로 재야 해요.

적분을 어림할 때 구간마다 왼쪽 끝 값을 쓰느냐 오른쪽 끝 값을 쓰느냐와 같네요. 칸이 잘면 차이가 줄겠지만 칸이 굵으면 결과가 달라지고요.