점

확률분포는 점이다: 두 숫자로 분포 전체를 되살린다

지금까지 점이 된 것들을 보자. MNIST에서는 이미지 한 장이 점이었다. Word2Vec에서는 단어 하나가 점이었다. 이미지나 단어처럼 하나하나의 대상이 아니라, 수십만 명의 기록을 요약한 분포 하나도 점이 될 수 있을까?

사례 — 네 집단의 키 분포

한국 20대 남성의 키 분포가 있다. 평균 174cm, 표준편차 5.8cm의 정규분포. 이것은 (174, 5.8)이라는 점이다.

한국 20대 여성의 키 분포: (161, 5.2). 네덜란드 20대 남성의 키 분포: (183, 7.1). 네덜란드 20대 여성의 키 분포: (170, 6.3). 네 집단의 숫자는 설명을 위해 어림으로 잡은 값이다.

평균을 그리스 문자 μ(뮤), 표준편차를 σ(시그마)로 적는 (μ, σ) 평면 위에 네 개의 점을 찍었다.

잠깐 멈춰서 이것이 얼마나 과감한 일인지 생각해보자.

한국 20대 남성의 키 분포 뒤에는 무엇이 있는가. 수십만 명의 신체검사 기록이 있다. 한 사람 한 사람의 키, 유전자, 식습관, 성장 환경이 있다. 그 모든 개별적 삶이 빚어낸 결과가 하나의 분포다. 그 분포를 우리는 방금 (174, 5.8)이라는 점 하나로 만들었다.

수십만 줄의 데이터, 수십만 명의 이야기가 평면 위의 점 하나로 압축되었다. 그리고 앞의 사례들과 다르게, 이 평면의 좌표는 처음부터 뜻을 가진다. 첫 번째 좌표는 평균이고, 두 번째 좌표는 퍼짐의 정도다. 별도의 VAE도, Word2Vec도 필요 없다.

다만 좌표에 뜻이 있다고 해서 점 사이의 거리까지 정해진 것은 아니다. μ가 9cm 다른 것과 σ가 1.3cm 다른 것 중 무엇이 더 큰 차이인가. 그 물음에 답하는 자는 아직 없다. 평면 위에 눈금 없는 점들만 찍혀 있는 셈이다.

추상화의 수준이 완전히 달라졌다. 이미지 한 장이 아니라 분포 전체가 점이다. 그리고 이 도약이야말로 정보기하학의 출발점이다.

분포를 점으로 놓는 순간, 분포들 사이의 "거리"를 물을 수 있게 된다. 한국 남성과 네덜란드 남성은 얼마나 먼가? 한국 남성과 한국 여성은?

직접 움직여 보기

불러오는 중…

점에서 분포를 되살린다 — 점이라 부를 자격

라디오 다이얼을 돌리면 들리는 방송이 바뀐다. 다이얼 자리 하나에 방송 하나가 정해지고, 다이얼 자리만 알려 주면 누구든 같은 방송을 다시 틀 수 있다. 점과 분포 사이도 그럴까? 정규분포 하나를 "점"이라고 부르면 무슨 일이 생기나? 분포 하나 = 공간의 점 하나라고 말하려면, 점 하나에서 분포 전체를 되살릴 수 있어야 한다. 정규분포는 그렇다. 두 숫자만 알면 모든 키 값의 확률밀도가 정해진다.

p(x)=1σ2πexp⁡ ⁣(−(x−μ)22σ2)\textcolor{#d6479f}{p}(\textcolor{#6f8fa6}{x}) = \frac{1}{\textcolor{#2e9e6e}{\sigma}\sqrt{2\pi}} \exp\!\left(-\frac{(\textcolor{#6f8fa6}{x} - \textcolor{#2e9e6e}{\mu})^2}{2\textcolor{#2e9e6e}{\sigma}^2}\right)
p점 (μ,σ) 가 가리키는 분포의 확률밀도x키 값 하나 (표본)μ평균, 봉우리의 위치σ표준편차, 봉우리의 폭 (σ>0)π원주율 3.14… (그리스 문자 파이, pi)\begin{array}{ll} \textcolor{#d6479f}{p} & \text{점 } (\mu, \sigma) \text{ 가 가리키는 분포의 확률밀도} \\ \textcolor{#6f8fa6}{x} & \text{키 값 하나 (표본)} \\ \textcolor{#2e9e6e}{\mu} & \text{평균, 봉우리의 위치} \\ \textcolor{#2e9e6e}{\sigma} & \text{표준편차, 봉우리의 폭 } (\sigma > 0) \\ \pi & \text{원주율 3.14… (그리스 문자 파이, pi)} \end{array}

점을 옮기면 식이 바뀌고, 식이 바뀌면 곡선이 바뀐다. 다이얼 자리 하나에 방송 하나이듯, 점 하나에 분포 하나가 짝지어진다.

이 평면의 모양과 주소

두 가지를 짚어 두자.

첫째, 이 공간은 평면 전체가 아니다. 표준편차는 0보다 커야 한다. σ = 0이면 봉우리가 한 점에 무한히 뾰족해지고, σ < 0인 분포는 없다. 그래서 정규분포들의 공간은 σ > 0인 위쪽 반평면이다. 아래쪽 경계선은 공간의 일부가 아니라 가장자리다.

둘째, (μ, σ)는 이 공간의 유일한 주소가 아니다. 표준편차 대신 분산 σ²을 써도 된다. (174, 5.8)은 (174, 33.64)가 된다. log σ를 써도 된다. 주소를 바꿔도 가리키는 분포는 같다. 그렇다면 주소 위에서 두 점의 "가운데"를 잡거나 두 점을 잇는 "직선"을 그으면, 어느 주소에서 하든 같은 분포가 나올까? 아래 문제에서 직접 따져 본다.

ML에서: VAE의 인코더는 이 반평면의 점을 내놓는다

앞에서 본 VAE는 사진 한 장을 받아 정규분포를 내놓는다. 줄인 숫자 하나마다 평균과 표준편차, 곧 이 반평면의 점 하나다. 그런데 VAE를 처음 내놓은 킹마(Diederik Kingma)와 웰링(Max Welling)의 2013년 논문은 신경망이 (μ, σ)가 아니라 (μ, log σ²)를 내놓게 했다. 같은 점을 다른 주소로 내놓게 한 것이다. 왜 그 주소인지는 아래 문제에서 알아본다.

파이썬

import numpy as np

rng = np.random.default_rng(0)
heights = rng.normal(174, 5.8, size=300_000)   # 30만 명의 키 (가상의 신체검사 기록)

point = np.array([heights.mean(), heights.std()])   # 분포 전체 → 점 하나 (μ, σ)
print("점 (μ, σ)   :", point.round(2))

def pdf(x, mu, sigma):                          # 점 하나 → 분포 전체
    return np.exp(-(x - mu)**2 / (2 * sigma**2)) / (sigma * np.sqrt(2 * np.pi))

print("점에서 되살린 p(180) :", round(pdf(180, *point), 4))
print("데이터로 센   p(180) :", round(np.mean(np.abs(heights - 180) < 0.5), 4))  # 179.5~180.5 비율

groups = {"한국 남": (174, 5.8), "한국 여": (161, 5.2), "네덜란드 남": (183, 7.1), "네덜란드 여": (170, 6.3)}
for name, (mu, s) in groups.items():
    print(f"{name:7s}  (μ, σ) = ({mu}, {s})   (μ, σ²) = ({mu}, {s**2:.2f})")
# 점 (μ, σ)   : [174.     5.81]
# 점에서 되살린 p(180) : 0.0403
# 데이터로 센   p(180) : 0.0404
# 한국 남     (μ, σ) = (174, 5.8)   (μ, σ²) = (174, 33.64)
# 한국 여     (μ, σ) = (161, 5.2)   (μ, σ²) = (161, 27.04)
# 네덜란드 남   (μ, σ) = (183, 7.1)   (μ, σ²) = (183, 50.41)
# 네덜란드 여   (μ, σ) = (170, 6.3)   (μ, σ²) = (170, 39.69)

30만 줄의 데이터를 두 숫자로 줄였는데, 그 두 숫자에서 되살린 확률이 데이터에서 직접 센 비율과 소수 넷째 자리 근처까지 맞는다. 데이터가 정말 정규분포에서 왔기 때문이다. 현실의 데이터라면 여기서 어긋남이 보이고, 그 어긋남을 재려면 분포와 분포 사이에 댈 자가 필요하다.

수확

“분포를 점으로 부를 수 있는 것은, 점에서 분포를 되살릴 수 있기 때문이다.” 그리고 같은 점에 주소는 여러 개다.

문제 4. 두 자동차의 「가운데」 연비

자동차 A는 기름 1 L로 10 km, 자동차 B는 20 km를 간다. (가) km/L로 적은 두 연비의 가운데를 구하라. 같은 두 차를 「100 km에 드는 기름(L)」으로 적은 뒤 가운데를 잡고, 그것을 다시 km/L로 바꿔라. (나) 기온 20 °C와 30 °C의 가운데를 섭씨와 화씨로 각각 잡으면 같은 기온인가? (다) (가)에서는 왜 두 주소의 가운데가 어긋나고 (나)에서는 맞는가? 두 차가 1,000 km씩 달릴 때 드는 기름으로 따지면, 어느 가운데가 두 차를 합친 연비인가?

함께 풀기

김민준 M01
김민준

(가) km/L로는 (10 + 20)/2 = 15예요. 100 km당 기름으로는 10 L와 5 L니까 가운데가 7.5 L, km/L로 바꾸면 100/7.5 ≈ 13.3이에요. 어디서 틀렸지…

이서연 S01
이서연

틀린 데 없어. 둘 다 맞게 계산했는데 답이 달라.

선생님 T01
선생님

(나)는요?

김민준 M01
김민준

20 °C는 68 °F, 30 °C는 86 °F. 가운데 77 °F는 25 °C예요. 여기선 똑같네요.

선생님 T01
선생님

섭씨를 화씨로 바꾸는 식과, km/L를 100 km당 기름으로 바꾸는 식은 어떻게 달라요?

이서연 S07
이서연

화씨는 섭씨에 1.8을 곱하고 32를 더할 뿐이라 곧은 변환이에요. 곧게 바꾸면 가운데도 가운데로 옮겨 가요. 100 km당 기름은 100을 연비로 나눈 값이라 구부러진 변환이고, 구부러진 변환은 가운데를 가운데로 보내지 않아요.

김민준 M01
김민준

그래도 (다)는 15가 맞겠죠. 평균 연비니까요.

선생님 T01
선생님

두 차가 1,000 km씩 달리면 기름이 얼마나 들어요?

김민준 M04
김민준

A는 100 L, B는 50 L. 합쳐서 2,000 km에 150 L니까… 13.3 km/L네요. 실제로 든 기름에 맞는 건 15가 아니라 13.3이었어요.

선생님 T01
선생님

어느 주소의 가운데가 맞는지는 무엇을 물으려는지가 정해요. 같은 거리를 달리며 든 기름을 묻는다면 기름 쪽 주소의 가운데가 맞아요.

김민준 M01
김민준

조별 과제 속도를 「시간당 쪽수」로 평균 냈는데 조교님은 「쪽당 시간」으로 평균 내서 서로 안 맞았던 거랑 같네요.

문제 5. 같은 분포, 다른 주소

한국 20대 남성 (174, 5.8)과 네덜란드 20대 남성 (183, 7.1)이 (μ, σ) 평면에 있다. (가) (μ, σ) 좌표와 (μ, σ²) 좌표에서 각각 두 점의 "가운데"를 잡고, 그것이 가리키는 표준편차를 비교하라. (나) 네덜란드 남성에서 한국 남성 쪽으로 난 직선을 한국 남성 너머로 5배만큼 더 연장하면 어떤 분포가 되는가? (위 위젯의 주소 단추로 두 점이 두 주소에서 어디에 찍히는지 볼 수 있다.)

함께 풀기

김민준 M01
김민준

σ² 좌표로 옮기는 건 제곱만 하면 돼요. (174, 33.64), (183, 50.41).

김민준 M01
김민준

(가)는 코드로 했어요. σ 좌표 가운데는 6.45고, σ² 좌표 가운데는 42.0이에요. 완전 다른 분포네요.

이서연 S01
이서연

표준편차가 42cm? 성인 남성 키가 그렇게 퍼져 있으면 2m 넘는 사람이 흔하겠는데.

김민준 M04
김민준

아… 42.0은 분산이에요. 변수 이름을 sig로 해 놓고 σ²을 넣었어요. 루트를 씌우면 6.48이에요.

선생님 T01
선생님

그러면 두 가운데는 같은 분포예요?

김민준 M01
김민준

6.45와 6.48이니까 거의 같지만 아주 조금 달라요. σ²도 σ를 구부려 바꾼 주소라서, 연비 때처럼 가운데가 어긋나는 거네요.

김민준 M01
김민준

보고서에서 단위 표기 안 하고 cm랑 mm 섞어 쓰다가 조교님한테 지적받은 거랑 똑같은 실수네요. 이름표가 값의 뜻을 정하는데 이름표를 틀리게 붙였어요.

선생님 T01
선생님

(나)는요?

이서연 S01
이서연

직선이니까 쉬워요. 한국 남성에서 (−9, −1.3)의 5배를 더하면 (129, −0.7)이에요. 평균 129cm, 표준편차 −0.7인 분포요. 봉우리가 뒤집힌 건가…

선생님 T01
선생님

표준편차가 음수인 정규분포를 식에 넣어 봐요.

이서연 S06
이서연

밀도 앞의 1/σ가 음수가 돼요. 확률밀도가 음수라니, 분포가 아니에요.

선생님 T01
선생님

이 공간은 어디까지였죠?

이서연 S07
이서연

σ > 0인 반평면이요. 반평면이라는 건 알았는데, 직선은 끝없이 뻗으니까 따라가다 보면 언젠가 그 가장자리를 넘는다는 생각은 못 했어요. 직선을 연장하다가 공간 밖으로 나가 버린 거예요.

김민준 M01
김민준

σ² 좌표에서도 33.64 + 5 × (−16.77) = −50.21이라 똑같이 밖으로 나가요. 근데 log σ 좌표로 가면 σ = 2.11이 나와요. 음수가 안 돼요.

이서연 S01
이서연

log σ는 실수 전체를 다 쓰니까 가장자리가 없구나. 정의역을 바꿔서 경계를 없애는 거, 해석학에서 열린구간을 실수 전체로 옮기는 변환이랑 같은 발상이에요.

선생님 T01
선생님

그래요. 주소를 바꾸면 경계가 사라지기도 하고, 직선이 바뀌기도 해요. 어떤 주소의 직선이 "진짜 곧은 길"인지는 따로 따져 봐야 할 물음이에요.

문제 6. 인코더는 왜 log σ²를 내놓을까

VAE의 인코더가 어떤 입력에 표준편차 σ = 0.3을 내놓았다. 학습 한 걸음이 인코더의 출력을 0.5만큼 줄이는 쪽으로 움직였다고 하자. (가) 인코더가 σ를 그대로 내놓는다면 한 걸음 뒤의 σ는 얼마이고, 그 분포로 학습을 이어 갈 수 있는가? (나) 인코더가 log σ²를 내놓는다면, 같은 한 걸음(출력을 0.5 줄임) 뒤의 σ는? (다) 두 주소의 차이를 문제 5의 (나)와 견주어라.

함께 풀기

김민준 M01
김민준

(가)는 0.3 − 0.5 = −0.2요. 표본은 평균에 표준정규 노이즈 곱하기 σ를 더해서 뽑으니까, σ가 −0.2여도 뽑히긴 해요. 노이즈 부호만 뒤집힌 셈이라 괜찮지 않아요?

선생님 T01
선생님

뽑는 건 그렇다 쳐요. 그 분포의 밀도를 식에 넣어 봐요.

김민준 M07
김민준

앞에 1/σ가 있으니까 밀도가 음수고, 손실에 들어가는 log σ는 아예 계산이 안 돼요. 문제 5에서 직선을 늘였을 때처럼 반평면 밖으로 나간 거네요.

이서연 S01
이서연

(나)는 log σ² = ln 0.09 ≈ −2.41에서 0.5를 빼면 −2.91, σ = e−2.91/2 ≈ 0.234예요. 한 걸음이 σ를 e−0.25 ≈ 0.78배로 줄이는 곱셈이 돼요. 몇 걸음을 가도 0보다 작아지지 않아요.

선생님 T01
선생님

(다)는요?

이서연 S08
이서연

문제 5에서 log σ 주소로 가니까 가장자리가 없어졌잖아요. log σ²는 2 log σ니까 같은 주소고요. 신경망의 출력은 실수 어디든 나올 수 있으니, 그 출력을 그대로 주소로 쓰려면 주소도 실수 전체를 써야 해요.

선생님 T01
선생님

그래요. 신경망은 가장자리가 어디인지 몰라요. 그래서 가장자리가 없는 주소로 내놓게 하는 거예요.

김민준 M01
김민준

채점 스크립트에 점수를 0~100으로만 받게 해 놨는데 감점을 빼다가 음수가 나와서 멈춘 적이 있어요. 처음부터 음수가 나올 수 없는 방식으로 적었어야 했네요.