섹션 2: 생성 모델의 일반 원리
요약
본 글은 생성 모델의 수학적 원리를 깊이 있게 분석하며, 실제 데이터 분포($P_x$)를 추정하고 샘플링하는 과정을 설명합니다. 핵심은 $P_x$와 매개변수화된 근사 분포($P_ heta$) 사이의 발산(divergence)을 정의하고 최소화하는 최적화 문제입니다. 이 과정이 모든 후속 생성 모델들의 기본 레시피가 됩니다.
핵심 포인트
- 생성 모델은 $P_x$를 추정하고 샘플링하는 것이 목표입니다.
- 핵심 원리는 (1) 매개변수 가정, (2) 발산 정의, (3) 최적화 문제 해결의 3단계 레시피로 요약됩니다.
- 최종적으로 노이즈($z$)를 네트워크($g_{ heta^*}$)에 통과시켜 $P_x$와 가장 근접한 샘플을 얻습니다.
- 실제 데이터 분포 관측이 어려워 로그만 가지고 작업하는 것이 생성 모델의 난점입니다.
저는 Prof. Prathosh AP의 공개 강의인 Mathematical Foundations of Generative AI를 공부하고 있습니다. 이 플레이리스트가 핵심 줄기입니다. 여기에 적은 노트들은 각 섹션에 대한 저의 심층 분석입니다: 그림이 중요한 부분에서는 시각 자료로, 선수 지식이 필요한 부분에서는 우회 설명으로, 그리고 공식은 제 언어로 풀어쓴 것입니다.
이전 글: 섹션 1: 데이터셋과 문제.
섹션 2: 생성 모델의 일반 원리
섹션 1을 마치고 나니, 막연한 목표가 남았습니다: $P_x$를 추정하고 이로부터 샘플링하는 방법을 배우는 것입니다. 이것이 그 목표를 세 가지 단계로 바꾸어 주는 레시피입니다. 강의에 나오는 모든 후속 모델들은 이 레시피에 다른 선택지들을 끼워 넣은 것들입니다.
제가 가지고 가는 명제는 다음과 같습니다:
(i) $P_x$ 위에 매개변수적(parametric) 가족, 즉 깊은 신경망을 사용하여 표현되는 $P_ heta$를 가정한다.
(ii) $P_x$와 $P_ heta$ 사이의 발산(divergence)을 정의하고 추정한다.
(iii) 그 발산을 최소화하기 위해 $P_ heta$의 매개변수들에 대한 최적화 문제를 해결한다.
이것을 구체적인 예시로 들어보겠습니다: $z ext{를 } ext{N}(0, I) ext{에서 샘플링하고, 이를 네트워크 } g_ heta : ext{Z} o ext{X} ext{에 통과시킨 후, } x = g_ heta(z) ext{의 분포를 } P_ heta ext{라고 부릅니다. 그리고 다음을 해결합니다:
$$
\theta^* = \arg ext{min}_ heta ; \mathcal{D}(P_x | , P_ heta)
$$
그 후, $z ext{를 } ext{N}(0, I) ext{에서 샘플링하고 } g_{ heta^}(z) ext{를 계산하면, 이 가족이 도달할 수 있는 가장 근접한 } P_x ext{의 샘플들인 } P_{ heta^} ext{로부터 샘플을 얻게 됩니다.}
이 공식 아래에는 네 가지 선수 지식이 놓여 있습니다: 표준 가우시안 $ ext{N}(0, I)$, 확률 변수가 함수를 통과할 때 무슨 일이 일어나는지, 발산(divergence)이 무엇인지, 그리고 $ ext{arg} ext{min}$ 표기법입니다. 각 우회 설명은 필요한 단계만큼만 길게 다루었습니다.
직관
저는 $P_x$를 볼 수 없습니다. 저는 평범한 무작위 노이즈를 데이터 형태의 출력으로 변환하는 장치를 조절기 $\theta$가 있는 기계로 만듭니다. 저는 이 기계의 출력 분포가 실제 분포에 최대한 가깝도록 조절기를 계속 돌립니다. 그 근접도가 바로 발산(divergence)입니다. 그리고 돌리는 행위는 최적화(optimisation)입니다.
부하 테스트, 계속하기
섹션 1에서 다룬 트래픽 생성기(traffic generator)는 무작위 시드(random seeds)를 받아 합성 요청을 출력합니다. 이 생성기는 엔드포인트 가중치, 페이로드 크기 매개변수 등 설정 조절기들을 가지고 있습니다.
| 부하 테스트 비유 | 표기법 |
|---|---|
| 생성기에 입력되는 무작위 시드 | $z \sim \mathcal{N}(0, I)$ |
| ... |
가장 어려운 부분은 점수(score)입니다. 저는 실제 사용자 행동을 볼 수 없습니다. 오직 로그만 가지고 있습니다. 이것이 나머지 강의들이 계속해서 돌아오는 어려움입니다.
시각화
레시피를 보기에는 한 차원만으로 충분합니다. 노이즈는 $z \sim \mathcal{N}(0, 1)$입니다. 네트워크는 제가 작성할 수 있는 가장 간단한 형태인 $g_{\theta}(z) = a z + b$이며, 따라서 $\theta = (a, b)$입니다. 녹색 곡선은 목표(target)입니다. 파란색 곡선은 이 생성기가 만들어낼 수 있는 것입니다.
슬라이더를 움직이면서 제가 원하는 세 가지는 다음과 같습니다:
- 단일 봉우리(single bump)의 경우, $a = 0.6$과 $b = 2$가 발산을 0으로 만듭니다. 목표는 분산이 0.6이고 중심이 2인 종 모양이며, $x = 0.6z + 2$가 정확히 그 종 모양입니다. 이 기계는 $P_x$를 재현합니다.
- 두 봉우리의 경우, 제가 $(a, b)$를 어떻게 설정하든 발산은 0에 도달하지 못합니다. 가장 가까운 파란색 곡선은 두 언덕 위에 놓인 넓은 종 모양입니다. 선형 $g_{\theta}$는 하나의 종을 이동시키거나 늘릴 수만 있습니다. 두 개를 만들 수는 없습니다. 이것이 원리가 깊은 네트워크(deep network)를 요구하는 이유입니다: $P_{\theta}$가 $P_x$에 가깝게 될 만큼 충분히 유연해야 합니다.
- 차트는 녹색 곡선을 그리고, 발산을 계산할 수 있습니다. 왜냐하면 제가 목표를 안에 구축했기 때문입니다. 실제 문제에서는 그 그림을 얻지 못합니다. 오직 샘플만 얻습니다. 이것이 아래 네 가지 열린 질문 중 첫 번째 것입니다.
우회 경로(Detours)
표준 가우시안 $\mathcal{N}(0, I)$. $\mathcal{N}(\mu, \sigma^2)$는 평균이 $\mu$이고 분산이 $\sigma^2$인 종 모양의 분포입니다. 표준(Standard)이라는 것은 $\mu = 0$이고 $\sigma = 1$을 의미합니다. $k$차원에서 $\mathcal{N}(0, I)$는 각 좌표마다 독립적인 $k$개의 표준 종 모양 분포로 이루어져 있습니다. 여기서 $I$는 $k \times k$ 단위 공분산 행렬(identity covariance)입니다: 즉, 각 좌표의 분산은 1이고 어떤 두 좌표도 상관관계가 없습니다.
이는 입력 노이즈 역할을 하는데, 모든 라이브러리가 이를 샘플링할 수 있고 자체적인 구조를 가지고 있지 않기 때문입니다. 출력에 나타나는 모든 구조는 $g_\theta$로부터 나와야 합니다. 따라서 $z \sim \mathcal{N}(0, I)$는 무작위 시드(random seed)이며, 뽑아내기 쉽고 이미지와 관련된 정보를 담지 않습니다.
무작위 변수를 함수를 통과시키기. 만약 $z$가 무작위이고 $x = g(z)$라면, $x$ 역시 무작위이며, 그 분포는 $g$에 의해 결정되는 새로운 분포를 가집니다.
가장 간단한 경우: 만약 $z \sim \mathcal{N}(0, 1)$이라면, $x = az + b \sim \mathcal{N}(b, a^2)$입니다. $a$를 곱하는 것은 분산을 늘립니다(stretches the spread). $b$를 더하는 것은 중심을 이동시킵니다(slides the centre). 위 슬라이더들이 하는 일이 바로 이것입니다.
깊고 비선형적인 함수 $g$는 출력을 여러 개의 봉우리로 휘게 만들거나, 얼굴 분포와 같은 얇은 집합으로 만들 수 있습니다. 출력 분포는 $z$의 분포와 다르며, $g_\theta$에 의존합니다. 저는 이 출력 분포를 $P_\theta$라고 명명합니다. 깊은 네트워크의 경우, 저는 보통 그 공식(formula)을 작성할 수 없습니다. 제가 아는 것은 오직 샘플링하는 방법뿐입니다: $z$를 뽑아내고 $g_\theta$를 실행합니다.
거리(distance)보다 약한 발산(Divergence). $\mathcal{D}(P ,|, Q)$는 두 분포가 얼마나 다른지를 점수화합니다. 제가 필요한 두 가지 속성은 다음과 같습니다:
$$
\mathcal{D}(P_x ,|, P_\theta) \ge 0, \qquad \mathcal{D}(P_x ,|, P_\theta) = 0 \iff P_x = P_\theta$
대칭적일 필요는 없습니다. $\mathcal{D}(P ,|, Q)$가 $\mathcal{D}(Q ,|, P)$와 다를 수 있습니다. 그래서 표기법에 쉼표(,) 대신 $|$ 기호를 사용합니다. 차트의 KL divergence가 한 예입니다. 다음 참고 사항은 이들이 속한 전체 계열을 구축합니다: Section 3a: f-divergences.
이 두 가지 속성 덕분에 '발산을 최소화하는 것'이 합리적인 목표가 됩니다. 가능한 가장 작은 값은 0이며, 모델이 데이터와 일치할 때만 도달합니다.
$\arg\min$. $\min_\theta f(\theta)$는 $f$의 가장 작은 값입니다. $\arg\min_\theta f(\theta)$는 그 값을 달성하는 입력 $\theta$입니다. 만약 $f(\theta) = (\theta - 3)^2 + 1$이라면, 최소값(min)은 1이고 argmin은 3입니다. 저는 점수(score)가 아니라 노브 설정(knob settings)을 원하기 때문에 이 원리는 argmin을 사용합니다.
수식
$$
\theta^* = \arg\min_\theta ; \mathcal{D}\big(P_x ,|, P_\theta\big), \qquad P_\theta := \text{distribution of } g_\theta(z),; z \sim \mathcal{N}(0, I)
$$
소리 내어 읽기: $\theta^*$는 실제 데이터 분포와 네트워크 출력의 분포 사이의 발산을 가능한 한 작게 만드는 네트워크 가중치 설정입니다.
| 기호 | 의미 | 유형 / 형태 | 역할 |
|---|---|---|---|
| $z$ | 입력 노이즈 | $\mathbb{R}^k$ 벡터, 보통 $k \ll d$ | 무작위 시드(random seed) |
| ... | |||
| 훈련을 마치면 샘플링은 다음과 같습니다: 새로운 $z \sim \mathcal{N}(0, I)$를 뽑고, $g_{\theta^}(z)$를 계산합니다. 이는 $P_{\theta^} \approx P_x$인 $P_{\theta^*}$로부터의 하나의 샘플입니다. 저는 $P_x$에서 샘플링하는 방법을 명시적으로 작성하지 않고도 학습했습니다. |
손으로 풀기 적당한 예제
$k = d = 1$이고 $g_{\theta}(z) = 2z + 3$이라고 가정하고, 따라서 $\theta = (a, b) = (2, 3)$입니다.
- 세 개의 노이즈 값을 뽑습니다: $z = -1, 0, 1$.
- 출력값: $g_{\theta}(-1) = 1$, $g_{\theta}(0) = 3$, $g_{\theta}(1) = 5$.
- 위의 pushforward에 따라 모든 출력값은 $P_\theta = \mathcal{N}(3, 2^2)$에서 나옵니다. 중심(Centre)은 3이고 분산(spread)은 2이며, 이는 이 샘플들과 일치합니다.
발산을 계산하기 위해서는 두 가지 결과만 있는 세계로 충분합니다. 공정한 동전 $P_x$ (0.5, 0.5)를 사용하고 KL 발산 $\sum_i P_x(i) \ln \frac{P_x(i)}{P_{\theta}(i)}$을 이용해 보겠습니다. KL은 공식적으로 다음 강의에서 다룰 내용입니다. 여기서는 단순히 숫자가 변하는 것을 보기 위해 필요할 뿐입니다.
- 만약 모델이 $P_{\theta} = (0.9, 0.1)$이라고 예측한다면: $0.5 \ln\frac{0.5}{0.9} + 0.5 \ln\frac{0.5}{0.1} = 0.5(-0.588) + 0.5(1.609) \approx 0.511$.
- 만약 모델이 $P_{\theta} = (0.6, 0.4)$라고 예측한다면: $0.5 \ln\frac{0.5}{0.6} + 0.5 \ln\frac{0.5}{0.4} = 0.5(-0.182) + 0.5(0.223) \approx 0.020$.
- 만약 모델이 $P_{\theta} = (0.5, 0.5)$라고 예측한다면: 두 항 모두 $0.5 \ln 1 = 0$이므로 발산은 정확히 0입니다.
모델이 진실에 가까워질수록 점수는 0을 향해 떨어지며, 완벽하게 일치할 때만 0에 도달합니다. 최적화는 이 숫자를 낮추는 방향으로 $\theta$를 이동시키는 것입니다.
이 레시피가 답하지 못하는 네 가지 질문
나머지 강의들은 이러한 질문들에 답하려는 시도입니다.
| 질문 | 어려운 이유 | 답변이 예상되는 곳 |
|---|---|---|
| $P_x$ 또는 $P_{\theta}$에 대한 공식 없이 발산을 계산하려면 어떻게 해야 하나요? | 양쪽 모두 샘플만 가지고 있습니다 | 발산을 기댓값으로 작성한 다음, 표본 평균으로 추정합니다 |
| ... |
나중에 다룰 모델들의 위치
| 모델 | $P_{\theta}$ 선택 방식 | 발산 | 최적화 |
|---|---|---|---|
| GAN | $g_{\theta}(z)$, 암시적(implicit) | Jensen–Shannon, f-발산 | 판별자(discriminator)를 사용한 min-max |
| ... | |||
| 제가 일찍 다루고 싶은 연결 고리가 있습니다: $\mathrm{KL}(P_x , | , P_{\theta})$을 최소화하는 것은 최대 우도 추정(maximum likelihood)과 같습니다. 왜냐하면 $\arg\min \mathrm{KL}(P_x , | , P_{\theta}) = \arg\max \mathbb{E}[\log P_{\theta}(x)]$이기 때문입니다. 이것이 VAE, 확산 모델(diffusion models), 그리고 언어 모델(language models) 모두가 로그 우도 손실(log-likelihood losses)로 훈련할 수 있고 여전히 이 동일한 레시피를 따르는 이유입니다. |
제가 답할 수 있기를 바라는 질문들:
- $(a, b)$의 어떤 설정으로도 두 개의 봉우리(two-bump) 타겟을 맞출 수 없는 이유는 무엇이며, $g_{\theta}$는 무엇이 바뀌어야 하나요?
- 훈련 후, 한 줄로 10개의 새로운 샘플을 생성하려면 어떻게 해야 하나요?
- 만약 $\mathcal{D}(P_x ,|, P_{\theta}) = 0$이라면 어떤 일이 발생하나요? 만약 발산(divergence)이 작지만 0은 아니라면요?
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기