7장 — 볼츠만 분포

볼츠만 분포: 비례를 확률로

열원과 맞닿은 계가 미시상태 i에 있을 확률은 e^(−βEᵢ)에 비례한다는 것까지 왔다. 하지만 「비례한다」만으로는 아직 확률이 아니다. 모든 상태의 확률을 더하면 1이 되어야 하니, 각 상태의 비중을 어떤 수로 나눠 주어야 할까?

모든 볼츠만 인자의 합으로 나누기

답은 간단해서, 모든 미시상태의 e^(−βEᵢ)를 더한 합 Z로 나누면 된다(글자 Z는 독일어 Zustandssumme, 곧 「상태들의 합」의 머리글자다). 합이 1이 되게 나누기(정규화) 전의 이 값 e^(−βEᵢ)는 오늘날 볼츠만 인자라 부르는 바로 그 지수 인자이고, 이렇게 정규화해서 얻은, 온도 T인 열원과 맞닿은 계가 미시상태 i에 있을 확률의 분포를 볼츠만 분포 (열원과 맞닿은 계의 상태 분포, Boltzmann distribution)라 한다. 깁스가 1902년의 통계역학 교과서에서 이 분포를 「정준 분포」(canonical distribution, 정준은 「기준이 되는」이라는 뜻)라 불러서, 지금도 두 이름을 함께 쓴다.

pi=e−βEiZ,Z=∑ie−βEi,β=1kT\textcolor{#e377c2}{p_i} = \frac{e^{-\textcolor{#8c564b}{\beta} \textcolor{#ff7f0e}{E_i}}}{\textcolor{#667733}{Z}}, \qquad \textcolor{#667733}{Z} = \sum_i e^{-\textcolor{#8c564b}{\beta} \textcolor{#ff7f0e}{E_i}}, \qquad \textcolor{#8c564b}{\beta} = \frac{1}{\textcolor{#7f7f7f}{k} \textcolor{#8c564b}{T}}
pi미시상태 i에 있을 확률Ei미시상태 i의 에너지β역온도 (열원이 정한다)Z분배함수 (모든 볼츠만 인자의 합)k볼츠만 상수 (ML에서는 1)T열원의 온도i미시상태 번호\begin{array}{ll} \textcolor{#e377c2}{p_i} & \text{미시상태 i에 있을 확률} \\ \textcolor{#ff7f0e}{E_i} & \text{미시상태 i의 에너지} \\ \textcolor{#8c564b}{\beta} & \text{역온도 (열원이 정한다)} \\ \textcolor{#667733}{Z} & \text{분배함수 (모든 볼츠만 인자의 합)} \\ \textcolor{#7f7f7f}{k} & \text{볼츠만 상수 (ML에서는 1)} \\ \textcolor{#8c564b}{T} & \text{열원의 온도} \\ i & \text{미시상태 번호} \end{array}

ML에서는 k = 1로 두므로 β = 1/T다. 이 식에서 확률에 실제로 영향을 주는 것은 에너지의 차이뿐이다. 두 상태의 확률 비는 pᵢ/pⱼ = e^(−β(Eᵢ − Eⱼ))라서 에너지가 kT만큼 높은 상태는 e배 드물다.

에너지가 0, 1, 2인 세 상태(k = 1)의 볼츠만 분포를 세 온도에서 그린 것. T = 0.2이면 바닥 상태가 0.993을 차지해 거의 얼어붙고, T = 1이면 0.665, 0.245, 0.090으로 나뉘며, T = 5이면 0.402, 0.329, 0.269로 고른 쪽에 가까워진다. 에너지 사다리는 그대로이고 온도만 바뀌었다
에너지가 0, 1, 2인 세 상태(k = 1)의 볼츠만 분포를 세 온도에서 그린 것. T = 0.2이면 바닥 상태가 0.993을 차지해 거의 얼어붙고, T = 1이면 0.665, 0.245, 0.090으로 나뉘며, T = 5이면 0.402, 0.329, 0.269로 고른 쪽에 가까워진다. 에너지 사다리는 그대로이고 온도만 바뀌었다

온도의 양 끝

온도의 양 끝도 이 식에서 바로 읽힌다. T → 0이면 β → ∞라서 에너지가 가장 낮은 상태, 곧 바닥 상태(ground state)를 뺀 모든 볼츠만 인자가 0으로 가고 계는 바닥 상태에만 있게 된다. T → ∞이면 β → 0이라서 모든 볼츠만 인자가 1이 되고, 모든 미시상태가 같은 확률을 갖는다. 볼츠만 분포는 바닥 상태 하나에 몰린 분포와 완전히 고른 분포 사이를 온도 하나로 잇는다.

ML에서: softmax는 볼츠만 분포다

온도 τ인 softmax pᵢ = e^(zᵢ/τ)/Σⱼe^(zⱼ/τ)는 에너지를 Eᵢ = −zᵢ, 역온도를 β = 1/τ로 둔 볼츠만 분포다. 물리에서는 에너지가 낮을수록 선호되고 ML에서는 로짓이 높을수록 선호되므로 마이너스가 하나 붙는다. 두 언어를 나란히 놓으면 다음과 같다.

볼츠만 분포 softmax
미시상태 i 후보 i (클래스, 토큰, 키)
에너지 Eᵢ 로짓에 마이너스를 붙인 −zᵢ
역온도 β 1/τ
분배함수 Z Σ e^(zᵢ/τ)
ln Z logsumexp(z/τ)
에너지 기준점 로짓 전체에 더한 상수
바닥 상태 (T → 0) argmax, greedy 디코딩
T → ∞ 균등 분포

softmax라는 이름은 1989~1990년 브라이들이 분류 신경망의 출력을 확률로 읽는 논문에서 지수함수로 정규화하는 출력층에 붙인 것이다. 가장 큰 값 하나만 고르는 argmax를 부드럽게 만든 것이라는 뜻인데, 표의 마지막 두 줄이 말하듯 온도를 0으로 보내면 정말 argmax가 된다.

문제 3. softmax를 볼츠만 분포로 번역하기

로짓 z = (2, 1, 0)을 온도 τ = 0.5인 softmax로 확률로 바꾼다. 이것을 볼츠만 분포로 읽을 때 각 후보의 에너지, 역온도 β, 분배함수 Z와 ln Z는 무엇인가? 또 온도를 에너지 안에 흡수해 처음부터 E′ = −z/τ 하나로 쓰면 무엇을 잃는가?

김민준 M04
김민준

쉽네요. softmax는 로짓을 온도로 나눈 뒤 지수를 취하니까 에너지는 E = −z/τ = (−4, −2, 0)이고, 역온도는 β = 1/τ = 2예요. 볼츠만 인자는 e^(−βE) = (e⁸, e⁴, 1)이고 정규화하면 (0.982, 0.018, 0.0003)… 1등이 거의 다 가져가네요.

이서연 S12
이서연

온도를 두 번 썼어. 에너지를 만들 때 τ로 한 번 나누고, β = 1/τ를 곱하면서 또 나눴잖아. 그러면 온도가 0.5가 아니라 0.25인 softmax가 돼.

김민준 M11
김민준

아, E = −z에 β = 2이거나, E′ = −z/τ에 β = 1이거나 둘 중 하나였네요. 앞의 것으로 다시 하면 볼츠만 인자는 (e⁴, e², 1) = (54.60, 7.39, 1), Z = 62.99, ln Z = 4.143이에요. 확률은 (0.867, 0.117, 0.016)이고, torch.logsumexp(z / 0.5)를 찍어 봐도 4.143이 나와요.

선생님 T13
선생님

맞아요. 로짓이 가장 큰 후보가 바닥 상태고, τ → 0이 절대영도예요. 이제 둘째 질문이에요. 민준 학생이 말한 두 방식 가운데 뒤의 것, 곧 처음부터 E′ = −z/τ라는 에너지 하나로 쓰는 방식만 늘 쓰면 안 될까요? 확률에는 어차피 이 곱만 들어가잖아요.

이서연 S06
이서연

수학적으로는 같은 분포예요. 오히려 z와 τ를 동시에 두 배로 해도 분포가 같으니까, 샘플만 보고는 둘을 구별할 수도 없어요. 굳이 나눠 둘 이유가 없어 보이는데요.

선생님 T14
선생님

구별할 수 없다는 것까지 정확해요. 그런데 이 장에서 β는 어디서 왔죠?

이서연 S08
이서연

열원이요. E는 작은 계의 상태마다 정해진 값이고, β는 맞닿은 열원의 ln W가 에너지에 따라 줄어드는 비율이었어요. …아, 둘은 출처가 달라요. 같은 계를 다른 열원에 붙이면 E는 그대로고 β만 바뀌어요.

선생님 T01
선생님

그래서 나눠 두면 「같은 모델을 다른 조건에서 쓴다」는 말을 할 수 있어요. 학습이 끝난 분류기의 로짓은 그대로 두고 검증 데이터로 τ 하나만 맞춰 과신을 줄이는 온도 보정(temperature scaling, Guo 외 2017)이 그 예예요. 정답률은 그대로이고 확신의 정도만 바뀌죠. 흡수해 버리면 이런 조절을 하려고 모델을 다시 학습해야 해요.

김민준 M07
김민준

언어 모델도 체크포인트는 그대로 두고 generate()의 temperature 인자만 바꾸잖아요. 에너지는 체크포인트에, 온도는 함수 인자에 들어 있었던 거네요.

이서연 S11
이서연

온도가 로짓과 nat(자연로그 ln으로 잰 값에 붙이는 단위) 사이의 환율이라는 얘기를 들었을 때는 그냥 눈금 같았는데, 환율을 정하는 게 바깥의 열원이라서 따로 떼어 둘 수 있는 거였어.