2장 — 엔트로피

단위: 같은 엔트로피를 nat, bit, J/K로

지금까지 엔트로피를 세 가지 모습으로 만났다. 클라우지우스의 Q/T는 J/K로 쟀고, 볼츠만의 ln W는 단위 없는 수였고, 스무고개에서는 질문 수 log₂ W로 셌다. 값이 제각각으로 보이는데, 이것들은 정말 같은 양일까?

역사: 계전기 하나가 담는 양

로그의 밑을 무엇으로 할지는 통신 공학자들도 따져야 했다. 1948년 섀넌은 정보의 양을 재는 논문에서, 로그의 밑을 고르는 일이 곧 단위를 고르는 일이라고 적었다. 밑을 2로 하면 그 단위를 이진 숫자(binary digit), 줄여서 bit라 부를 수 있고, 이 줄임말은 통계학자 존 튜키가 제안한 것이라고 밝혔다. 섀넌이 든 예는 켜짐과 꺼짐 두 상태만 갖는 계전기(릴레이. 전류로 스위치를 여닫는 부품)다. 계전기 하나는 1 bit를 담고, N개를 모으면 상태가 2ᴺ가지이므로 log₂ 2ᴺ = N bit를 담는다. 계전기를 하나 더 달면 상태의 수는 두 배가 되지만 bit는 1만 는다. 섀넌은 로그로 재는 첫째 까닭으로 바로 이것을 들었다. 부품의 수나 전송 시간처럼 공학에서 따지는 양은 경우의 수가 아니라 경우의 수의 로그에 비례한다는 것이다. 밑을 10으로 하면 단위는 십진 숫자(decimal digit)가 된다고도 적었으니, 섀넌에게 밑을 고르는 일은 처음부터 눈금을 고르는 일이었다.

같은 엔트로피도 로그의 밑과 상수 k를 어떻게 고르느냐에 따라 세 가지 단위로 잰다. 그래서 값이 다르게 보이더라도, 단위를 맞춰 보면 모두 같은 양이다.

단위 식 주로 쓰는 곳
nat ln W 물리 이론, PyTorch의 loss
bit log₂ W 정보이론, 압축, 생성 모델의 bits per dim
J/K k ln W 실험 열역학

단위 사이의 환산은 다음 세 가지만 알면 충분하다.

힌트를 들은 뒤 남은 엔트로피

엔트로피 값을 읽을 때 단위만큼 자주 놓치는 것이 하나 더 있다. 엔트로피가 "아직 모르는 양"이라면, 무언가를 알게 되었을 때 그 양은 얼마나 줄어들까? 힌트 하나가 엔트로피를 얼마나 줄이는지 세어 보자. 휴대폰 잠금 비밀번호가 좋은 예다. 0과 1로 된 4자리 비밀번호는 16개이므로 엔트로피는 4 bit다. 그런데 "1이 두 개"라는 힌트를 들으면 후보는 6개로 줄고, 남은 엔트로피는 log₂ 6 ≈ 2.58 bit가 된다. 그러므로 힌트가 준 정보는 4 − 2.58 = 1.42 bit다.

0과 1로 된 4자리 비밀번호 16개. 힌트 「1이 두 개」를 들으면 노란 칸 6개만 남아 엔트로피가 4 bit에서 2.58 bit로 준다.
0과 1로 된 4자리 비밀번호 16개. 힌트 「1이 두 개」를 들으면 노란 칸 6개만 남아 엔트로피가 4 bit에서 2.58 bit로 준다.

이처럼 엔트로피는 늘 무엇을 알고 난 뒤에 남은 양이다. 이렇게 보면 볼츠만의 S = k ln W도 처음부터 “이 거시상태를 알 때” 남은 값이었다. 정보이론 교재에서는 이런 값을 가능한 힌트 전체에 대해 확률로 평균한 것을 조건부 엔트로피(conditional entropy)라 부른다.

ML에서: 단위가 섞이는 곳

이 단위들이 실제로 섞이는 곳이 ML에도 있다. PyTorch의 cross_entropy는 자연로그를 쓰므로 그 값은 nat이다. 반면 이미지 생성 모델 논문은 성능을 보통 bits per dim (차원당 비트)으로 보고한다. 그러므로 이미지 하나의 음의 로그우도(negative log-likelihood, 줄여서 NLL. 모델이 그 이미지에 준 확률의 −ln)를 nat으로 계산했다면, 다음처럼 바꿔야 논문 값과 같은 단위가 된다.

bits per dim=NLL (nat)d⋅ln⁡2\textcolor{#9467bd}{\text{bits per dim}} = \frac{\textcolor{#9467bd}{\text{NLL (nat)}}}{\textcolor{#1f77b4}{d} \cdot \ln 2}
bits per dim차원당 비트 (논문이 보고하는 단위)NLL (nat)이미지 하나의 음의 로그우도 (negative log-likelihood), nat 단위d픽셀 값의 개수 (차원, CIFAR는 3072)\begin{array}{ll} \textcolor{#9467bd}{\text{bits per dim}} & \text{차원당 비트 (논문이 보고하는 단위)} \\ \textcolor{#9467bd}{\text{NLL (nat)}} & \text{이미지 하나의 음의 로그우도 (negative log-likelihood), nat 단위} \\ \textcolor{#1f77b4}{d} & \text{픽셀 값의 개수 (차원, CIFAR는 3072)} \end{array}

여기서 d는 픽셀 값의 개수로, CIFAR라면 3072다.

문제 6. 같은 엔트로피, 다른 단위

동전 5개에서 "앞면이 2개"인 거시상태의 엔트로피를 nat과 bit로 구하라.

김민준 M11
김민준

W = 10이니까 S = ln 10 ≈ 2.30이에요. 비트로도 2.30비트고요.

이서연 S06
이서연

민준아, 나는 5비트 같은데. 동전 5개면 질문 5번이면 다 알 수 있잖아.

선생님 T14
선생님

둘 다 반만 맞았어요. 민준 학생, 2.30은 자연로그로 재서 nat이에요. 비트는 log₂ 10 ≈ 3.32예요. 같은 거리를 미터와 피트로 재면 숫자가 다르지만 거리는 같은 것과 같아요. 숫자만 쓰고 단위를 안 쓰면 두 값을 비교할 수 없어요.

이서연 S03
이서연

그럼 제 5비트는요?

선생님 T01
선생님

질문 5번은 아무 힌트도 없을 때 필요한 수예요. 문제는 "앞면이 2개"라는 거시상태를 이미 안다고 했어요. 이제 후보가 10개라서 3.32번이면 돼요.

김민준 M07
김민준

그럼 5 − 3.32 = 1.68비트는 힌트가 준 정보량이에요?

선생님 T13
선생님

맞아요. 엔트로피를 말할 때는 항상 두 가지를 같이 적으세요. 무엇을 알고 난 뒤의 값인지, 그리고 어느 단위인지.

문제 7. 논문 표의 bits per dim과 비교하기

CIFAR 이미지(픽셀 값 3072개) 하나에 대해 내 모델의 음의 로그우도를 PyTorch로 계산했더니 6400이었다. 논문 표는 같은 데이터에서 bits per dim 3.05를 보고한다. 내 모델이 더 좋은가?

김민준 M11
김민준

6400을 3072로 나누면 약 2.08이니까, 논문의 3.05보다 훨씬 좋네요.

이서연 S05
이서연

문제 6에서 민준이 ln 값에 비트를 붙였던 거랑 같은 실수 같은데. PyTorch는 자연로그를 쓰니까 6400은 nat이잖아.

선생님 T14
선생님

맞아요. 1 bit = ln 2 nat이니까 nat을 bit로 바꾸려면 ln 2로 나눠야 해요. 6400 / (3072 × ln 2) ≈ 3.01 bit/dim이에요. 논문보다 조금 나은 정도죠.

김민준 M07
김민준

2.08과 3.01이면 약 1.44배 차이네요. 해외 레시피의 컵을 종이컵으로 재서 요리를 망친 거랑 같았어요. 숫자만 보고 단위를 안 본 거죠.