지금까지 점이 된 것들을 보면, 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 다른 것 중 무엇이 더 큰 차이인가? 지금 (μ, σ) 평면에는 거리 눈금 없이 점들만 찍혀 있어서, 두 차이 가운데 어느 쪽이 큰지 답해 줄 거리가 아직 없다.
추상화의 수준이 완전히 달라졌다. 이제는 이미지 한 장 대신 분포 전체가 점이고, 분포를 점으로 놓는 이 도약이 정보기하학의 출발점이다.
분포를 점으로 놓는 순간, 분포들 사이의 "거리"를 물을 수 있게 된다. 한국 남성과 네덜란드 남성은 얼마나 먼가? 한국 남성과 한국 여성은?
직접 움직여 보기
불러오는 중…
점에서 분포를 되살린다: 점이라 부를 자격
라디오 주파수를 바꾸면 들리는 방송이 바뀌는데, 주파수 하나에 방송 하나가 정해지고, 주파수 숫자만 알려 주면 누구든 같은 방송을 다시 틀 수 있다. 점과 분포 사이도 그럴까? 정규분포 하나를 "점"이라고 부르면 무슨 일이 생기나? 분포 하나 = 공간의 점 하나라고 말하려면, 점 하나에서 분포 전체를 되살릴 수 있어야 한다. 정규분포는 그렇게 할 수 있어서, 두 숫자만 알면 모든 키 값의 확률밀도가 정해진다.
점을 옮기면 식이 바뀌고, 식이 바뀌면 곡선이 바뀐다. 라디오 주파수 하나에 방송 하나이듯, 점 (μ, σ) 하나에 정규분포 하나가 짝지어진다.
이 평면의 모양과 주소
두 가지를 짚어 두자.
첫째, 이 공간은 평면 전체가 아니다. 표준편차는 0보다 커야 해서, σ = 0이면 봉우리가 한 점에 무한히 뾰족해지고 σ < 0인 분포는 아예 없다. 그래서 정규분포들의 공간은 σ > 0인 위쪽 반평면이고, 아래쪽 경계선은 공간의 일부가 아니라 가장자리다.
둘째, (μ, σ)는 이 공간의 유일한 주소가 아니다. 표준편차 대신 분산 σ²을 쓰면 (174, 5.8)이 (174, 33.64)가 되고, log σ를 써도 된다. 어느 주소를 쓰든 가리키는 분포는 같다. 그렇다면 주소 위에서 두 점의 "가운데"를 잡거나 두 점을 잇는 "직선"을 그으면, 어느 주소에서 하든 같은 분포가 나올까? 아래 문제에서 직접 따져 본다.
ML에서: VAE의 인코더는 이 반평면의 점을 내놓는다
앞에서 본 VAE는 사진 한 장을 받아 정규분포를 내놓으므로, 줄인 숫자 하나마다 평균과 표준편차라는 이 반평면의 점 하나가 나온다. 그런데 VAE를 처음 내놓은 킹마(Diederik Kingma)와 웰링(Max Welling)의 2013년 논문은 신경망이 (μ, σ)가 아니라 (μ, log σ²)를 내놓게 했다. 같은 점을 다른 주소로 내놓게 한 것인데, 왜 (μ, log σ²) 주소를 골랐는지는 아래 문제 6에서 알아본다.
파이썬
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씩 달릴 때 드는 기름으로 따지면, 어느 가운데가 두 차를 합친 연비인가?
기름 1 L로 자동차 A는 10 km, B는 20 km를 간다. 오른쪽은 두 기온 20 °C와 30 °C
섭씨를 화씨로 바꾸는 식과, km/L를 100 km당 기름으로 바꾸는 식은 어떻게 달라요?
이서연
화씨는 섭씨에 1.8을 곱하고 32를 더할 뿐이에요. 그래프로 그리면 곧은 선이요. 곧은 선이면 두 점의 가운데가 그대로 가운데로 옮겨 가겠죠.
선생님
100 km당 기름은요?
이서연
100을 연비로 나눈 값이니까… 곱하고 더하는 꼴이 아니에요. 그래프가 휘어 있겠네요.
선생님
휜 선 위에서도 가운데가 가운데로 갈까요?
이서연
아, 안 가요. 휜 쪽으로 끌려가요. 그래서 15와 13.3이 어긋났던 거예요. 곧은 변환만 가운데를 가운데로 보내요.
김민준
그래도 (다)는 15가 맞겠죠. 평균 연비니까요.
선생님
두 차가 1,000 km씩 달리면 기름이 얼마나 들어요?
김민준
A는 100 L, B는 50 L. 합쳐서 2,000 km에 150 L니까… 13.3 km/L네요. 실제로 든 기름에 맞는 건 15가 아니라 13.3이었어요.
선생님
어느 주소의 가운데가 맞는지는 무엇을 물으려는지가 정해요. 같은 거리를 달리며 든 기름을 묻는다면 기름 쪽 주소의 가운데가 맞아요.
김민준
조별 과제 속도를 「시간당 쪽수」로 평균 냈는데 조교님은 「쪽당 시간」으로 평균 내서 서로 안 맞았던 거랑 같네요.
문제 5. 같은 분포, 다른 주소
한국 20대 남성 (174, 5.8)과 네덜란드 20대 남성 (183, 7.1)이 (μ, σ) 평면에 있다. (가) (μ, σ) 좌표와 (μ, σ²) 좌표에서 각각 두 점의 "가운데"를 잡고, 그것이 가리키는 표준편차를 비교하라. (나) 네덜란드 남성에서 한국 남성 쪽으로 난 직선을 한국 남성 너머로 5배만큼 더 연장하면 어떤 분포가 되는가? (위 위젯의 주소 단추로 두 점이 두 주소에서 어디에 찍히는지 볼 수 있다.)
(μ, σ) 평면 위의 한국 20대 남성 (174, 5.8)과 네덜란드 20대 남성 (183, 7.1). 회색은 σ ≤ 0인 곳
함께 풀기
김민준
σ² 좌표로 옮기는 건 제곱만 하면 돼요. (174, 33.64), (183, 50.41).
김민준
(가)는 코드로 했어요. σ 좌표 가운데는 6.45고, σ² 좌표 가운데는 42.0이에요. 완전 다른 분포네요.
이서연
표준편차가 42cm? 성인 남성 키가 그렇게 퍼져 있으면 2m 넘는 사람이 흔하겠는데.
김민준
아… 42.0은 분산이에요. 변수 이름을 sig로 해 놓고 σ²을 넣었어요. 루트를 씌우면 6.48이에요.
선생님
그러면 두 가운데는 같은 분포예요?
김민준
6.45와 6.48이니까 거의 같지만 아주 조금 달라요. σ²도 σ를 구부려 바꾼 주소라서, 연비 때처럼 가운데가 어긋나는 거네요.
김민준
보고서에서 단위 표기 안 하고 cm랑 mm 섞어 쓰다가 조교님한테 지적받은 거랑 똑같은 실수네요. 이름표가 값의 뜻을 정하는데 이름표를 틀리게 붙였어요.
선생님
(나)는요?
이서연
직선이니까 쉬워요. 한국 남성에서 (−9, −1.3)의 5배를 더하면 (129, −0.7)이에요. 평균 129cm, 표준편차 −0.7인 분포요. 봉우리가 뒤집힌 건가…
선생님
표준편차가 음수인 정규분포를 식에 넣어 봐요.
이서연
밀도 앞의 1/σ가 음수가 돼요. 확률밀도가 음수라니, 분포가 아니에요.
선생님
이 공간은 어디까지였죠?
이서연
σ > 0인 반평면이요. 반평면이라는 건 알았는데, 직선은 끝없이 뻗으니까 따라가다 보면 언젠가 그 가장자리를 넘는다는 생각은 못 했어요. 직선을 연장하다가 공간 밖으로 나가 버린 거예요.
김민준
σ² 좌표에서도 33.64 + 5 × (−16.77) = −50.21이라 똑같이 밖으로 나가요. 근데 log σ 좌표로 가면 σ = 2.11이 나와요. 음수가 안 돼요.
이서연
log σ는 실수 전체를 다 쓰니까 가장자리가 없구나. 정의역을 바꿔서 경계를 없애는 거, 해석학에서 열린구간을 실수 전체로 옮기는 변환이랑 같은 발상이에요.
선생님
그래요. 주소를 바꾸면 경계가 사라지기도 하고, 직선이 바뀌기도 해요. 어떤 주소의 직선이 "진짜 곧은 길"인지는 따로 따져 봐야 할 물음이에요.
문제 6. 인코더는 왜 log σ²를 내놓을까
VAE의 인코더가 어떤 입력에 표준편차 σ = 0.3을 내놓았다. 학습 한 스텝(파라미터 업데이트 한 번)이 인코더의 출력을 0.5만큼 줄였다고 하자. (가) 인코더가 σ를 그대로 내놓는다면 한 스텝 뒤의 σ는 얼마이고, 그 분포로 학습을 이어 갈 수 있는가? (나) 인코더가 log σ²를 내놓는다면, 같은 한 스텝(출력을 0.5 줄임) 뒤의 σ는? (다) 두 주소의 차이를 문제 5의 (나)와 비교하라.
인코더 출력의 두 주소. 위는 σ를 그대로, 아래는 log σ²를 내놓을 때의 수직선이고, 초록 점은 σ = 0.3인 자리다. 맨 아래 두 막대는 두 수직선 각자의 눈금으로 잰 한 스텝의 크기 0.5