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

가장 큰 항: 큰 계의 ln Z는 승자 하나가 거의 정한다

에너지 값마다 점수 ln g − βE를 매기면, 점수가 가장 큰 에너지 값이 가장 자주 관찰되는 승자였다. 그런데 분배함수 Z는 승자 하나가 아니라 에너지 값마다의 비중 g·e^(−βE)를 모두 더한 것이다. 승자의 항 하나는 Z라는 합에서 얼마나 큰 비율을 차지할까? 들뜬 상태의 볼츠만 인자가 1/2인 온도(βε = ln 2)의 2준위 입자로, 모든 항을 더한 ln Z와 가장 큰 항 하나의 점수를 나란히 놓고 입자 수를 늘려 보자.

N ln Z 승자 n 최대 점수 차이 최대 점수 / ln Z
3 1.216 1 0.405 0.811 0.333
30 12.164 10 10.287 1.877 0.846
300 121.640 100 118.620 3.020 0.975
3000 1216.395 1000 1212.225 4.170 0.997

입자가 세 개일 때는 가장 큰 항이 ln Z의 3분의 1밖에 설명하지 못하지만, 입자가 3,000개이면 99.7%를 설명한다. 차이도 조금씩 자라기는 하지만, ln Z가 입자 수에 비례해 10배씩 커지는 동안 차이는 1.1 남짓씩만 늘어난다. Z는 N + 1개의 항을 모두 더한 것인데, 입자가 많아지면 왜 그 로그가 가장 큰 항 하나로 거의 정해질까?

입자 수를 3, 30, 300, 3,000으로 늘릴 때 들뜬 입자 비율의 확률(위)과 ln Z 가운데 가장 큰 항 하나의 점수가 차지하는 비율 최대 점수/ln Z(아래). 봉우리는 1/3에서 점점 좁아지고, 비율은 0.333, 0.846, 0.975, 0.997로 1에 다가간다.
입자 수를 3, 30, 300, 3,000으로 늘릴 때 들뜬 입자 비율의 확률(위)과 ln Z 가운데 가장 큰 항 하나의 점수가 차지하는 비율 최대 점수/ln Z(아래). 봉우리는 1/3에서 점점 좁아지고, 비율은 0.333, 0.846, 0.975, 0.997로 1에 다가간다.

합의 로그와 가장 큰 항

분배함수를 에너지 값별로 묶어 쓰면 Z = Σ_E g(E)e^(−βE)이고, 각 항을 지수 하나로 모으면 Z = Σ_E e^(ln g(E) − βE)가 된다. 괄호 안이 바로 앞에서 매긴 점수다. 그러니 ln Z는 점수들의 logsumexp이고, ML을 해 본 독자라면 logsumexp가 max를 부드럽게 만든 함수라는 것을 알고 있을 것이다. 이 사실을 부등식으로 적어 두자. 더하는 항은 모두 양수이므로 합은 가장 큰 항보다 크고, 항이 M개이면 합은 가장 큰 항의 M배를 넘지 못한다.

max⁡E(ln⁡g(E)−βE)  ≤  ln⁡Z  ≤  max⁡E(ln⁡g(E)−βE)+ln⁡M\max_{\textcolor{#ff7f0e}{E}} \big( \ln \textcolor{#d62728}{g}(\textcolor{#ff7f0e}{E}) - \textcolor{#8c564b}{\beta} \textcolor{#ff7f0e}{E} \big) \;\le\; \ln \textcolor{#667733}{Z} \;\le\; \max_{\textcolor{#ff7f0e}{E}} \big( \ln \textcolor{#d62728}{g}(\textcolor{#ff7f0e}{E}) - \textcolor{#8c564b}{\beta} \textcolor{#ff7f0e}{E} \big) + \ln \textcolor{#1f77b4}{M}
Z분배함수g(E)에너지가 E인 미시상태의 개수 (축퇴도)E에너지 값 (max는 가능한 에너지 값 가운데서 고른다)β열원의 역온도M서로 다른 에너지 값의 개수\begin{array}{ll} \textcolor{#667733}{Z} & \text{분배함수} \\ \textcolor{#d62728}{g}(\textcolor{#ff7f0e}{E}) & \text{에너지가 E인 미시상태의 개수 (축퇴도)} \\ \textcolor{#ff7f0e}{E} & \text{에너지 값 (max는 가능한 에너지 값 가운데서 고른다)} \\ \textcolor{#8c564b}{\beta} & \text{열원의 역온도} \\ \textcolor{#1f77b4}{M} & \text{서로 다른 에너지 값의 개수} \end{array}

2준위 입자 N개에서는 에너지 값이 N + 1개뿐이므로, ln Z와 최대 점수의 차이는 ln(N + 1)을 넘지 못한다. 반면 점수 자체는 입자 수에 비례해 커진다. N = 3,000이면 차이의 상한은 ln 3001 = 8.0이고 실제 차이는 4.17인데, ln Z는 1,216이다. 입자 수가 아보가드로수쯤 되면 ln Z는 10²³의 크기이고 차이는 기껏해야 수십이므로, 둘을 구별할 방법이 없다. 실제 차이가 상한의 절반쯤인 것은 승자 근처의 항들이 승자와 거의 같은 크기로 함께 더해지기 때문인데, ln Z와 최대 점수의 차이가 무엇을 재는지는 아래 코드로 확인한다.

경우의 수의 로그에 볼츠만 상수를 곱한 것이 엔트로피 S(E) = k ln g(E)이므로 점수에 −kT를 곱하면 E − TS(E)가 된다. 그러니 「큰 계의 ln Z는 최대 점수와 거의 같다」는 결과를 물리의 말로 옮기면 다음과 같다. 큰 계에서 −kT ln Z는 겨루기의 승자가 거둔 E − TS와 거의 같다.

−kTln⁡Z  ≈  min⁡E(E−T S(E)),S(E)=kln⁡g(E)-\textcolor{#7f7f7f}{k}\textcolor{#8c564b}{T} \ln \textcolor{#667733}{Z} \;\approx\; \min_{\textcolor{#ff7f0e}{E}} \big( \textcolor{#ff7f0e}{E} - \textcolor{#8c564b}{T}\, \textcolor{#9467bd}{S}(\textcolor{#ff7f0e}{E}) \big), \qquad \textcolor{#9467bd}{S}(\textcolor{#ff7f0e}{E}) = \textcolor{#7f7f7f}{k} \ln \textcolor{#d62728}{g}(\textcolor{#ff7f0e}{E})
k볼츠만 상수 (ML에서는 1)T열원의 온도Z분배함수E계의 에너지 값S(E)에너지가 E인 상태들의 엔트로피g(E)축퇴도≈계가 크면 차이가 무시할 만큼 작아진다\begin{array}{ll} \textcolor{#7f7f7f}{k} & \text{볼츠만 상수 (ML에서는 1)} \\ \textcolor{#8c564b}{T} & \text{열원의 온도} \\ \textcolor{#667733}{Z} & \text{분배함수} \\ \textcolor{#ff7f0e}{E} & \text{계의 에너지 값} \\ \textcolor{#9467bd}{S}(\textcolor{#ff7f0e}{E}) & \text{에너지가 E인 상태들의 엔트로피} \\ \textcolor{#d62728}{g}(\textcolor{#ff7f0e}{E}) & \text{축퇴도} \\ \approx & \text{계가 크면 차이가 무시할 만큼 작아진다} \end{array}

코드로 확인하기

위 표를 코드로 다시 만들어 보자. 2준위 입자 N개에서 에너지 값마다 점수 ln g − βE를 계산해 승자를 찾고, 정확한 ln Z = N ln 1.5와의 차이를 출력한다. 마지막 칸은 차이가 무엇을 재는지 짐작해 보려고 함께 찍은 값이다.

from math import lgamma, log, pi

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

def score(N, n):                       # ln g(E) − βE, 들뜬 입자 n개인 에너지 값의 「점수」
    return lgamma(N + 1) - lgamma(n + 1) - lgamma(N - n + 1) - n * beta_eps

print(" N      ln Z    승자 n   최대 점수     차이   ½ln(2πN·p(1−p))")
for N in (3, 30, 300, 3000):
    lnZ = N * log(1 + 0.5)                                  # Z = (1 + e^(−βε))^N
    n_best = max(range(N + 1), key=lambda n: score(N, n))
    gap = lnZ - score(N, n_best)
    print(f"{N:5d} {lnZ:9.3f} {n_best:6d} {score(N, n_best):11.3f} {gap:8.3f} "
          f"{0.5 * log(2 * pi * N * (1/3) * (2/3)):9.3f}")
#  N      ln Z    승자 n   최대 점수     차이   ½ln(2πN·p(1−p))
#     3     1.216      1       0.405    0.811     0.716
#    30    12.164     10      10.287    1.877     1.867
#   300   121.640    100     118.620    3.020     3.019
#  3000  1216.395   1000    1212.225    4.170     4.170

「차이」 칸의 값은 입자가 10배 늘 때마다 약 1.15(= ½ ln 10)씩 늘어나고, 마지막 칸의 ½ ln(2πN·p(1 − p))와 N이 커질수록 소수 셋째 자리까지 맞는다. 여기서 p = 1/3은 입자 하나가 들떠 있을 확률이고, Np(1 − p)는 들뜬 입자 수의 분산이다. 그러니 ln Z와 가장 큰 항의 차이는 승자 근처에서 함께 더해지는 항들이 몇 개쯤인지, 다시 말해 봉우리 폭의 로그를 잰 값이다. 폭은 √N으로만 자라므로 그 로그는 N에 비하면 무시할 만하다.

ML에서: logsumexp는 부드러운 max다

분류기의 로짓에 쓰는 logsumexp도 같은 부등식을 따른다. 로짓이 M개이면 logsumexp는 가장 큰 로짓보다 크고, 가장 큰 로짓에 ln M을 더한 값보다 작다. 라이브러리가 가장 큰 로짓 m을 먼저 빼고 m + ln Σᵢe^(zᵢ − m)으로 계산하는 것도 이 부등식의 모양을 따른 것이다. 첫 항 m이 가장 큰 항이고, 둘째 항 ln Σᵢe^(zᵢ − m)은 0과 ln M 사이에서 나머지 항들이 보태는 양이다.

문제 3. 확성기 하나와 관중 2만 명

소리의 크기를 재는 데시벨(dB)은 귀에 닿는 소리 에너지(단위 넓이에 1초 동안 닿는 양) I를 기준값 I₀와 견준 10 log₁₀(I/I₀)이고, 따로 나는 소리들이 겹치면 I가 더해진다. 야구장에서 응원단장의 확성기 하나가 관중석의 한 자리에 80 dB로 들리고, 관중 2만 명이 저마다 웅성거리는 소리는 그 자리에 한 사람당 40 dB로 들린다고 하자. (가) 모두 합치면 몇 dB인가? 확성기와 관중 가운데 어느 쪽이 더 크게 들리는가? (나) 관중이 몇 명일 때 두 쪽이 같아지는가? (다) 소리 2만 1개가 겹칠 때 전체 dB는 가장 큰 소리의 dB보다 얼마까지 커질 수 있는가?

김민준 M01
김민준

80 dB와 40 dB면 40이나 차이 나요. dB는 10씩 오를 때마다 에너지가 10배니까 확성기 하나가 관중 한 명의 1만 배예요. 관중 소리는 무시하고 (가)는 거의 80 dB겠죠.

선생님 T01
선생님

관중이 한 명이 아니죠. 에너지로 바꿔서 더해 볼까요?

김민준 M05
김민준

확성기가 I₀의 10⁸배, 관중 한 명이 10⁴배니까 2만 명이면 2 × 10⁸배… 관중 쪽이 확성기의 두 배네요. 합이 3 × 10⁸배라 10 log₁₀(3 × 10⁸) = 84.8 dB예요. 한 명 한 명은 1만분의 1인데 머릿수로 이겼어요.

이서연 S01
이서연

(나)는 관중 쪽이 10⁸배가 되면 되니까 1만 명이야. 관중 소리만 따로 재면 2만 명일 때 40 + 10 log₁₀ 20000 = 83.0 dB고.

선생님 T01
선생님

(다)는 앞에서 본 부등식으로 풀 수 있어요. 무엇이 무엇에 해당하죠?

이서연 S02
이서연

dB는 에너지 합의 로그에 10을 곱한 거니까 logsumexp랑 같은 꼴이에요. 그럼 합이 가장 큰 항의 몇 배까지 될 수 있느냐를 보면 되겠네요.

김민준 M03
김민준

소리가 2만 1개니까, 전부 가장 큰 소리만큼 크면 20,001배겠네.

이서연 S09
이서연

응, 그게 끝이야. 합은 가장 큰 항의 20,001배를 넘지 못하니까 전체는 가장 큰 소리보다 10 log₁₀ 20001 = 43.0 dB까지만 커져. 모두가 확성기처럼 80 dB로 소리칠 때 그 끝에 닿고.

선생님 T02
선생님

2준위 입자로 옮기면 무엇이 무엇이죠?

이서연 S01
이서연

확성기가 바닥 상태 하나고, 관중이 한 명씩은 작아도 수가 많은 들뜬 상태들이에요.

김민준 M01
김민준

학과 행사비를 교수님 한 분(확성기)이 10만 원 내고 학생 2백 명(관중)이 천 원씩 내면, 학생들이 낸 합이 20만 원으로 더 큰 거랑 같네요.

문제 4. 어휘 5만 개의 logsumexp

토큰 50,000개의 어휘에서 다음 토큰의 로짓을 내는 언어 모델이 있다. (가) 로짓이 모두 0이면 logsumexp는 얼마인가? (나) 한 토큰의 로짓만 10이고 나머지가 모두 0이면? (다) 그 한 토큰의 로짓이 12이면? 각 경우 가장 큰 로짓과의 차이가 무엇을 세는지 말하라.

김민준 M01
김민준

(가)는 ln 50000 = 10.82요. 부등식의 위쪽 끝이에요. (나)는 e¹⁰ = 22,026이 e⁰ = 1보다 압도적으로 크니까 나머지는 무시하고 거의 10이겠죠.

이서연 S01
이서연

하나하나는 2만분의 1이지만 49,999개나 있잖아. 49,999 × e⁻¹⁰ = 2.27이면 가장 큰 항 두 개어치가 넘어.

김민준 M04
김민준

그럼 logsumexp = 10 + ln(1 + 2.27) = 11.18이에요. 무시할 수 있는 게 아니었네요. (다)는 49,999 × e⁻¹² = 0.31이라 12 + ln 1.31 = 12.27이고요.

선생님 T01
선생님

가장 큰 로짓과의 차이 1.18, 0.27, 그리고 (가)의 10.82는 각각 무엇의 로그죠?

이서연 S11
이서연

합을 가장 큰 항으로 나눈 값의 로그예요. 가장 큰 항 몇 개어치가 모였는지를 세는 거죠. (가)는 모두 같으니까 5만 개어치, (나)는 3.27개어치, (다)는 1.31개어치고요.

김민준 M03
김민준

그럼 가장 큰 토큰의 확률은 어떻게 돼?

이서연 S07
이서연

가장 큰 항을 합으로 나눈 거니까 그 역수야. (나)에서는 1/3.27 = 0.31, (다)에서는 0.76이야.

선생님 T13
선생님

2준위 입자 수를 늘렸을 때의 ln Z와 같은 구조예요. 항 하나하나가 작아도 개수가 많으면 합에서 큰 비율을 차지하고, 가장 큰 항이 합을 거의 정하는지는 둘의 겨루기로 정해져요.