10장 — 요동과 응답

요동-응답 관계: 흔들리는 만큼 반응한다

온도를 바꾸는 실험과 온도를 고정한 채 에너지가 흔들리는 모습을 지켜보는 관찰은 전혀 다른 일이다. 그런데 2준위 입자의 수를 3개에서 3000개까지 바꿔 가며 해 본 계산에서 두 일은 입자 수와 상관없이 같은 숫자를 내놓았다. 열용량을 재려면 보통 온도를 조금씩 바꿔 가며 들어간 열을 재는 실험을 되풀이해야 하는데, 온도를 마음대로 바꾸기 어렵거나 바꾸면 성질이 달라지는 물질도 있다. 두 일이 늘 같은 숫자를 낸다면, 열용량을 알려고 반드시 온도를 바꾸는 실험을 해야 할까?

역사: 에너지 요동에서 읽어 낸 것

평균만 보던 통계역학이 요동(평균 주위의 흔들림)에 눈을 돌린 것은 20세기 초의 일이다. 요동은 처음에 평균 이론이 맞는지 확인하는 부산물로 계산되었지만, 곧 평균으로는 보이지 않는 것을 드러내는 도구가 되었다. 1904년 베른 특허청의 심사관이던 아인슈타인은 『물리학 연보』에 낸 논문에서, 열원과 에너지를 주고받는 계의 에너지 요동을 제곱해 평균한 값(에너지 분산)이 kT² × (평균 에너지의 온도 미분)과 같다는 요동 공식을 얻었다. 깁스가 2년 전 『통계역학의 기본 원리』에서 같은 식을 이미 적어 두었지만, 깁스는 바로 뒤에 에너지 요동이 분자 수만큼 큰 물체에서는 너무 작아 사람의 관찰에 걸리지 않는다고 덧붙였다. 아인슈타인은 깁스의 책을 모른 채 따로 같은 식에 도달했고, 훗날 그 책을 알았더라면 이 무렵의 논문들을 내지 않았을 것이라고 적었다. 그런데 그는 깁스와 반대로, 요동이 관찰될 만큼 큰 계를 찾아 나섰다. 그는 요동 공식에 들어 있는 보편 상수 k가 에너지 요동의 크기를 정한다는 점에 주목했고, 흑체 복사(뜨거운 물체가 온도만으로 정해지는 빛을 내는 것)에 요동 공식을 과감하게 적용했다. 복사 에너지의 표준편차가 에너지 평균만큼 커지는 공간의 크기를 계산하니 한 변이 0.42/T cm(T는 절대온도)쯤이었다. 온도에 따라 가장 밝게 나오는 빛의 파장을 플랑크의 법칙에서 구한 값이 0.29/T cm이니, 자릿수가 맞는 값이 나온 것이다.

5년 뒤 아인슈타인은 같은 발상을 더 밀고 나갔다. 이번에는 실험과 잘 맞는 플랑크의 복사 법칙을 요동 공식에 넣었는데, 에너지 요동이 두 항의 합으로 나왔다. 한 항은 빛을 파동으로 보고 여러 파동이 간섭해 생기는 요동으로 설명할 수 있었고, 다른 항은 빛이 에너지 덩어리로 공간에 흩어져 있다고 보아야만 설명할 수 있었다. 1909년 9월 잘츠부르크에서 열린 학회에서 그는 에너지 요동이 파동 항과 입자 항의 합이라는 결과를 발표하며 빛에는 파동의 성질과 입자의 성질이 함께 있다는 생각을 제안했다. 평균 에너지만 보았다면 보이지 않았을 빛의 입자성이 에너지 요동에서 드러난 것이다.

아인슈타인의 1909년 계산을 다시 그린 그림. 플랑크의 법칙을 요동 공식에 넣으면 에너지 요동이 파동의 간섭 항과 알갱이 항의 합이 되는데, 두 항이 요동 전체에서 차지하는 비율은 빛의 진동수를 온도로 잰 값 hν/kT(h는 플랑크 상수, ν(뉴)는 진동수) 하나로 정해진다(파동 항의 비율 e^(−hν/kT)). 진동수가 낮은 빛에서는 파동 항이, 높은 빛에서는 알갱이 항이 요동을 거의 다 차지하고, 두 항은 hν/kT = ln 2에서 같다
아인슈타인의 1909년 계산을 다시 그린 그림. 플랑크의 법칙을 요동 공식에 넣으면 에너지 요동이 파동의 간섭 항과 알갱이 항의 합이 되는데, 두 항이 요동 전체에서 차지하는 비율은 빛의 진동수를 온도로 잰 값 hν/kT(h는 플랑크 상수, ν(뉴)는 진동수) 하나로 정해진다(파동 항의 비율 e^(−hν/kT)). 진동수가 낮은 빛에서는 파동 항이, 높은 빛에서는 알갱이 항이 요동을 거의 다 차지하고, 두 항은 hν/kT = ln 2에서 같다

같은 2차 미분을 읽는 두 방법

ln Z를 역온도 β로 두 번 미분해 요동을 적은 식 ∂²ln Z/∂β² = −∂⟨E⟩/∂β = Var(E)를 다시 보자. 2준위 입자 세 개(βε = ln 2)에서 역온도를 0.01 낮출 때 평균 에너지가 늘어난 양을 0.01로 나눈 0.668이 가운데 항이고, 에너지 값별 확률로 직접 계산한 분산 0.667이 오른쪽 항이다. 입자가 3000개이면 두 값은 667.8과 666.7이다. 역온도를 조금 바꿨을 때 평균 에너지가 움직이는 비율과 에너지의 분산은 ln Z의 같은 2차 미분을 두 가지로 읽은 것이므로, 입자 수와 상관없이 정확히 같다. 두 값이 0.2%쯤 어긋난 것은 역온도를 0.01이라는 유한한 폭으로 바꿔 기울기를 어림했기 때문이다.

입자 30개(βε = ln 2)의 에너지 분포와, 역온도를 0.1 낮춘 분포(점선). 평균은 10에서 10.677로 0.677 움직이는데 이것은 분산 6.667에 0.1을 곱한 0.667과 거의 같다. 오른쪽은 평균 에너지를 역온도의 함수로 그린 것으로, βε = ln 2에서 접선의 기울기가 −6.667(= −분산)이다.
입자 30개(βε = ln 2)의 에너지 분포와, 역온도를 0.1 낮춘 분포(점선). 평균은 10에서 10.677로 0.677 움직이는데 이것은 분산 6.667에 0.1을 곱한 0.667과 거의 같다. 오른쪽은 평균 에너지를 역온도의 함수로 그린 것으로, βε = ln 2에서 접선의 기울기가 −6.667(= −분산)이다.

이제 온도로 돌아가자. ln Z를 두 번 미분한 식은 역온도에 대한 평균 에너지의 응답이 에너지의 분산(요동)과 같다고 말한다. 역온도와 온도는 β = 1/kT로 이어져 있어서 dβ/dT = −1/(kT²)이므로, 역온도에 대한 응답 −∂⟨E⟩/∂β = Var(E)에 dβ/dT를 곱하면 다음을 얻는다.

C≡∂⟨E⟩∂T=Var(E)kT2,C=T ∂S∂T\textcolor{#008b8b}{C} \equiv \frac{\partial \langle \textcolor{#ff7f0e}{E} \rangle}{\partial \textcolor{#8c564b}{T}} = \frac{\mathrm{Var}(\textcolor{#ff7f0e}{E})}{\textcolor{#7f7f7f}{k}\textcolor{#8c564b}{T}^2}, \qquad \textcolor{#008b8b}{C} = \textcolor{#8c564b}{T}\,\frac{\partial \textcolor{#9467bd}{S}}{\partial \textcolor{#8c564b}{T}}
C열용량 (응답: 온도를 올릴 때 평균 에너지가 늘어나는 비율)⟨E⟩볼츠만 분포의 평균 에너지T열원의 온도Var(E)에너지의 분산 (요동)k볼츠만 상수 (ML에서는 1)S볼츠만 분포의 엔트로피\begin{array}{ll} \textcolor{#008b8b}{C} & \text{열용량 (응답: 온도를 올릴 때 평균 에너지가 늘어나는 비율)} \\ \langle \textcolor{#ff7f0e}{E} \rangle & \text{볼츠만 분포의 평균 에너지} \\ \textcolor{#8c564b}{T} & \text{열원의 온도} \\ \mathrm{Var}(\textcolor{#ff7f0e}{E}) & \text{에너지의 분산 (요동)} \\ \textcolor{#7f7f7f}{k} & \text{볼츠만 상수 (ML에서는 1)} \\ \textcolor{#9467bd}{S} & \text{볼츠만 분포의 엔트로피} \end{array}

첫 식을 요동-응답 관계 (흔들림의 크기가 응답을 정한다, fluctuation-response relation)라 부른다. 왼쪽은 온도를 바꾸는 실험을 해야 알 수 있는 양이고, 오른쪽은 온도를 고정한 채 에너지가 흔들리는 모습만 지켜보면 알 수 있는 양이다. 2준위 입자로 보면 왜 같은지 짐작할 수 있다. 온도를 올려 평균 에너지가 늘려면 바닥 상태의 입자 일부가 들떠야 하는데, 그렇게 두 상태를 오가는 일은 온도를 고정해도 쉬지 않고 일어나고 있다. 들떠 있을 확률이 1/3인 입자는 열원과 에너지를 주고받으며 바닥과 들뜬 상태를 오가고, 이렇게 오가는 것이 에너지 요동이다. 오갈 수 있는 입자가 많을수록 에너지의 분산이 크고, 온도를 조금 바꿨을 때 들뜬 쪽으로 옮겨 갈 입자도 많다. 둘째 식은 앞에서 dE = T dS로 얻은, 엔트로피로 적은 열용량 C = ∂S/∂ln T다.

요동-응답 관계에서 곧바로 두 가지를 읽을 수 있다. 첫째, 분산은 음수가 될 수 없으므로 ln Z는 β의 볼록 함수이고, 평균 에너지는 β가 커질수록(온도가 내려갈수록) 줄어든다. 온도를 올렸는데 평균 에너지가 줄어드는 계는 평형에서 있을 수 없다는 뜻이다. ln Z와 엔트로피를 르장드르 변환으로 오갈 수 있는 것도 ln Z가 볼록하기 때문인데, ln Z가 볼록한 것은 다시 그 2차 미분인 에너지의 분산이 음수가 아니기 때문이다. 둘째, 에너지 분산이 0이 되는 것은 모든 상태가 같은 에너지를 가질 때뿐이고, 그때는 ln Z가 β에 대해 곧은 선이 되어 온도를 바꿔도 평균 에너지가 전혀 움직이지 않는다. 흔들리지 않는 양은 조건을 바꿔도 반응하지 않는다.

2준위 입자에 적용하기

2준위 입자에 적용해 보자. βε = ln 2에서 입자 하나의 에너지 분산은 (1/3)(2/3)ε² = 0.222ε²이고 kT = ε/ln 2이므로, 요동-응답 관계로 얻은 열용량은 0.222 × (ln 2)²k = 0.107k로, 평균 에너지를 온도로 직접 미분해 얻은 값과 같다. 온도를 바꿔 가며 열용량이 어떻게 달라지는지는 아래 문제 3에서 계산해 본다.

입자 수를 바꿔 가며 같은 계산을 자동 미분으로 해 보자. 2준위 입자 N개의 ln Z = N ln(1 + e^(−β))를 PyTorch로 β에 대해 두 번 미분하고, 에너지 값별 비중으로 직접 센 분산과 나란히 놓는다. 마지막 칸은 요동-응답 관계로 구한 열용량 C/k다.

import torch
from math import lgamma, log, exp

def lnZ(beta, N):                      # 2준위 입자 N개 (ε = 1, k = 1): Z = (1 + e^(−β))^N
    return N * torch.log(1 + torch.exp(-beta))

def counted_var(N, b):                 # 에너지 값별 비중 g·e^(−βE)로 직접 센 분산
    lw = [lgamma(N + 1) - lgamma(n + 1) - lgamma(N - n + 1) - b * n for n in range(N + 1)]
    w = [exp(v - max(lw)) for v in lw]
    s = sum(w)
    mean = sum(n * wn for n, wn in enumerate(w)) / s
    return sum(n * n * wn for n, wn in enumerate(w)) / s - mean ** 2

b0 = log(2)                            # βε = ln 2
print("    N   −∂lnZ/∂β   ∂²lnZ/∂β²   세어서 얻은 분산   C = 분산/kT²")
for N in (3, 30, 300, 3000):
    beta = torch.tensor(b0, dtype=torch.float64, requires_grad=True)
    g, = torch.autograd.grad(lnZ(beta, N), beta, create_graph=True)   # 1차 미분
    h, = torch.autograd.grad(g, beta)                                  # 2차 미분
    print(f"{N:5d} {-g.item():10.4f} {h.item():11.4f} {counted_var(N, b0):15.4f}"
          f" {h.item() * b0 ** 2:13.4f}")
#     N   −∂lnZ/∂β   ∂²lnZ/∂β²   세어서 얻은 분산   C = 분산/kT²
#     3     1.0000      0.6667          0.6667        0.3203
#    30    10.0000      6.6667          6.6667        3.2030
#   300   100.0000     66.6667         66.6667       32.0302
#  3000  1000.0000    666.6667        666.6667      320.3020

1차 미분은 평균 에너지를, 2차 미분은 세어서 얻은 분산을 소수 넷째 자리까지 그대로 내준다. 경우의 수를 한 번도 세지 않고 ln Z의 곡률만으로 에너지의 분산과 열용량을 얻은 것이다. 입자 하나당 열용량은 어느 줄에서나 0.107k로 같다.

문제 3. 두 상태짜리 입자의 열용량

에너지 0과 ε 두 상태만 가질 수 있는 입자 하나의 열용량 C를 βε의 함수로 구하고, βε = 10, 5, ln 2, 0.1에서 값을 계산하라. 열용량은 어느 온도에서 가장 큰가? (풀어 본 뒤 아래 위젯 2의 온도 단추로 확인해 보자.)

김민준 M04
김민준

온도를 올릴수록 들뜨는 입자가 늘어나니까 열용량도 계속 커지겠죠. 계산해 볼게요. 들떠 있을 확률이 p = 1/(1 + e^(βε))이고 분산은 p(1 − p)ε²이니까, kT²으로 나누면 C/k = (βε)² p(1 − p)예요. βε = 10이면 0.0045, 5면 0.166, ln 2면 0.107, 0.1이면… 0.0025요? 뜨거워지니까 다시 작아졌어요.

이서연 S06
이서연

이상한데. 분산 p(1 − p)ε²은 p가 1/2에 가까울수록 커지잖아. βε = 0.1이면 p = 0.475라서 분산이 0.249ε²로 네 경우 중에 제일 커. 요동이 제일 큰데 응답이 제일 작다고?

선생님 T14
선생님

분산을 무엇으로 나눴는지 보세요.

이서연 S07
이서연

아, kT²이요. 온도가 높을 때는 분산이 조금 커지는 것보다 T²이 훨씬 빨리 커지니까요. 그런데 식을 떠나서 왜 그런지 말로 하고 싶어요.

선생님 T02
선생님

온도를 무한히 올리면 평균 에너지는 어디까지 가죠?

김민준 M07
김민준

p가 1/2을 못 넘으니까 ε/2에서 막혀요. 아, 이미 거의 막힌 곳에서는 온도를 더 올려도 평균 에너지가 늘 데가 없네요. 반대로 βε = 10처럼 차가우면 덩어리 ε가 kT보다 너무 커서 거의 아무도 못 들뜨고요.

선생님 T13
선생님

그래서 열용량은 그 사이에 봉우리가 있어요. 계산해 보면 βε ≈ 2.4(kT ≈ 0.42ε)에서 C ≈ 0.44k로 가장 커요. 에너지 준위가 몇 개로 제한된 물질의 열용량에서 실제로 관찰되는 봉우리이고, 쇼트키 봉우리(Schottky anomaly, 예상에서 벗어난 봉우리라는 뜻)라 불러요. 봉우리의 위치를 재면 거꾸로 준위 사이의 간격 ε를 알아낼 수 있어요.

직접 움직여 보기두 상태 입자의 열용량새 창에서 열기 ↗

문제 4. temperature가 가장 잘 먹히는 구간

언어 모델이 다음 토큰 후보 셋에 로짓 z = (2, 1, 0)을 내놓았다. 샘플링 온도 τ를 조금 바꿀 때 출력 분포의 엔트로피 H가 얼마나 변하는지 나타내는 ∂H/∂ln τ를 τ = 0.5, 1, 2에서 구하라. 이 반응이 가장 큰 τ는 어디쯤인가? (풀어 본 뒤 위젯 1에서 로짓 (2, 1, 0)을 골라 확인해 보자.)

김민준 M02
김민준

엔트로피를 τ로 수치 미분하면 되긴 할 텐데, 식으로 바로 나오는 방법이 있을 것 같아요.

선생님 T01
선생님

열용량을 엔트로피로 적은 식이 있었죠. softmax를 볼츠만 분포로 읽으면 무엇이 무엇에 대응하죠?

이서연 S02
이서연

에너지가 −z, 온도가 τ, k = 1이에요. 엔트로피로 적은 식 C = ∂S/∂ln T에서 S 자리가 H, T 자리가 τ니까, 구하는 게 이 계의 열용량이네요.

김민준 M07
김민준

열용량은 요동-응답 관계로 에너지의 분산에서 나왔지. Var(E)/kT².

이서연 S08
이서연

그럼 ∂H/∂ln τ = Var_p(z)/τ². 로짓의 분산을 τ²으로 나눈 값이에요. 에너지에 붙은 마이너스는 제곱하면 사라지고요.

김민준 M04
김민준

그럼 (2, 1, 0)의 분산은 평균이 1이니까 (1 + 0 + 1)/3 = 0.667이고, τ = 1에서 0.667이에요.

이서연 S06
이서연

잠깐, 그건 세 로짓을 똑같이 친 분산이잖아. 볼츠만 분포의 분산이면 softmax 확률을 곱해 평균해야지. τ = 1이면 확률이 (0.665, 0.245, 0.090)이야.

김민준 M11
김민준

아, 또 똑같이 평균 냈네요. 확률을 곱해 평균하면 τ = 1에서 로짓 분산이 0.424라서 0.424, τ = 0.5에서는 0.159/0.25 = 0.634, τ = 2에서는 0.590/4 = 0.148이에요. τ를 촘촘하게 바꿔 가며 돌려 보니 τ = 0.53 근처에서 0.637로 가장 커요. 이 로짓에서는 그 근처에서 temperature 값이 제일 잘 먹히네요.

이서연 S08
이서연

온도를 아주 낮추면 argmax 하나에 몰려서 반응이 없고, 아주 높이면 이미 고르게 퍼져서 반응이 없는 거네. 두 상태짜리 입자랑 똑같은 모양이야.