개념
랜덤 워크(Random Walk)
위치(position) 0에서 시작합니다. 매 단계마다 공정한 동전(fair coin)을 던집니다. 앞면이면 오른쪽으로 +1, 뒷면이면 왼쪽으로 -1 이동합니다.
n번 단계 뒤의 위치는 n개의 무작위 +/-1 값의 합입니다. 기댓값(expected position)은 0입니다. 워크는 편향이 없습니다(unbiased). 하지만 원점(origin)으로부터의 기대 거리(expected distance)는 sqrt(n)처럼 증가합니다.
이것은 직관에 반할 수 있습니다. 워크는 공정하고 어느 방향으로도 표류(drift)가 없습니다. 하지만 시간이 지나면 시작점에서 점점 멀어집니다. n번 단계 뒤 표준편차(standard deviation)는 sqrt(n)입니다.
Step 0: Position = 0
Step 1: Position = +1 or -1
Step 2: Position = +2, 0, or -2
...
Step 100: Expected distance from origin ~ 10 (sqrt(100))
Step 10000: Expected distance from origin ~ 100 (sqrt(10000))
2차원에서는 워크가 같은 확률로 위, 아래, 왼쪽, 오른쪽 중 하나로 움직입니다. 원점으로부터의 거리에는 같은 sqrt(n) 스케일링이 적용됩니다. 경로(path)는 프랙털(fractal)에 가까운 패턴을 그립니다.
왜 sqrt(n)인가? 각 단계는 같은 확률로 +1 또는 -1입니다. n번 단계 뒤 위치는 S_n = X_1 + X_2 + ... + X_n이고, 각 X_i는 +/-1입니다. 각 단계의 분산(variance)은 1이고 단계들은 서로 독립이므로 Var(S_n) = n입니다. 표준편차는 sqrt(n)입니다. 중심극한정리(central limit theorem)에 의해 S_n / sqrt(n)은 표준 정규분포(standard normal distribution)로 수렴합니다.
이 sqrt(n) 스케일링은 머신러닝(ML) 곳곳에 등장합니다. 확률적 경사하강(SGD) 잡음은 1/sqrt(batch_size)로 스케일됩니다. 임베딩(embedding) 차원은 sqrt(d)로 스케일되는 경우가 많습니다. 제곱근은 독립인 무작위 합의 특징적인 시그니처입니다.
브라운 운동과의 연결. 단계 크기가 1/sqrt(n)이고 단위 시간당 n번 단계를 갖는 랜덤 워크를 생각합니다. n이 무한대로 가면 워크는 브라운 운동(Brownian motion) B(t)로 수렴합니다. 브라운 운동은 연속 시간 과정(continuous-time process)이며, B(t)는 평균 0, 분산 t인 정규분포를 따릅니다.
브라운 운동은 확산(diffusion)의 수학적 토대입니다. 유체(fluid) 안 입자(particle)의 무작위 떨림, 주가 변동, 그리고 확산 모델의 잡음 과정(noise process)을 모델링합니다.
도박꾼의 파산(Gambler's ruin). 위치 k에서 시작하고 0과 N에 흡수 장벽(absorbing barrier)이 있는 랜덤 워커를 생각합니다. 0보다 먼저 N에 도달할 확률은 얼마일까요? 공정한 워크에서는 P(reach N) = k/N입니다. 단순하고 우아한 결과입니다. 마팅게일 이론(martingale theory)과 연결됩니다. 공정한 랜덤 워크는 마팅게일(martingale)입니다. 미래 기댓값이 현재 값과 같습니다.
마르코프 체인(Markov Chain)
마르코프 체인은 고정된 확률에 따라 상태(state) 사이를 전이(transition)하는 시스템입니다. 핵심 성질은 다음 상태가 현재 상태에만 의존하고 과거 이력(history)에는 의존하지 않는다는 것입니다.
P(X_{t+1} = j | X_t = i, X_{t-1} = ...) = P(X_{t+1} = j | X_t = i)
이것이 마르코프 성질(Markov property)입니다. 전체 동역학(dynamics)을 전이 행렬(transition matrix) P로 설명할 수 있다는 뜻입니다.
P[i][j] = probability of going from state i to state j
P의 각 행은 1로 합쳐집니다. 어디론가는 반드시 가야 하기 때문입니다.
예시: 날씨(Weather)
States: Sunny (0), Rainy (1), Cloudy (2)
P = [[0.7, 0.1, 0.2], (if sunny: 70% sunny, 10% rainy, 20% cloudy)
[0.3, 0.4, 0.3], (if rainy: 30% sunny, 40% rainy, 30% cloudy)
[0.4, 0.2, 0.4]] (if cloudy: 40% sunny, 20% rainy, 40% cloudy)
어떤 상태에서 시작하더라도 충분히 많은 전이를 거치면 상태 분포는 정상분포(stationary distribution) pi로 수렴합니다. pi * P = pi를 만족하는 분포입니다. 이는 고윳값(eigenvalue) 1을 갖는 P의 왼쪽 고유벡터(left eigenvector)입니다.
날씨 체인의 정상분포는 예를 들어 [0.53, 0.18, 0.29]일 수 있습니다. 장기적으로 보면 시작 상태와 무관하게 53%의 시간 동안 맑음입니다.
graph LR
S["Sunny"] -->|0.7| S
S -->|0.1| R["Rainy"]
S -->|0.2| C["Cloudy"]
R -->|0.3| S
R -->|0.4| R
R -->|0.3| C
C -->|0.4| S
C -->|0.2| R
C -->|0.4| C
정상분포 계산. 두 가지 접근이 있습니다.
- 거듭제곱 방법(power method): 임의의 초기 분포에
P를 반복해서 곱합니다. 충분히 반복하면 수렴합니다.
- 고윳값 방법(eigenvalue method): 고윳값 1을 갖는
P의 왼쪽 고유벡터를 찾습니다. 이는 P^T의 고윳값 1에 대한 고유벡터입니다.
두 접근 모두 체인이 수렴 조건(convergence condition)을 만족해야 합니다.
수렴 조건. 마르코프 체인이 유일한 정상분포로 수렴하려면 다음을 만족해야 합니다.
- 기약(irreducible): 모든 상태에서 다른 모든 상태에 도달할 수 있습니다.
- 비주기적(aperiodic): 체인이 고정 주기로 순환하지 않습니다.
머신러닝에서 만나는 대부분의 체인은 두 조건 모두 만족합니다.
흡수 상태(absorbing state). 한 번 들어가면 떠날 수 없는 상태입니다. 즉 P[i][i] = 1입니다. 흡수 마르코프 체인(absorbing Markov chain)은 종결 상태(terminal state)가 있는 과정을 모델링합니다. 종료되는 게임, 이탈한 고객, 텍스트 끝 토큰(end-of-text token)에 도달한 토큰 시퀀스가 예입니다.
혼합 시간(mixing time). 체인이 정상분포에 "가까워지기"까지 몇 단계가 필요한지를 말합니다. 형식적으로는 정상성(stationarity)과의 총변동거리(total variation distance)가 어떤 임곗값(threshold) 아래로 떨어질 때까지의 단계 수입니다. 빠른 혼합은 적은 단계만 필요하다는 뜻입니다. P의 스펙트럴 갭(spectral gap), 즉 1에서 두 번째로 큰 고윳값을 뺀 값이 혼합 시간을 좌우합니다. 갭이 클수록 혼합이 빨라집니다.
언어 모델(Language Model)과의 연결
언어 모델의 토큰 생성은 근사적으로 마르코프 과정입니다. 현재 문맥이 주어지면 모델은 다음 토큰에 대한 분포를 출력합니다. 온도(temperature)는 분포의 날카로움을 조절합니다.
P(token_i) = exp(logit_i / temperature) / sum(exp(logit_j / temperature))
- 온도 = 1.0: 표준 분포
- 온도 < 1.0: 더 뾰족하고 더 결정론적(deterministic)입니다.
- 온도 > 1.0: 더 평평하고 더 무작위적입니다.
- 온도 -> 0: 최댓값 선택(argmax), 즉 탐욕적(greedy) 선택입니다.
Top-k 표본 추출은 확률이 가장 높은 토큰 k개로 잘라냅니다. Top-p, 즉 핵 표본 추출(nucleus sampling)은 누적 확률이 p를 넘는 가장 작은 토큰 집합으로 잘라냅니다. 둘 다 마르코프 전이 확률(Markov transition probability)을 수정합니다.
브라운 운동(Brownian Motion)
브라운 운동은 랜덤 워크의 연속 시간 극한(continuous-time limit)입니다. 위치 B(t)는 세 가지 성질을 가집니다.
B(0) = 0
B(t) - B(s)는 평균 0, 분산 t - s인 정규분포를 따릅니다(t > s).
- 겹치지 않는 구간(interval)의 증분(increment)들은 서로 독립입니다.
브라운 운동은 연속이지만 어디서도 미분 가능하지 않습니다. 모든 스케일에서 떨립니다. 평면에서 경로는 프랙털 차원(fractal dimension) 2를 가집니다.
이산 시뮬레이션에서는 다음처럼 브라운 운동을 근사합니다.
B(t + dt) = B(t) + sqrt(dt) * z, where z ~ N(0, 1)
sqrt(dt) 스케일링이 중요합니다. 랜덤 워크에 중심극한정리를 적용한 결과입니다.
랑주뱅 동역학(Langevin Dynamics)
경사 하강(gradient descent)은 함수의 최솟값을 찾습니다. 랑주뱅 동역학은 exp(-U(x)/T)에 비례하는 확률분포를 찾습니다. 여기서 U는 에너지 함수(energy function)이고 T는 온도(temperature)입니다.
x_{t+1} = x_t - dt * gradient(U(x_t)) + sqrt(2 * T * dt) * z_t
입자에는 두 가지 힘이 작용합니다.
- 기울기 힘(gradient force)(
-dt * gradient(U)): 낮은 에너지 쪽으로 밀어줍니다. 경사 하강과 비슷합니다.
- 무작위 힘(random force)(
sqrt(2*T*dt) * z): 무작위 방향으로 밀어 탐색(exploration)을 만듭니다.
T = 0이면 순수한 경사 하강입니다. 온도가 높으면 거의 랜덤 워크에 가깝습니다. 적절한 온도에서는 입자가 에너지 지형(energy landscape)을 탐색하면서 낮은 에너지 영역에 더 오래 머무릅니다.
확산 모델과의 연결. 확산 모델의 순방향 과정은 다음과 같습니다.
x_t = sqrt(alpha_t) * x_{t-1} + sqrt(1 - alpha_t) * noise
이것은 데이터에 잡음을 점진적으로 섞는 마르코프 체인입니다. 충분한 단계 뒤 x_T는 순수한 가우시안 잡음(Gaussian noise)이 됩니다.
잡음에서 데이터로 돌아가는 역방향 과정도 마르코프 체인입니다. 다만 전이 확률이 신경망(neural network)으로 학습됩니다. 신경망은 각 단계에서 더해진 잡음을 예측하고, 그것을 빼내는 법을 배웁니다.
graph LR
subgraph "Forward Process (add noise)"
X0["x_0 (data)"] -->|"+ noise"| X1["x_1"]
X1 -->|"+ noise"| X2["x_2"]
X2 -->|"..."| XT["x_T (pure noise)"]
end
subgraph "Reverse Process (denoise)"
XT2["x_T (noise)"] -->|"neural net"| XR2["x_{T-1}"]
XR2 -->|"neural net"| XR1["x_{T-2}"]
XR1 -->|"..."| XR0["x_0 (generated data)"]
end
MCMC: 마르코프 체인 몬테카를로(Markov Chain Monte Carlo)
직접 표본을 뽑을 수는 없지만 정규화 상수(normalizing constant)를 제외하고 값을 평가할 수 있는 분포 p(x)에서 표본을 뽑아야 할 때가 있습니다. 베이지안 사후분포(Bayesian posterior)가 대표적인 예입니다. 가능도(likelihood)와 사전분포(prior)의 곱은 알지만 정규화 상수는 다루기 어렵습니다.
메트로폴리스-헤이스팅스(Metropolis-Hastings)는 정상분포가 p(x)인 마르코프 체인을 구성합니다.
- 어떤 위치
x에서 시작합니다.
- 제안 분포(proposal distribution)
Q(x'|x)에서 새 위치 x'를 제안합니다.
- 수락 비율(acceptance ratio)
a = p(x') * Q(x|x') / (p(x) * Q(x'|x))를 계산합니다.
- 확률
min(1, a)로 x'를 수락합니다. 아니면 x에 그대로 머무릅니다.
- 반복합니다.
Q가 대칭이면, 예를 들어 Q(x'|x) = Q(x|x') = N(x, sigma^2)이면 비율은 a = p(x') / p(x)로 단순해집니다. 확률의 비율만 필요하므로 정규화 상수는 약분되어 사라집니다.
이 체인은 온건한 조건 아래에서 p(x)로 수렴합니다. 하지만 제안 폭이 너무 작으면 랜덤 워크처럼 느리게 움직이고, 너무 크면 거절(rejection)이 많아져 수렴이 느려질 수 있습니다. 제안을 잘 조율(tuning)하는 것이 MCMC의 기술입니다.
왜 작동하는가. 수락 비율은 세부 균형(detailed balance)을 보장합니다. x에 있다가 x'로 갈 확률과 x'에 있다가 x로 갈 확률이 균형을 이룹니다. 세부 균형은 p(x)가 체인의 정상분포임을 의미합니다. 충분히 긴 시간이 지나면 표본은 p(x)에서 나온 것처럼 됩니다.
실용적 고려 사항:
- 번인(burn-in): 첫 N개의 표본을 버립니다. 체인이 시작점에서 정상분포에 도달할 시간이 필요합니다.
- 솎아내기(thinning): 자기상관(autocorrelation)을 줄이기 위해 k번째 표본만 유지합니다.
- 다중 체인(multiple chains): 서로 다른 시작점에서 여러 체인을 실행합니다. 같은 분포로 수렴하면 수렴의 증거가 됩니다.
- 수락률(acceptance rate): 가우시안 제안에서 d차원의 최적 수락률은 약 23%입니다(Roberts & Rosenthal, 2001). 너무 높으면 체인이 거의 움직이지 않는다는 뜻이고, 너무 낮으면 거의 거절한다는 뜻입니다.
AI에서의 확률 과정(Stochastic Process)
| 확률 과정 | AI 응용 |
|---|
| 랜덤 워크(random walk) | 강화학습에서의 탐색, Node2Vec 임베딩 |
| 마르코프 체인(Markov chain) | 텍스트 생성, MCMC 표본 추출 |
| 브라운 운동(Brownian motion) | 확산 모델(순방향 과정) |
| 랑주뱅 동역학(Langevin dynamics) | 점수 기반(score-based) 생성 모델, SGLD |
| 마르코프 결정 과정(Markov decision process) | 강화학습 |
| 메트로폴리스-헤이스팅스(Metropolis-Hastings) | 베이지안 추론, 사후 표본 추출 |
만들어 보기
Step 1: 랜덤 워크(Random Walk) 시뮬레이터
import numpy as np
def random_walk_1d(n_steps, seed=None):
rng = np.random.RandomState(seed)
steps = rng.choice([-1, 1], size=n_steps)
positions = np.concatenate([[0], np.cumsum(steps)])
return positions
def random_walk_2d(n_steps, seed=None):
rng = np.random.RandomState(seed)
directions = rng.choice(4, size=n_steps)
dx = np.zeros(n_steps)
dy = np.zeros(n_steps)
dx[directions == 0] = 1
dx[directions == 1] = -1
dy[directions == 2] = 1
dy[directions == 3] = -1
x = np.concatenate([[0], np.cumsum(dx)])
y = np.concatenate([[0], np.cumsum(dy)])
return x, y
1차원 워크는 누적합(cumulative sum)을 저장합니다. 각 단계는 +1 또는 -1입니다. n번 단계 뒤 위치는 그 합입니다. 분산이 n에 선형으로 증가하므로 표준편차는 sqrt(n)처럼 증가합니다.
Step 2: 마르코프 체인(Markov Chain)
class MarkovChain:
def __init__(self, transition_matrix, state_names=None):
self.P = np.array(transition_matrix, dtype=float)
self.n_states = len(self.P)
self.state_names = state_names or [str(i) for i in range(self.n_states)]
def step(self, current_state, rng=None):
if rng is None:
rng = np.random.RandomState()
probs = self.P[current_state]
return rng.choice(self.n_states, p=probs)
def simulate(self, start_state, n_steps, seed=None):
rng = np.random.RandomState(seed)
states = [start_state]
current = start_state
for _ in range(n_steps):
current = self.step(current, rng)
states.append(current)
return states
def stationary_distribution(self):
eigenvalues, eigenvectors = np.linalg.eig(self.P.T)
idx = np.argmin(np.abs(eigenvalues - 1.0))
stationary = np.real(eigenvectors[:, idx])
stationary = stationary / stationary.sum()
return np.abs(stationary)
정상분포는 고윳값 1을 갖는 P의 왼쪽 고유벡터입니다. P^T의 고유벡터를 계산해 찾습니다. 전치(transpose)를 취하면 왼쪽 고유벡터가 오른쪽 고유벡터로 바뀝니다.
Step 3: 랑주뱅 동역학(Langevin Dynamics)
def langevin_dynamics(grad_U, x0, dt, temperature, n_steps, seed=None):
rng = np.random.RandomState(seed)
x = np.array(x0, dtype=float)
trajectory = [x.copy()]
for _ in range(n_steps):
noise = rng.randn(*x.shape)
x = x - dt * grad_U(x) + np.sqrt(2 * temperature * dt) * noise
trajectory.append(x.copy())
return np.array(trajectory)
기울기는 x를 낮은 에너지 쪽으로 밀고, 잡음은 한곳에 갇히지 않도록 막아 줍니다. 평형(equilibrium) 상태에서는 표본 분포가 exp(-U(x)/temperature)에 비례합니다.
Step 4: 메트로폴리스-헤이스팅스(Metropolis-Hastings)
def metropolis_hastings(target_log_prob, proposal_std, x0, n_samples, seed=None):
rng = np.random.RandomState(seed)
x = np.array(x0, dtype=float)
samples = [x.copy()]
accepted = 0
for _ in range(n_samples - 1):
x_proposed = x + rng.randn(*x.shape) * proposal_std
log_ratio = target_log_prob(x_proposed) - target_log_prob(x)
if np.log(rng.rand()) < log_ratio:
x = x_proposed
accepted += 1
samples.append(x.copy())
acceptance_rate = accepted / (n_samples - 1)
return np.array(samples), acceptance_rate
알고리즘은 새 점을 제안하고, 그 점이 더 높은 확률을 가지는지 확인하거나 비율에 비례하는 확률로 수락합니다. 좋은 혼합(good mixing)을 위해 수락률은 약 23~50% 정도가 좋습니다.
사용하기
실무에서는 이런 알고리즘을 잘 알려진 라이브러리로 사용합니다. 하지만 내부 동작 원리를 이해해야 디버깅과 튜닝을 할 수 있습니다.
import numpy as np
rng = np.random.RandomState(42)
walk = np.cumsum(rng.choice([-1, 1], size=10000))
print(f"Final position: {walk[-1]}")
print(f"Expected distance: {np.sqrt(10000):.1f}")
print(f"Actual distance: {abs(walk[-1])}")
전이 행렬(Transition Matrix)에 numpy 사용하기
import numpy as np
P = np.array([[0.7, 0.1, 0.2],
[0.3, 0.4, 0.3],
[0.4, 0.2, 0.4]])
distribution = np.array([1.0, 0.0, 0.0])
for _ in range(100):
distribution = distribution @ P
print(f"Stationary distribution: {np.round(distribution, 4)}")
초기 분포에 P를 반복해서 곱합니다. 충분히 반복하면 어디서 시작했는지와 무관하게 정상분포로 수렴합니다. 이것이 지배적인(dominant) 왼쪽 고유벡터를 찾는 거듭제곱 방법(power method)입니다.
실제 프레임워크와의 연결
- PyTorch 확산 모델: Hugging Face
diffusers의 DDPMScheduler는 순방향 및 역방향 마르코프 체인을 구현합니다.
- NumPyro / PyMC: 베이지안 추론에 MCMC를 사용합니다. NUTS 표본 추출기(sampler)는 메트로폴리스-헤이스팅스를 개선한 방식입니다.
- Gymnasium(강화학습): 환경의 step 함수가 마르코프 결정 과정을 정의합니다.
마르코프 체인 수렴 확인
import numpy as np
P = np.array([[0.9, 0.1], [0.3, 0.7]])
eigenvalues = np.linalg.eigvals(P)
spectral_gap = 1 - sorted(np.abs(eigenvalues))[-2]
print(f"Eigenvalue: {eigenvalues}")
print(f"Spectral gap: {spectral_gap:.4f}")
print(f"Approximate mixing time: {1/spectral_gap:.1f} steps")
스펙트럴 갭은 체인이 초기 상태를 얼마나 빨리 잊는지 알려줍니다. 갭이 0.2이면 대략 5단계 만에 혼합됩니다. 갭이 0.01이면 대략 100단계가 필요합니다. 긴 시뮬레이션을 실행하기 전에 항상 확인합니다. 천천히 혼합되는 체인은 계산 자원을 낭비합니다.
산출물 만들기
이 lesson의 최종 산출물은 outputs/prompt-stochastic-process-advisor.md입니다. 주어진 문제에 어떤 확률 과정 프레임워크가 적용되는지 판단하고, 구현 방법을 추천하는 프롬프트(prompt)입니다.
연결
| 개념 | 등장하는 곳 |
|---|
| 랜덤 워크(random walk) | Node2Vec 그래프 임베딩, 강화학습에서의 탐색 |
| 마르코프 체인(Markov chain) | 거대 언어 모델(LLM)에서의 토큰 생성, MCMC 표본 추출 |
| 브라운 운동(Brownian motion) | DDPM의 순방향 확산 과정, 확률미분방정식(SDE) 기반 모델 |
| 랑주뱅 동역학(Langevin dynamics) | 점수 기반 생성 모델, 확률적 경사 랑주뱅 동역학(stochastic gradient Langevin dynamics; SGLD) |
| 정상분포(stationary distribution) | MCMC 수렴 목표, PageRank |
| 메트로폴리스-헤이스팅스(Metropolis-Hastings) | 베이지안 사후 표본 추출, 모의 담금질(simulated annealing) |
| 온도(temperature) | LLM 표본 추출, 강화학습에서의 볼츠만 탐색, 모의 담금질 |
| 혼합 시간(mixing time) | MCMC 수렴 속도, 스펙트럴 갭 분석 |
| 흡수 상태(absorbing state) | 시퀀스 끝 토큰(end-of-sequence token), 강화학습의 종결 상태 |
| 세부 균형(detailed balance) | MCMC 표본 추출기의 정확성 보장 |
확산 모델은 특별히 중요합니다. DDPM(Ho et al., 2020)은 순방향 마르코프 체인을 다음처럼 정의합니다.
q(x_t | x_{t-1}) = N(x_t; sqrt(1-beta_t) * x_{t-1}, beta_t * I)
여기서 beta_t는 잡음 스케줄(noise schedule)입니다. T단계 뒤 x_T는 거의 N(0, I)입니다. 역방향 과정은 잡음을 예측하는 신경망으로 매개변수화됩니다.
p_theta(x_{t-1} | x_t) = N(x_{t-1}; mu_theta(x_t, t), sigma_t^2 * I)
생성의 모든 단계는 학습된 마르코프 체인의 한 단계입니다. 마르코프 체인을 이해하면 확산 모델이 데이터를 어떻게, 왜 생성하는지 이해할 수 있습니다.
확률적 경사 랑주뱅 동역학(SGLD; Stochastic Gradient Langevin Dynamics)은 미니배치(mini-batch) 경사 하강과 랑주뱅 잡음을 결합합니다. 전체 기울기 대신 확률적 추정값을 사용하고 보정된(calibrated) 잡음을 더합니다. 학습률(learning rate)이 점점 작아지면 SGLD는 최적화(optimization)에서 표본 추출(sampling)로 전환됩니다. 신경망에서 불확실성 추정값을 얻는 가장 단순한 방법 중 하나입니다.
이 모든 연결의 핵심은 확률 과정이 이론적 도구에 그치지 않는다는 점입니다. 현대 AI 시스템 내부의 계산 메커니즘입니다. LLM의 온도를 조정할 때 마르코프 체인을 조정하고 있는 것입니다. 확산 모델을 학습할 때 브라운 운동에 가까운 과정을 거꾸로 돌리는 법을 배우고 있는 것입니다. 베이지안 추론을 수행할 때 사후분포로 수렴하는 체인을 구성하고 있는 것입니다.
연습문제
-
(쉬움) 10,000단계 랜덤 워크를 1,000개 시뮬레이션합니다. 최종 위치의 분포를 그려 봅니다. 평균 0, 표준편차 sqrt(10000) = 100인 가우시안 분포에 가까운지 검증합니다.
-
(중간) 마르코프 체인으로 텍스트 생성기를 만듭니다. 작은 말뭉치(corpus)에서 각 단어가 다음 단어로 전이하는 횟수를 셉니다. 전이 행렬을 만들고, 체인에서 표본을 뽑아 새 문장을 생성합니다.
-
(중간) 메트로폴리스-헤이스팅스로 모의 담금질(simulated annealing)을 구현합니다. 높은 온도에서 시작해 거의 모든 이동을 수락하고, 점차 냉각하면서 개선되는 경우만 수락하도록 만듭니다. 지역 최솟값(local minimum)이 많은 함수의 최솟값을 찾는 데 사용합니다.
-
(어려움) 서로 다른 온도에서 랑주뱅 동역학을 비교합니다. 이중 우물 퍼텐셜(double-well potential) U(x) = (x^2 - 1)^2에서 표본을 뽑습니다. 낮은 온도에서는 표본이 한 우물(well)에 모이고, 높은 온도에서는 양쪽 우물에 퍼집니다. 체인이 두 우물 사이를 혼합하는 임계 온도(critical temperature)를 찾습니다.
-
(어려움) 순방향 확산 과정을 구현합니다. 1차원 신호, 예를 들어 사인파(sine wave)에서 시작합니다. 선형 잡음 스케줄로 100단계 동안 잡음을 점진적으로 더합니다. 신호가 순수 잡음으로 무너지는 과정을 보여줍니다. 이어서 단순한 잡음 제거기(denoiser)라도 만들어 역방향 과정을 구현해 봅니다.
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 랜덤 워크(random walk) | "동전 던지기 같은 움직임" | 각 단계에서 무작위 증분으로 위치가 변하는 과정입니다. |
| 마르코프 성질(Markov property) | "무기억성(memoryless)" | 미래는 현재 상태에만 의존하고 과거 이력에는 의존하지 않습니다. |
| 전이 행렬(transition matrix) | "확률 표" | P[i][j]는 상태 i에서 상태 j로 이동할 확률입니다. |
| 정상분포(stationary distribution) | "장기적인 평균" | pi*P = pi를 만족하는 분포입니다. 체인의 평형 상태입니다. |
| 브라운 운동(Brownian motion) | "무작위 떨림" | 랜덤 워크의 연속 시간 극한입니다. B(t) ~ N(0, t)입니다. |
| 랑주뱅 동역학(Langevin dynamics) | "잡음이 섞인 경사 하강" | 결정론적 기울기와 무작위 섭동(perturbation)을 결합한 갱신 규칙입니다. |
| MCMC | "목표를 향해 걸어가기" | 원하는 분포를 정상분포로 갖는 마르코프 체인을 구성하는 방법입니다. |
| 메트로폴리스-헤이스팅스(Metropolis-Hastings) | "제안하고 수락 또는 거절하기" | 수락 비율로 수렴을 보장하는 MCMC 알고리즘입니다. |
| 온도(temperature) | "무작위성 조절 손잡이" | 탐색(exploration)과 활용(exploitation)의 균형을 조절하는 매개변수입니다. |
| 확산 과정(diffusion process) | "잡음 넣고 잡음 빼기" | 순방향에서는 잡음을 점진적으로 더하고, 역방향에서는 점진적으로 제거해 데이터를 생성합니다. |
더 읽을거리
- Ho, Jain, Abbeel (2020), Denoising Diffusion Probabilistic Models: 확산 모델 혁명을 연 DDPM 논문입니다. 순방향과 역방향 마르코프 체인을 명확하게 유도합니다.
- Song & Ermon (2019), Generative Modeling by Estimating Gradients of the Data Distribution: 랑주뱅 동역학으로 표본을 추출하는 점수 기반 접근입니다.
- Roberts & Rosenthal (2004), General state space Markov chains and MCMC algorithms: MCMC가 언제, 왜 작동하는지 다룹니다.
- Norris, Markov Chains: 수렴, 정상분포, 도달 시간(hitting time)을 다루는 표준 교과서입니다.
- Welling & Teh (2011), Bayesian Learning via Stochastic Gradient Langevin Dynamics: SGD와 랑주뱅 동역학을 결합해 확장 가능한(scalable) 베이지안 추론을 수행합니다.