8장 — 분배함수와 자유에너지

ln Z의 기울기: 미분 한 번으로 꺼내는 평균 에너지

분류기를 학습해 본 독자에게는 logsumexp를 로짓으로 미분하면 softmax 확률이 나온다는 사실이 익숙하다. ln Z도 로짓 자리에 −βEᵢ를 넣은 logsumexp다. 그렇다면 ln Z를 로짓이 아니라 역온도 β로 미분하면 무엇이 나올까?

평균 에너지와 엔트로피

르장드르 변환에서는 변환한 함수를 새 변수로 미분하면 옛 변수가 나왔다. 자유에너지를 온도로 미분하면 엔트로피가 나온 것(∂F/∂T = −S)이 그 예다. 큰 계의 ln Z는 승자의 점수 max_E(ln g(E) − βE)와 거의 같으므로, ln Z를 β로 미분하면 승자의 에너지에 마이너스를 붙인 것이 나와야 할 것 같다. 사실은 근사 없이도 성립한다. Σᵢe^(−βEᵢ)를 β로 미분하면 각 항에서 −Eᵢ가 내려오고, 이것을 Z로 나누면 볼츠만 확률로 평균한 에너지에 마이너스를 붙인 것이 된다.

⟨E⟩=−∂ln⁡Z∂β,S=k(ln⁡Z+β⟨E⟩)=−∂F∂T\langle \textcolor{#ff7f0e}{E} \rangle = -\frac{\partial \ln \textcolor{#667733}{Z}}{\partial \textcolor{#8c564b}{\beta}}, \qquad \textcolor{#9467bd}{S} = \textcolor{#7f7f7f}{k}\big(\ln \textcolor{#667733}{Z} + \textcolor{#8c564b}{\beta} \langle \textcolor{#ff7f0e}{E} \rangle\big) = -\frac{\partial \textcolor{#a000c8}{F}}{\partial \textcolor{#8c564b}{T}}
⟨E⟩볼츠만 분포의 평균 에너지ln⁡Z로그 분배함수 (역온도의 함수로 본다)β역온도S볼츠만 분포의 엔트로피F자유에너지\begin{array}{ll} \langle \textcolor{#ff7f0e}{E} \rangle & \text{볼츠만 분포의 평균 에너지} \\ \ln \textcolor{#667733}{Z} & \text{로그 분배함수 (역온도의 함수로 본다)} \\ \textcolor{#8c564b}{\beta} & \text{역온도} \\ \textcolor{#9467bd}{S} & \text{볼츠만 분포의 엔트로피} \\ \textcolor{#a000c8}{F} & \text{자유에너지} \end{array}

2준위 입자 하나에서는 ln Z = ln(1 + e^(−βε))이므로 ⟨E⟩ = ε/(e^(βε) + 1)이고, βε = ln 2에서 ε/3이다. 엔트로피는 ln 1.5 + ln 2 × 1/3 = 0.6365(k 단위)인데, 이 값은 경우의 수를 직접 세어 얻는 입자 하나당 엔트로피, 곧 N이 클 때 ln C(N, N/3)/N이 다가가는 −(1/3)ln(1/3) − (2/3)ln(2/3) = 0.6365와 같다. 경우의 수를 한 번도 세지 않고 Z만 미분해서 엔트로피를 얻은 것이다.

2준위 입자 하나(ε = 1)의 ln Z를 역온도 β의 함수로 그린 곡선과 두 접선. β = 0에서 접선의 기울기는 −1/2, β = ln 2에서는 −1/3이다. 기울기에 마이너스를 붙이면 그 온도의 평균 에너지 ⟨E⟩(ε 단위)가 된다. 온도가 낮아질수록(β가 커질수록) 곡선이 평평해져 평균 에너지가 0으로 다가간다.
2준위 입자 하나(ε = 1)의 ln Z를 역온도 β의 함수로 그린 곡선과 두 접선. β = 0에서 접선의 기울기는 −1/2, β = ln 2에서는 −1/3이다. 기울기에 마이너스를 붙이면 그 온도의 평균 에너지 ⟨E⟩(ε 단위)가 된다. 온도가 낮아질수록(β가 커질수록) 곡선이 평평해져 평균 에너지가 0으로 다가간다.

이제 정규화 상수라며 나눠 버리던 Z가 에너지와 경우의 수의 겨루기에 대해 무엇을 아는지 정리할 수 있다. ln Z의 값은 승자의 점수(−βF)이고, β에 대한 기울기에 마이너스를 붙이면 승자의 에너지 ⟨E⟩이며, 이 둘을 합치면 승자의 엔트로피가 나온다. 정규화 상수로만 보이던 Z는 미분 한 번으로 온갖 평균을 내주는 함수였던 것이다.

코드로 확인하기

PyTorch의 자동 미분으로 입자 하나의 ln Z를 β로 미분해 평균 에너지와 엔트로피를 얻고, 경우의 수를 세어 얻는 값 −(1/3)ln(1/3) − (2/3)ln(2/3)과 비교해 보자.

import torch
from math import log

beta_eps = log(2)                      # βε = ln 2, 들뜬 상태의 볼츠만 인자 e^(−βε) = 1/2

# ln Z를 β로 미분해 입자 하나의 평균 에너지와 엔트로피 얻기 (ε = 1, k = 1)
beta = torch.tensor(beta_eps, requires_grad=True)
lnZ1 = torch.log(1 + torch.exp(-beta))                      # 입자 하나의 ln Z
lnZ1.backward()
E_mean = -beta.grad.item()                                  # ⟨E⟩ = −∂ln Z/∂β
S = lnZ1.item() + beta.item() * E_mean                      # S/k = ln Z + β⟨E⟩
H_count = -(1/3) * log(1/3) - (2/3) * log(2/3)              # 세어서 얻은 ln C(N, N/3)/N의 극한
print(f"⟨E⟩ = {E_mean:.4f},  S = {S:.4f},  세어서 얻은 값 = {H_count:.4f}")
# ⟨E⟩ = 0.3333,  S = 0.6365,  세어서 얻은 값 = 0.6365

경우의 수를 한 번도 세지 않고 ln Z의 기울기만으로 평균 에너지 1/3과 엔트로피 0.6365를 얻었다.

ML에서: 에너지 기반 모델의 기울기

에너지 안에 매개변수 θ가 들어 있으면 ln Z를 θ로 미분해도 같은 방식으로 볼츠만 분포로 평균한 −β⟨∂E/∂θ⟩가 나온다. 에너지 기반 모델 p_θ(x) = e^(−βE_θ(x))/Z(θ)를 최대우도로 학습할 때 기울기가 「데이터에서 평균한 ∂E/∂θ − 모델에서 평균한 ∂E/∂θ」 꼴이 되는 것은, ln Z(θ)의 기울기가 바로 모델 쪽 평균이기 때문이다. Z를 직접 계산할 수 없는 모델에서는 이 평균을 모델에서 뽑은 샘플로 어림한다.

문제 8. 자유에너지에서 엔트로피 꺼내기

(가) 2준위 입자 하나의 자유에너지 F = −kT ln(1 + e^(−ε/kT))에서 S = −∂F/∂T로 βε = ln 3일 때의 엔트로피를 구하라. (나) 온도 1에서 로짓 z = (2, 1, 0)인 softmax의 엔트로피를 logsumexp와 로짓 평균만으로 구하라.

김민준 M11
김민준

F = −kT ln Z를 T로 미분하면 −k ln Z니까 S = k ln Z = k ln(4/3) = 0.2877k예요.

이서연 S06
이서연

ln 3이면 입자 하나가 들떠 있을 확률이 1/(1 + 3) = 1/4이니까, 경우의 수를 세어 얻는 입자 하나당 엔트로피는 −(1/4)ln(1/4) − (3/4)ln(3/4) = 0.5623이야. 모자라는데.

선생님 T14
선생님

Z는 무엇의 함수죠?

김민준 M07
김민준

1 + e^(−ε/kT)… 아, T가 들어 있어요. 곱의 미분이라 한 항이 더 나와야 해요. −kT × ∂ln Z/∂T인데 ∂ln Z/∂T = ⟨E⟩/(kT²)이니까 S = k ln Z + ⟨E⟩/T = 0.2877k + 0.2747k = 0.5623k. 이제 맞아요.

이서연 S12
이서연

정규화 상수라고 부르니까 상수인 줄 안 거지. 온도를 바꾸면 Z도 바뀌어.

김민준 M01
김민준

(나)는 T = 1에서 S = ln Z + β⟨E⟩에 E = −z를 넣으면 H = logsumexp(z) − ⟨z⟩_p예요. 2.4076 − 1.5752 = 0.8324.

선생님 T13
선생님

−Σp ln p로 계산하면 확률이 0에 가까운 클래스에서 ln 0을 조심해야 하지만, 이 식은 logsumexp 한 번과 가중 평균 한 번이면 끝나요. 로짓만 있으면 되죠.

이서연 S09
이서연

이 식은 −ln pᵢ = Eᵢ − F를 p로 평균한 거네요. 놀라움의 평균이 엔트로피고, 놀라움 하나하나는 에너지가 자유에너지보다 얼마나 높은지니까요.