축퇴도: 같은 값끼리 묶어 더하기
동전을 던지면 앞면이 평균 몇 개 나오는지, 그 둘레에서 얼마나 흔들리는지를 따져 보았다. 이런 평균을 직접 구하려면 모든 미시상태에 걸쳐 어떤 양을 더해야 한다. 이를테면 동전 4개의 미시상태 16개 모두에 대해 앞면 개수를 더하고 싶다고 하자. 16개를 하나하나 더해도 되지만, 앞면 개수가 같은 것끼리 묶으면 다섯 번만 더하면 된다. 그런데 묶어서 더할 때 무엇을 조심해야 할까?
역사: 묶어서 세기의 함정
묶어서 셀 때 생기는 실수는 역사가 깊다. 1754년 프랑스의 수학자 달랑베르는 『백과전서』에 "동전을 두 번 던져 앞면이 한 번이라도 나올 확률은 2/3"이라고 썼다. 결과를 “첫 번째에 앞면 / 뒷면 뒤 앞면 / 둘 다 뒷면” 세 가지로 나누고 똑같이 1/3씩 준 것이다. 그러나 "첫 번째에 앞면"이라는 묶음 안에는 두 번째가 앞이든 뒤든 두 경우가 들어 있으므로, 정답은 3/4이다. 묶음마다 그 안에 든 경우가 몇 개인지를 빠뜨린 것이다.
묶어서 더하는 식
동전 4개로 먼저 해 보자. 「경우의 수」 절에서 센 표 그대로, 앞면이 0개부터 4개까지인 미시상태는 차례로 1, 4, 6, 4, 1개다. 16개 미시상태의 앞면 개수를 하나하나 더하는 대신 같은 값끼리 묶으면 0×1 + 1×4 + 2×6 + 3×4 + 4×1 = 32이고, 16으로 나누면 평균 앞면 개수 2가 나온다. 묶음마다 곱해 준 1, 4, 6, 4, 1을 빼고 0 + 1 + 2 + 3 + 4 = 10으로 더했다면 평균은 10/16이라는 엉뚱한 값이 되었을 것이다.
이 계산을 일반적으로 적어 보자. 미시상태 i마다 어떤 값 Eᵢ(예: 앞면 개수, 에너지)가 있고 그 함수 f(Eᵢ)를 모두 더한다고 하자. 동전 계산에서는 f(E) = E, 곧 앞면 개수 그대로를 더했고, 앞면 개수의 제곱을 평균 내고 싶다면 f(E) = E²을 더하면 된다. 이 합은 두 가지 방식으로 계산할 수 있다.
왼쪽은 미시상태 하나하나를 더한 것이고, 오른쪽은 같은 값을 갖는 미시상태끼리 묶어 더한 것이다. 묶어서 더할 때는 각 묶음에 미시상태가 몇 개 들어 있는지를 곱해 주어야 하는데, 그 개수가 g(E)다. 곧 g(E)는 값이 E인 미시상태의 개수이며, 물리에서는 축퇴도 (한 값에 묶인 미시상태의 수, degeneracy)라고 부른다. 동전 계산에서 곱해 준 1, 4, 6, 4, 1이 앞면 개수의 축퇴도이고, 달랑베르가 빠뜨린 것이 바로 이 g였다.
방금 한 계산은 확률로 가중한 평균, 즉 기댓값이다. 물리에서는 기댓값을 ⟨A⟩ = Σᵢ pᵢAᵢ(Σ는 시그마로 읽고, 모두 더하라는 기호다)로 쓰는데, 이는 ML의 𝔼[A]와 같은 것이다. 물리 교재에서는 E를 이미 에너지에 쓰고 있기 때문에 기댓값에는 괄호 표기를 쓴다.
ML에서: 토큰을 종류별로 묶어 더하기
언어 모델의 손실은 문장 속 토큰마다 −ln p(토큰)을 더한 것이다. 같은 토큰이 여러 번 나오는 문장이라면 이 합도 토큰 종류별로 묶어 계산할 수 있는데, 묶는 순간 달랑베르가 빠진 함정이 다시 기다린다. 어휘 빈도표(bag of words)로 문서를 다룰 때 나온 횟수를 남길지 "나왔다/안 나왔다"만 남길지 고르는 것도 같은 물음이다. 묶을 때 무엇을 곱해야 하는지는 아래 문제에서 직접 계산해 보자.
문제 7. 가중 평균과 분산
세 상태의 값이 Eᵢ = 0, 1, 2이고 확률이 pᵢ = 0.5, 0.3, 0.2일 때 ⟨E⟩, ⟨E²⟩, 분산 ⟨E²⟩ − ⟨E⟩²를 구하라.

0, 1, 2니까 평균은 1이요. np.mean([0, 1, 2]).

그건 세 상태의 확률이 같을 때만 맞아요. 여기선 확률이 다르죠. ⟨E⟩ = Σᵢ pᵢEᵢ예요.

0×0.5 + 1×0.3 + 2×0.2 = 0.7이네요.

학점 평균과 같아요. 3학점 A와 1학점 C를 평균할 때 과목 수가 아니라 학점 수로 가중하죠. pᵢ가 그 학점 역할이에요.

⟨E²⟩는 ⟨E⟩²이니까 0.49, 분산은 0.49 − 0.49 = 0… 민준아, 이거 이상해. 분산이 0이면 값이 하나로 고정돼 있다는 거잖아.

이상하다고 느낀 게 좋아요. ⟨E²⟩는 E²의 평균이지 평균의 제곱이 아니에요. 0×0.5 + 1×0.3 + 4×0.2 = 1.1이고, 분산은 1.1 − 0.49 = 0.61입니다.
두 반의 평균이 둘 다 70점이라고 해 봐요. 한 반은 전원 70점, 다른 반은 절반이 40점, 절반이 100점. 점수 제곱의 평균은 첫 반이 4900, 둘째 반이 (1600 + 10000)/2 = 5800이에요. 그 차이 900이 둘째 반의 분산이죠. ⟨E²⟩ = ⟨E⟩²가 되는 건 첫 반처럼 모두 같은 값일 때뿐입니다.

ML 강의에서는 𝔼[E²]라고 썼던 것 같아요.

같은 뜻이에요. 물리 책에서 괄호 ⟨ ⟩를 쓰는 건 E가 에너지 기호로 이미 쓰이기 때문입니다.
문제 8. 묶어서 셀 때 빠뜨리는 것
입자 3개가 각각 에너지 0 또는 ε(엡실론)를 가진다. (a) 가능한 총에너지 E와 각각의 g(E)를 구하라. (b) 각 미시상태에 x^(E/ε)라는 값을 매길 때 모든 미시상태에 걸친 그 값의 합을 미시상태별 합(8항)과 에너지별 합(4항)으로 쓰고, (1 + x)³과 같은지 확인하라.

에너지는 0, ε, 2ε, 3ε이니까 에너지별 합은 1 + x + x² + x³.

나는 미시상태 8개를 다 썼는데 1 + 3x + 3x² + x³이 나와. 네 거랑 다른데?

서연 학생이 맞아요. 민준 학생은 에너지별로 묶을 때 그 에너지에 속한 미시상태 수 g(E)를 빠뜨렸어요. E = ε인 미시상태는 (ε, 0, 0), (0, ε, 0), (0, 0, ε) 세 개죠. g = 1, 3, 3, 1이고, 올바른 식은 Σ_E g(E)·x^(E/ε)입니다. 달랑베르가 "첫 번째에 앞면"을 한 경우로 센 것과 같은 실수예요.

주사위 두 개의 합도 그렇겠네요. 합 7은 여섯 가지, 합 2는 한 가지뿐이라 2부터 12까지가 같은 확률이 아니고요.

그런데 이게 왜 (1 + x)³으로 인수분해돼요?

입자들이 상태를 서로 독립적으로 고르기 때문이에요. 세트 메뉴에서 버거 3종류, 음료 4종류를 독립적으로 고르면 조합이 3 × 4 = 12인 것과 같아요. 입자 하나의 합은 1 + x이고, 세 입자면 곱해져서 (1 + x)³. 전개하면 나오는 이항계수 1, 3, 3, 1이 바로 g(E)입니다.

서연아, 동전 4개 표의 1, 4, 6, 4, 1도 (1 + x)⁴를 전개한 계수네.

응. 묶으면 항상 몇 개를 묶었는지 곱해야 돼.
문제 9. 문장의 loss를 토큰 종류별로 묶어 더하기
문장 "the cat saw the dog and the cat ran"의 토큰 9개에 언어 모델이 준 확률이 the 0.2, cat 0.05, 나머지 네 종류(saw, dog, and, ran)는 각각 0.01이다. 문장 전체의 loss Σ −ln p(토큰)을 토큰 종류별로 묶어서 구하라.

종류가 여섯 개니까 −ln 0.2 − ln 0.05 − 4 ln 0.01 = 1.61 + 3.00 + 18.42 = 23.03이요.

민준아, 그건 달랑베르랑 같은 실수 아니야? the는 세 번, cat은 두 번 나왔잖아. 묶었으면 몇 번 나왔는지를 곱해야지.

서연 학생 말이 맞아요. 나온 횟수가 축퇴도 g 자리예요. 3 × 1.61 + 2 × 3.00 + 4 × 4.61 = 29.24입니다. 토큰 9개를 하나하나 더한 값과 같아요.

장바구니 영수증에서 같은 우유 세 개를 한 줄로 묶어도 "× 3"을 빼먹으면 안 되는 거랑 같네요.