지수족

자연모수 θ: 지수 안에 들어앉는 좌표

같은 정규분포를 (μ, σ)로도 쓸 수 있고 다른 방식으로도 쓸 수 있다면, 어떤 방식이 분포의 '진짜 주소’일까?

집 주소 — 행정 구역의 언어

“서울시 강남구 역삼동 123” 이 주소는 행정 구역의 언어다. 주소를 보면 "강남구에 있구나"는 바로 알지만, "역삼역에서 몇 미터인가"는 바로 안 보인다.

θ는 지수족의 "행정 주소"다. 골격 exp(θ·t(x) − F(θ) + k(x))에서 θ는 지수 안에 직접 들어앉는 좌표다. 그래서 자연모수(natural parameter)라 부른다. 주소와 짝을 지어 보면 이렇다. θ를 보면 log p가 θ에 대해 곧은 식이라는 것, 곧 「어느 구에 있는지」는 바로 안다. 하지만 그 분포의 평균이 얼마인지, 곧 「역에서 몇 미터인지」는 θ만 봐서는 안 보이고 한 번 계산해야 나온다. 평균 3, 표준편차 2인 정규분포의 θ는 (0.75, −0.125)인데, 이 두 숫자에서 평균 3을 읽어 내려면 아래 식을 거쳐야 한다.

손잡이의 느낌

손잡이를 보려고 가우시안을 고른다. 베르누이나 푸아송은 손잡이가 하나뿐이라 서로 묶일 것이 없다. 손잡이가 둘인 가장 익숙한 가족이 가우시안이다. 가우시안의 θ = (μ/σ², −1/(2σ²)) 를 거꾸로 풀면 이렇다.

σ2=−12θ2,μ=θ1σ2=−θ12θ2,θ2<0\textcolor{#2e9e6e}{\sigma}^2 = -\frac{1}{2\textcolor{#3b7de0}{\theta}_2}, \qquad \textcolor{#2e9e6e}{\mu} = \textcolor{#3b7de0}{\theta}_1 \textcolor{#2e9e6e}{\sigma}^2 = -\frac{\textcolor{#3b7de0}{\theta}_1}{2\textcolor{#3b7de0}{\theta}_2}, \qquad \textcolor{#3b7de0}{\theta}_2 < 0
μ, σ평균, 표준편차θ1자연모수 첫 성분 (x 의 계수)θ2자연모수 둘째 성분 (x2 의 계수, 음수여야 적분이 유한)\begin{array}{ll} \textcolor{#2e9e6e}{\mu},\ \textcolor{#2e9e6e}{\sigma} & \text{평균, 표준편차} \\ \textcolor{#3b7de0}{\theta}_1 & \text{자연모수 첫 성분 } (x \text{ 의 계수)} \\ \textcolor{#3b7de0}{\theta}_2 & \text{자연모수 둘째 성분 } (x^2 \text{ 의 계수, 음수여야 적분이 유한)} \end{array}

θ₁만 움직이면 σ는 그대로이고 평균만 μ = θ₁σ² 로 움직인다. θ₂를 움직이면 폭이 바뀐다. 그런데 θ₁ ≠ 0 이면 평균도 함께 끌려간다. μ = −θ₁/(2θ₂) 에 θ₂가 들어 있기 때문이다. (μ, σ)에서 “평균만”, "폭만"이었던 손잡이가 θ에서는 다르게 묶여 있다.

θ가 직관적이지 않은 대신 얻는 것이 있다. 두 분포의 로그를 섞은 뒤 합이 1이 되게 다시 나누는(정규화) 길, 곧 곱셈의 길이 θ 좌표에서 직선이 된다. log p와 log q를 3 : 1로 섞으면 지수 안의 θ도 그대로 3 : 1로, ¾θp + ¼θq 로 섞이기 때문이다. 반반으로 섞으면 두 θ의 한가운데다.

직접 움직여 보기

불러오는 중…

파이썬

import numpy as np

def to_theta(mu, sigma):
    return mu / sigma**2, -1 / (2 * sigma**2)

def from_theta(t1, t2):
    s2 = -1 / (2 * t2)
    return float(t1 * s2), float(np.sqrt(s2))

for mu, sigma in [(0, 1), (3, 2), (174, 5.8)]:
    t1, t2 = to_theta(mu, sigma)
    print(f"(μ, σ) = ({mu}, {sigma})  →  θ = ({t1:.4f}, {t2:.4f})  →  {tuple(round(v, 4) for v in from_theta(t1, t2))}")

t1, t2 = to_theta(3, 2)
print("θ₁ 만 두 배:", tuple(round(v, 4) for v in from_theta(2 * t1, t2)))
print("θ₂ 만 두 배:", tuple(round(v, 4) for v in from_theta(t1, 2 * t2)))
# (μ, σ) = (0, 1)  →  θ = (0.0000, -0.5000)  →  (0.0, 1.0)
# (μ, σ) = (3, 2)  →  θ = (0.7500, -0.1250)  →  (3.0, 2.0)
# (μ, σ) = (174, 5.8)  →  θ = (5.1724, -0.0149)  →  (174.0, 5.8)
# θ₁ 만 두 배: (6.0, 2.0)
# θ₂ 만 두 배: (1.5, 1.4142)

θ₁을 두 배로 하면 σ는 그대로 2이고 평균만 6이 된다. θ₂를 두 배로 하면 σ가 1.414로 줄면서 평균도 1.5로 끌려간다.

수확

“θ는 지수족의 골격에 맞춘 좌표. 곱셈의 길이 직선이 되는 좌표. 손잡이가 (μ, σ)와 다르게 묶여 있다.”

문제 7. 곱셈의 길 한가운데

두 정규분포 N(0, 1²)과 N(4, 2²)이 있다. (가) 두 분포의 θ를 구하고, θ 좌표의 한가운데(로그를 반반 섞은 점)가 어떤 정규분포인지 (μ, σ)로 적어라. (나) (μ, σ) 좌표에서 한가운데를 잡으면 N(2, 1.5²)이다. 두 답의 평균은 왜 다른가? (위 위젯의 자연모수 손잡이를 θ₁ = 0.5, θ₂ ≈ −0.31 에 맞추면 (가)의 분포를 그림으로 볼 수 있다.)

함께 풀기

김민준 M01
김민준

θp = (0, −0.5), θq = (1, −0.125) 예요. 한가운데는 (0.5, −0.3125). 거꾸로 풀면 σ² = 1.6, σ = 1.265, 평균은 θ₁σ² = 0.8. 어, 2가 아니에요. 어디서 틀렸지?

선생님 T01
선생님

0.8은 0과 4 가운데 어느 쪽에 가까워요?

김민준 M01
김민준

0 쪽이요. 폭이 좁은 N(0, 1²) 쪽이요.

이서연 S07
이서연

θ₂ = −1/(2σ²) 니까 반반 섞으면 1/σ²가 반반 섞이고, θ₁ = μ/σ² 도 반반 섞여. 그러면 평균은 두 평균을 1/σ², 곧 정밀도(분산의 역수)로 가중한 평균이 돼. (1 × 0 + ¼ × 4)/(1 + ¼) = 0.8. 틀린 게 아니야.

선생님 T01
선생님

「곱셈의 길」이라는 이름으로 보면요?

이서연 S01
이서연

로그를 반반 섞는 건 두 밀도를 곱해 제곱근을 씌우고 다시 나누는 거예요. 곱하면 두 분포가 함께 높은 곳만 남는데, 좁은 N(0, 1²)은 0 근처에서만 높으니까 그쪽으로 모여요. (μ, σ)의 한가운데 N(2, 1.5²)은 두 숫자의 가운데일 뿐이고요.

김민준 M01
김민준

시험 범위를 조교는 「3장 근처」라고 딱 짚고 선배는 「1장에서 8장 사이 어딘가」라고 하면, 둘을 합칠 때 조교 말 쪽으로 기우는 거랑 같네요.

문제 8. 조건을 더 세게: 로짓을 늘여 더하기

언어 모델이 프롬프트의 조건을 더 세게 따르게 하는 방법이 있다. 조건 없이 낸 로짓에서 조건을 넣고 낸 로짓 쪽으로 가는 차이를 1보다 크게 늘여 더한다(분류기 없는 안내, classifier-free guidance). 2023년 산체스(Sanchez) 등의 논문은 언어 모델에서 이 배율을 1.5로 둔 실험을 보고했다. 다음 단어 후보 셋에 대해 조건을 넣은 로짓이 (2, 0, 0), 뺀 로짓이 (0, 0, 1)이다. (가) 차이를 1.5배로 늘여 새 로짓을 만들고 확률을 구하라. (나) 같은 1.5배를 로짓이 아니라 확률에 적용하면 어떻게 되는가?

함께 풀기

김민준 M01
김민준

(나)부터 해 봤어요. 확률은 조건을 넣으면 (0.787, 0.107, 0.107), 빼면 (0.212, 0.212, 0.576). 뺀 쪽에서 넣은 쪽으로 가는 차이를 1.5배로 늘여 더하면 (1.075, 0.054, −0.128)… 음수가 나와요. 그럼 이 방법에 1.5배 같은 건 애초에 못 쓰는 거 아니에요?

선생님 T01
선생님

논문은 로짓에 했어요. (가)는요?

이서연 S01
이서연

새 로짓은 (0, 0, 1) + 1.5 × ((2, 0, 0) − (0, 0, 1)) = (3, 0, −0.5). 소프트맥스를 씌우면 (0.926, 0.046, 0.028). 셋 다 양수고 합도 1이야.

선생님 T01
선생님

로짓에서는 왜 1을 넘겨 늘여도 괜찮죠?

이서연 S08
이서연

로짓은 이 가족의 자연모수 θ예요. θ 좌표의 곧은 선은 곱셈의 길이라, 어디까지 늘이든 exp를 씌워 다시 나누니까 늘 확률분포가 나와요. 확률 좌표는 모두 0 이상이고 합이 1인 점들의 삼각형(심플렉스) 안에서만 살아서, 두 점 사이를 넘어 늘이면 가장자리를 뚫고 나가요.

김민준 M01
김민준

첫 단어 확률이 조건만 넣었을 때의 0.787보다 더 높은 0.926 이 됐네요. 조건 쪽으로 한 발 더 간 거예요. 가우시안 한가운데 문제랑 같은 길인데, 가운데가 아니라 그 너머로 간 거고요.

선생님 T01
선생님

그래요. 로그를 섞는 비율이 0과 1 사이면 두 분포 사이, 1을 넘으면 그 너머예요. 확률에서 같은 일을 하면 곧 음수가 나오지만, θ 좌표에서는 늘 가족 안에 머물러요.