서론
생성 모델의 핵심 문제는 단순히 학습 데이터를 외우는 것이 아니라, 데이터가 어떤 규칙에 따라 나타나는지를 나타내는 관측된 데이터의 분포를 학습하는 것이다.
그런데 여기서 딜레마가 생긴다. 복잡한 데이터 분포를 충분히 표현하는 것과 그 분포에서 확률 또는 확률밀도를 실제로 계산할 수 있게 만드는 것을 동시에 만족시키기가 어렵다.
이 장은 이 문제가 왜 발생하는지를 설명한다.
본론
생성 모델이 배워야 하는 것은 데이터의 분포다.
판별 모델은 입력이 주어졌을 때 그것이 무엇인지 판단한다.
예를 들어 사진 (x)가 주어졌을 때 \(p(y\mid x)\) 즉, “이 사진이 고양이일 확률은 얼마인가?”를 판단하는 문제가 대표적이다.
반면 생성 모델은 새로운 (x) 자체를 만들어야 한다.
모델은 어떤 눈 모양이 자연스러운지 귀와 얼굴이 어떤 관계를 가지는지 털, 자세, 배경 등이 어떻게 함께 나타나는지와 같은 데이터 전체의 통계적 구조와 규칙을 배워야 한다.
이를 확률적으로 표현하면 실제 데이터가 생성되는 알 수 없는 분포 \(p_{\text{data}}(x)\)를 직접 알 수 없으므로, 우리의 모델이 표현하는 분포 \(q_\theta(x)\)가 그것을 최대한 잘 근사하도록 학습하는 문제라고 볼 수 있다.
즉, 생성 모델의 목적은 학습 데이터라는 점들의 목록을 외우는 것이 아니라, 그 점들이 나타나는 분포를 배우는 것이다.
그렇다면 어떤 분포가 데이터를 잘 설명한다고 판단할 것인가?
문제는 실제 데이터 분포 \(p_{\text{data}}(x)\)를 우리가 직접 모른다는 것이다.
우리가 가지고 있는 것은 그 분포에서 실제로 관측된 데이터 \(x_1,x_2,\dots,x_n\) 뿐이다.
따라서 생각을 뒤집는다.
“이 모델이 가정한 분포에서는, 우리가 실제로 관측한 데이터가 얼마나 자주 나올 법한가?”
를 평가한다.
그러므로 이 모델이 높은 확률 또는 높은 확률밀도를 부여한다면, 그 모델은 관측 데이터를 잘 설명한다고 볼 수 있다. 이때 사용하는 것이 가능도(Likelihood)이다.
Likelihood를 학습 가능한 Loss로 바꾼다
각 데이터가 서로 독립적으로 관측되었다고 가정하자.
그러면 전체 데이터셋 \(\{x_1,\dots,x_n\}\)이 관측될 가능도(likelihood) 는
로 표현할 수 있다.
우리가 목표로 하는 것은, 주어진 데이터를 가장 잘 설명하는 파라미터 \(\theta\)를 찾는 것이다.
왜냐하면 가능도가 클수록 그 파라미터가 현재 관측된 데이터를 더 그럴듯하게 설명한다고 볼 수 있기 때문이다.
하지만 많은 작은 확률이나 밀도 값을 계속 곱하면 값이 매우 작아져 수치적으로 계산하기 어려워진다. 따라서 로그를 취한다
로그를 씌워도 문제가 없는 이유는 단조 증가 함수이기 때문이다.
일반적인 머신러닝의 “Loss 최소화”관점으로 해석함으로 이 형태로 맞추기위해 위해 음수를 붙이면
가 된다.
데이터 개수가 많아질수록 손실의 합도 커지므로, \(1/n\) 으로 나누어 한 데이터당 평균 손실로 표현한다.
그럼으로 데이터 개수 (n)으로 나누어 평균을 사용하면
를 얻는다.
라고 이해할 수 있다.
연속 데이터에서는 ‘확률’과 ‘밀도’를 구분해야 한다
지금까지 우리는 실제 데이터 \(x_i\)에 대해 \(q_\theta(x_i)\)가 클수록 모델이 그 데이터를 더 그럴듯하게 설명한다고 보았다.
앞에서 우리는 모델이 실제 관측 데이터에 높은 \(q_\theta(x_i)\)를 부여할수록, 그 데이터를 잘 설명하는 모델이라고 보았다.
그런데 여기서 \(q_\theta(x_i)\)가 정확히 무엇을 의미하는지 짚고 넘어가야 한다.
키와 같이 연속적인 값을 다루는 경우 \(q_\theta(x_i)\)는 \(x_i\)가 나올 확률이 아니라 그 위치의 확률밀도(probability density) 이다.
연속확률변수에서는 정확히 한 점이 나올 확률은 \(P(X=x)=0\) 이고 실제 확률은 특정 구간에 대해서 계산한다/
따라서 연속인경우 \(q_\theta(x)\)는 이 위치 주변에 데이터가 얼마나 밀집해서 나타나는가를 나타내는 값이다.
따라서 실제 데이터 \(x_i\)가 위치한 곳에서 \(q_\theta(x_i)\)가 크다는 것은 모델이 그 데이터 주변을 데이터가 자주 나타내는 영역으로 보고 있다는 것이다.
그래서 최대가능도 학습은 결국
실제로 관측한 데이터들이 위치한 곳의 밀도를 높이는 방향으로 모델을 학습하는 것이라고 이해할 수 있다.
그렇다면 \(q_\theta(x)\)를 어떻게 만들까?
여기까지 오면 다음 문제가 생긴다. 우리는 likelihood를
로 계산하고, 이를 이용해 NLL을 최소화한다고 했다.
그런데 그러려면 먼저 모델이 어떤 데이터 \(x\)를 받았을 때 그 위치의 확률밀도를 계산할 수 있어야 한다: \(q_\theta(x)\)
그래서 우리는 복잡한 실제 데이터의 분포를 잘 표현하면서도, 각 \(x\)에 대한 밀도 \(q_\theta(x)\)를 계산할 수 있는 함수를 어떻게 만들 것인가? 로 바뀐다.
방법 A: 데이터가 얼마나 있었는지 직접 센다
그렇다면 가장 먼저 떠올릴 수 있는 방법은 실제로 데이터가 어디에 얼마나 많이 있었는지를 직접 세는 것이다.
예를 들어 사람의 키 데이터를 모았다고 하자.
- 160~165 cm
- 165~170 cm
- 170~175 cm
처럼 여러 구간을 나누고, 각 구간에 데이터가 몇 개 있었는지 센다.
데이터가 많이 들어 있는 구간에는 높은 밀도를 주고, 데이터가 적은 구간에는 낮은 밀도를 주면 된다. 이것이 히스토그램을 이용한 가장 단순한 분포 추정이다.
키처럼 변수 하나만 다룬다면 이 방법은 어렵지 않다.
예를 들어 전체 범위를 10개의 구간으로 나눈다면 우리가 관리해야 할 칸은 단 10개뿐이다.
각 칸에 몇 개의 데이터가 들어왔는지만 세면 대략적인 분포의 모양을 알 수 있다.
그런데 변수의 수(차원)이 늘어나기 시작하면 문제가 생긴다.
각 변수마다 10개의 구간으로 나눈다고 해보자.
일반적으로 \(d\)차원에서는 \(10^d\)개의 칸이 필요하다
문제는 공간은 이렇게 빠르게 커지는데 우리가 가지고 있는 데이터의 수는 한정되어 있다는 것이다. 따라서 차원이 높아질수록 대부분의 칸에는 데이터가 하나도 들어 있지 않게 된다.
이것이 흔히 말하는 차원의 저주(Curse of Dimensionality)이다. 이미지는 특히 심각하다.
예를 들어 \(128\times128\)크기의 RGB 이미지라면 하나의 이미지가 갖는 값의 개수는 \(128\times128\times3=49,152\) 이다.
이미지 한 장을 하나의 점으로 생각하면, 이 점은 49,152차원의 공간에 놓여 있는 셈이다.
이렇게 거대한 공간을 히스토그램의 칸으로 나누어 직접 채우려고 하면, 현실적으로 아무리 많은 이미지를 모아도 공간 대부분은 비어 있게 된다.
단순한 히스토그램에는 더 중요한 문제가 있다.
예를 들어 키를 측정한 사람들 중 \(175\sim180\text{ cm}\) 구간에 우연히 아무도 없었다고 하자.
히스토그램만 그대로 사용하면 이 구간의 빈도는 0이다. 따라서 모델은 이 구간에 \(q(x)=0\)
을 부여하게 된다. 하지만 이것은 “이번 데이터에서 관측하지 못했다.” 는 뜻이지, “175~180 cm인 사람은 세상에 절대로 존재할 수 없다.” 는 뜻이 아니다.
생성 모델이 해야 하는 일은 학습 데이터에 있던 샘플만 다시 보여주는 것이 아니다.
학습할 때 정확히 보지 못했던 경우라도,
학습 데이터의 규칙과 비슷하다면 새로운 데이터를 만들어낼 수 있어야 한다.
예를 들어 우리가 학습한 고양이 사진 중에
- 정확히 이 자세이고
- 정확히 이 털 색깔이며
- 정확히 이 배경을 가진
고양이가 한 번도 없었다고 하더라도, 그 조합이 충분히 자연스러운 고양이 사진이라면 생성 모델은 이를 만들어낼 수 있어야 한다.
우리가 원하는 것은 단순히 데이터의 목록을 외우는 것이 아니라 관측된 데이터들을 보고
“이 데이터들이 어떤 규칙을 따라 모여 있는가?” 를 알아낸 뒤, 아직 직접 보지 못한 위치에도 적절한 밀도를 부여할 수 있어야 한다.
즉 단순히 점 하나하나(데이터)를 외우는 대신, 점들 사이의 공통적인 구조를 이용해 분포 전체를 추정해야 한다.
그래서 다음 아이디어가 나온다.
그렇다면 “가우시안처럼 이미 수식으로 정의된 분포를 하나 정한 뒤, 데이터에 맞게 그 분포의 모양만 조절하면 어떨까?”
방법 B. 모양이 정해진 확률분포로 데이터를 근사한다
수식으로 정의된 분포를 하나 정하는 이유는 확률밀도함수가 있어야 확률밀도를 계산할 수 있기 때문이다. 그중 가우시안 분포는
처럼 이미 확률밀도 함수의 형태가 정해져 있다.
우리가 결정해야 하는 것은 주로 \(\mu,\; \sigma\) 로 어디를 중심으로 할 것인가, 그리고 얼마나 넓게 퍼질 것인가이다. 이 방법의 장점은 매우 크다.
히스토그램에서는 데이터가 없는 칸에 곧바로 0을 주었지만, 가우시안에서는 관측 데이터 주변에도 자연스럽게 밀도가 이어진다.
따라서 likelihood를 계산할 수 있다.
그런데 가우시안 하나로 실제 데이터를 설명할 수 있을까?
여기서 또 다른 문제가 생긴다.
가우시안 하나가 만들 수 있는 분포는 기본적으로 하나의 봉우리를 가진 비교적 단순한 형태이다.
하지만 실제 데이터는 그렇게 단순하지 않다.
고양이 이미지만 생각해도
- 정면을 보는 고양이
- 옆을 보는 고양이
- 앉아 있는 고양이
- 뛰는 고양이
- 검은 고양이
- 흰 고양이
등 여러 종류의 데이터가 동시에 존재한다.
즉 실제 데이터 분포는 하나의 봉우리보다는 여러 복잡한 영역에 데이터가 모여 있는 형태일 수 있다.
따라서 가우시안 하나를 사용하면 \(q_\theta(x)\) 를 계산하기는 쉽지만 실제 데이터의 복잡한 분포를 표현하기 어렵다.
여기까지 두 가지 방법을 시도했다.
히스토그램은 관측한 데이터를 그대로 이용할 수 있지만, 고차원에서 필요한 공간이 폭발하고 보지 못한 곳을 제대로 일반화하지 못한다.
반면 가우시안은 확률밀도를 쉽게 계산할 수 있고 관측하지 않은 영역에도 자연스럽게 밀도를 줄 수 있지만, 복잡한 실제 데이터 분포를 표현하기에는 너무 단순하다.
그래서 다음 질문이 나온다.
“가우시안보다 훨씬 복잡한 모양을 표현하면서도, 어떤 \(x\)가 들어왔을 때 \(q_\theta(x)\)를 계산할 수 있는 함수는 없을까?”
여기서 자연스럽게 신경망을 떠올리게 된다. 신경망은 매우 복잡한 함수를 표현할 수 있기 때문이다.
방법 C. 신경망으로 복잡한 모양을 표현한다
신경망의 장점은 매우 복잡한 함수를 표현할 수 있다는 점이다. 따라서 어떤 데이터 \(x\)가 들어왔을 때 신경망이 \(f_\theta(x)\) 라는 값을 출력하도록 만들 수 있다.
그리고 실제 데이터가 많이 존재하는 위치에서는 높은 값을, 데이터가 거의 존재하지 않는 위치에서는 낮은 값을 출력하도록 학습시키면 될 것처럼 보인다.
가우시안처럼 하나의 정해진 종 모양에 제한되지 않으므로, 신경망이라면 실제 데이터가 가지는 매우 복잡한 형태도 충분히 표현할 수 있다.
그런데 여기서 중요한 문제가 하나 생긴다.
그런데 여기서 중요한 문제가 하나 생긴다.
신경망이 출력한 \(f_\theta(x)\)를 그대로 \(q_\theta(x)\)라고 불러도 될까?
그렇지 않다.
신경망의 출력은 ‘확률밀도’가 아니다
확률밀도 함수가 되기 위해서는 두 가지 조건이 필요하다.
첫째, 모든 위치에서 확률밀도 값이 음수가 아니어야 한다. \(q_\theta(x)\ge 0\)
둘째, 전체 공간에 걸쳐 적분했을 때 반드시 1이 되어야 한다. \(\int q_\theta(x)\,dx=1\)
하지만 일반적인 신경망의 출력 \(f_\theta(x)\)는 이런 조건을 자동으로 만족하지 않는다.
따라서 신경망이 어떤 위치에서 \(f_\theta(x)=10\)을 출력했다고 하더라도 이 값 자체를 확률이나 확률밀도로 해석할 수 없다. 현재로서는 단지 신경망이 이 취에서 높은 점수를 주었다 라는 의미일 뿐이다. 그러면 이 점수를 실제 확률밀도 함수로 바꿔보자.
- 우선 점수를 모두 양수로 만든다
신경망 출력이 음수가 될 수도 있으므로, 흔히 지수함수를 이용하여 양수로 만든다.
그러면 \(\tilde q_\theta(x)>0\)가 항상 성립한다. 하지만 아직 문제가 하나 남아 있다.
전체 공간에서 이 값들을 모두 더하거나 적분했을 때 1이 된다는 보장이 없다.
\(\int \exp(f_\theta(x))dx\) 가 1이라는 보정이 없다.
- 전체 넓이가 1이되도록 정규화한다.
전체 공간에서 \(\tilde q_\theta(x)\)의 넓이를 \(Z_\theta = \int \exp(f_\theta(x))\,dx\) 라고 하자.
그리고 각 위치의 값을 전체 넓이로 나눈다. \(q_\theta(x) = \frac{\exp(f_\theta(x))} {Z_\theta}\) .
그러면
이므로 \(q_\theta(x)\)를 확률밀도 함수가 된다.
여기서 \(Z_\theta\)를 정규화 상수(normalizing constant) 또는 partition function이라고 한다.
정규화를 하는 이유
확률밀도의 정의가 확률밀도함수의 넓이의 합이 1이라고 했다.
확률밀도함수는 전체 공간에서 적분한 값이 1이어야 한다. \(\int q_\theta(x)\,dx=1\)
왜 전체 넓이 \(Z_\theta\)로 나누어야 할까?
정규화하지 않고 \(\tilde q_\theta(x) = \exp(f_\theta(x))\) 자체를 실제 데이터가 있는 위치에서 크게 만들도록 학습한다고 해보자.
이 경우 모델은 데이터 분포의 상대적인 모양을 더 잘 맞추지 않고도, 모든 위치의 값을 한꺼번에 크게 만들 수 있다.
만약 \(Z_\theta\)로 나누지 않고 \(\exp(f_\theta(x))\) 자체만 높이도록 학습한다고 하자.
그러면 모델은 데이터 분포의 모양을 정확하게 배우지 않고도, 모든 위치의 점수를 그냥 크게 만들어버릴 수 있다.
예를 들어 \(f_\theta(x)\)가 만들어내는 상대적인 모양을 그대로 유지한 채 전체를 5배 키우더라도, 점수 자체는 커진다.
하지만 정규화까지 고려하면 \(q_\theta(x) = \frac{f_\theta(x)}{Z_\theta}\) 에서 분자와 분모가 함께 5배 증가하므로
가 된다. 즉 전체 값을 똑같이 키우는 것은 정규화된 확률밀도에는 아무런 영향을 주지 않는다.
따라서 정규화의 역할은 단순히 전체 넓이를 1로 만드는 것뿐만 아니라,
각 위치의 점수를 전체 공간의 점수와 비교하여, 어디에 상대적으로 더 많은 밀도를 배분할 것인지를 결정하게 만드는 것
이라고 볼 수 있다.
여기서 신경망을 이용한 방법의 핵심 문제가 나타난다.
를 계산하려면 가능한 모든 \(x\)에 대해 신경망의 출력을 고려해야 한다.
1차원이라면 그나마 전체 구간을 적분하는 것이 가능할 수 있다. 하지만 이미지처럼 수만 차원의 데이터를 생각하면 상황이 완전히 달라진다.
예를 들어 \(128\times128\) RGB 이미지는 \(128\times128\times3 = 49,152\)
개의 값을 가진다. 즉 하나의 이미지는 약 49,000차원 공간의 한 점이다.
그렇다면 \(Z_\theta\)를 정확하게 계산하기 위해서는 사실상 이 거대한 공간 전체에서 \(\exp(f_\theta(x))\)
를 적분해야 한다. 이는 현실적으로 매우 어렵다.
또한 학습이 진행되면 \(\theta\)가 계속 바뀌고, 따라서 \(f_\theta(x)\)의 모양도 계속 바뀐다.
그렇다면 \(Z_\theta = \int \exp(f_\theta(x))dx\) 역시 매번 달라진다.
즉 한 번만 어려운 적분을 계산하면 끝나는 것이 아니다.
학습 과정에서 모델이 바뀔 때마다 정규화 상수도 함께 다시 계산해야 한다.
그래서 단순히 “복잡한 분포는 신경망으로 표현하면 되지 않을까?”
라는 생각은 새로운 계산 문제에 부딪힌다.
히스토그램
실제 관측 데이터를 그대로 이용할 수 있다.
하지만
이라는 문제가 있고, 관측하지 못한 곳을 제대로 일반화하기 어렵다.
가우시안
확률밀도 \(q_\theta(x)\)를 쉽게 계산할 수 있고, 정규화도 이미 되어 있다.
하지만 복잡한 실제 데이터의 분포를 표현하기에는 너무 단순하다.
신경망
복잡한 데이터 분포의 모양을 충분히 표현할 수 있다.
하지만 신경망이 만든 점수를 실제 확률밀도로 바꾸려면 \(Z_\theta\)가 필요하고, 고차원에서는 이 값을 계산하기가 매우 어렵다.
라는 문제가 생긴다.
지금까지 우리는 생성 모델이 왜 단순히 “신경망으로 확률분포를 만들면 되는 문제”가 아닌지를 살펴보았다. 복잡한 분포를 표현하는 것은 가능하지만, 그 분포를 정상적인 확률분포로 만들고 학습하려면 전체 공간에 대한 계산이 필요하기 때문이다. 이후 생성 모델들은 바로 이 계산을 어떻게 가능하게 만들거나 우회할 것인지에 따라 서로 다른 방법으로 발전한다.
- VAE, Normalizing Flow, Energy-Based Model, Diffusion Model 등
그렇다면 가우시안은 왜 확률밀도를 쉽게 계산할 수 있었을까?
앞에서 신경망은 복잡한 모양을 표현할 수 있지만, 이를 확률밀도로 만들기 위해 필요한 정규화 상수
를 계산하기 어렵다고 했다. 그렇다면
가우시안 역시 어떤 모양을 가진 함수인데, 왜 가우시안에서는 이런 문제가 없었을까?
가우시안 역시 정규화가 필요하지 않은 것은 아니다.
가우시안의 핵심적인 종 모양만 먼저 떼어 보면
과 같다. 이 함수는 \(\mu\)에서 가장 크고, 중심에서 멀어질수록 값이 작아지는 종 모양을 만든다.
하지만 이 상태만으로는 아직 확률밀도 함수가 아니다. 전체 넓이가 1이 아니기 때문이다.
실제로 전체 실수 공간에서 적분하면
가 된다. 따라서 전체 넓이로 나누면
가 되고,
이므로 비로소 확률밀도 함수가 된다. 가우시안도 정규화를 하는 것은 똑같다.
차이는 그다음에 있다. 가우시안에서는 정규화에 필요한 전체 넓이가
\(\sigma\sqrt{2\pi}\) 라는 것을 미리 수학적으로 알고 있다.
따라서 새로운 \(\mu\)와 \(\sigma\)가 주어져도 복잡한 적분을 매번 다시 풀 필요 없이, 이미 알려진 공식에 대입하면 바로 확률밀도를 계산할 수 있다.
반면 신경망의 경우 \(Z_\theta = \int \exp(f_\theta(x))\,dx\) 에서 \(f_\theta(x)\)가 만들어내는 모양이 거의 어떤 형태든 될 수 있다.
따라서 가우시안처럼 “이 함수의 전체 넓이는 항상 이 공식으로 계산된다.” 라고 미리 적어둘 수 있는 간단한 식이 일반적으로 존재하지 않는다.
왜 이런 차이가 생길까?
가우시안의 모양이 매우 제한적이기 때문이다. 가우시안은 아무 모양이나 만들 수 있는 함수가 아니다. 평균 \(\mu\)를 움직이면 봉우리의 위치가 바뀌고, 분산 \(\sigma^2\)을 바꾸면 봉우리의 폭이 변하지만, 결국 기본적으로는 하나의 매끄러운 종 모양이라는 형태를 벗어나지 않는다.
즉 가우시안은 표현할 수 있는 모양을 제한한 대신,
라는 결과를 미리 수학적으로 알아낼 수 있게 된 것이다.
따라서 가우시안은 정규화 문제를 특별히 피해 간 것이 아니라, 표현력을 일부 포기한 대가로 계산 가능성을 얻은 것 이다.
결국 우리가 마주한 문제는
복잡한 실제 데이터의 분포를 충분히 표현하면서도, \(Z_\theta \)문제를 어떻게 해결할 것인가?
라는 질문이 남는다. 이에 질문에 대한 답변은 다음장에서 이여서 다룬다.
쉬어가기: NLL을 더 직관적으로 읽는 방법
우리가 앞에서 사용한 평균 Negative Log-Likelihood는
이다.
NLL이 작다는 것은 모델이 실제로 관측된 데이터에 높은 확률을 부여했다는 뜻이다. 하지만 NLL은 로그를 취한 값이기 때문에 숫자만 보고 직관적으로 해석하기는 어렵다.
예를 들어 \(\mathcal L_{\mathrm{NLL}}=0.69\)라고 했을 때, 이것만 보고 모델이 얼마나 헷갈리고 있는지 바로 감이 오지는 않는다. 그래서 로그를 다시 되돌려 원래의 확률적인 크기로 해석하기 위해 지수함수를 취한다.
이를 perplexity(당혹도) 라고 한다.
1. Perplexity는 무엇을 의미할까?
언어 모델에서는 NLL을 그대로 사용하기도 하지만, 이를 조금 더 직관적인 값으로 바꾼 perplexity(당혹도)를 자주 사용한다.
예를들어 모델이 매번 정답에 \(q_\theta(x_i)=0.5\)의 확률을 준다고 하자.
평균 NLL은 \(-\log 0.5 = \log 2 \approx0.693\) 이고, \(\mathrm{PPL}= e^{0.693} = 2\) 가 된다.
정답 하나를 맞춰야하는 모델 입장에서는
서로 비슷하게 그럴듯한 선택지 2개 중 하나를 고르는 것과 비슷한 어려움 이라 해석할 수 있다.
마찬가지로 정답에 항상 0.25 정도의 확률만 줄 수 있다면 \(-\log0.25=\log4\) 이므로 \(\mathrm{PPL}=4\) 가 된다. 따라서 직관적으로
라고 생각할 수 있다.
| 정답에 부여한 확률 | NLL | PPL | 직관 |
|---|---|---|---|
| 1.0 | 0 | 1 | 사실상 선택지 1개 |
| 0.5 | 0.693 | 2 | 선택지 약 2개 |
| 0.25 | 1.386 | 4 | 선택지 약 4개 |
| 0.1 | 2.303 | 10 | 선택지 약 10개 |
그런데 PPL이 1보다 크다고 해서 항상 모델이 부족한 것은 아니다
세상 자체에 불확실성이 있을 수도 있다. 예를 들어 완전히 공정한 동전을 생각해보자. 동전확률 분포는 \(P(H)=0.5,\; P(T)=0.5\) 이다.
아무리 완벽한 모델이라도 다음 결과가 앞면인지 뒷면인지 미리 알아낼 수 없다.
완벽하게 실제 분포를 배운 모델이라면 \(q(H)=0.5,\; q(T)=0.5\) 라고 예측하는 것이 최선이다.
그러면 \(\mathrm{PPL}=2\) 이다. 즉 모델이 완벽한데도 PPL이 1이 아니다.
왜냐하면 문제 자체에 두 가지 가능한 결과가 존재하기 때문이다.
그래서 perplexity에는 두 종류의 어려움이 섞여 있다.
2. bits/dim: 데이터를 표현하려면 몇 비트가 필요한가?
앞에서 본 NLL은 모델이 실제 데이터에 얼마나 높은 likelihood를 부여했는지를 측정하는 값이었다. 그런데 같은 값을 정보량의 관점에서도 해석할 수 있다.
어떤 사건의 확률이 \(q_\theta(x)\)라면 그 사건의 정보량은 \(-\log_2 q_\theta(x)\)로 표현할 수 있다.
확률이 높은 사건은 자주 일어나므로 정보량이 작고, \(q_\theta(x)\uparrow \; \Rightarrow\; -\log_2 q_\theta(x)\downarrow\)
확률이 낮은 사건은 드물기 때문에 더 많은 정보가 필요하다. \(q_\theta(x)\downarrow \;\Rightarrow\; -\log_2 q_\theta(x)\uparrow\)
즉, 잘 예측한 데이터일수록 필요한 bit 수가 작다.
예를 들어 작은 이미지와 큰 이미지를 비교해보자.
큰 이미지는 표현해야 하는 숫자의 개수가 더 많으므로, 같은 수준으로 잘 모델링했더라도 전체 정보량 \(-\log_2 q_\theta(x)\) 은 자연스럽게 더 커진다.
그래서 전체 bit 수를 그대로 비교하지 않고, 데이터의 차원 수 \(d\)로 나눈다.
즉, 데이터를 구성하는 숫자 하나당 평균적으로 몇 bit가 필요한가? 를 보는 것이다.
어떻게 해석하면 될까?
예를 들어 \(\mathrm{bits/dim}=3\) 이라면 직관적으로 데이터의 숫자 하나를 표현하는 데 평균적으로 약 3 bit의 정보가 필요하다 는 뜻이다.
따라서
고 해석한다. 모델이 실제 데이터 구조를 잘 알고 있다면 실제 데이터에 높은 likelihood를 주고,
\(q_\theta(x)\uparrow\) 그러면 \(-\log_2q_\theta(x)\downarrow\) 하므로 필요한 bit 수도 줄어든다.
그래서 좋은 확률 모델은 좋은 압축 모델과도 연결된다.
마무리
Perplexity가 NLL을 “평균적으로 몇 가지 선택지 사이에서 헷갈리는가”로 읽는 방법이라면, bits/dim은 같은 NLL을 “차원 하나를 표현하는 데 평균 몇 bit가 필요한가”로 읽는 방법이다.
Comment