이 주변 속도장이 연속방정식을 만족하며 노이즈를 데이터로 옮긴다(립먼(Yaron Lipman) 외, 2022). 그리고 주변 속도장은 상수가 아니다. t = 0에서는 x0 = z라 z가 정해지면 x는 아무것이나 될 수 있으므로 v(y, 0) = E[x] − y 이고, 모두 데이터의 평균 쪽을 향한다. t가 1에 가까워지면 한 점을 지나는 (z, x) 짝은 거의 한 봉우리의 x 를 가진 것뿐이라, 각자 가까운 봉우리를 향한다. 속도장은 위치와 시간에 따라 모양을 바꾼다.
데이터가 −1 과 +1 두 점(반반)일 때. 위: 노이즈 점 z 와 데이터 점 x 를 제비뽑기로 짝지은 조건부 직선 열두 개. 길이 서로 엇갈린다. 아래: 같은 출발점에서 주변 속도장을 따라 흐른 실제 궤적. 처음에는 모두 가운데(데이터 평균 0) 쪽으로 모이다가 뒤에 가까운 봉우리로 갈라지고, 서로 엇갈리지 않는 대신 휜다
조건부 목표로 주변 속도를 배운다
주변 속도장을 직접 계산하려면 데이터 분포 전체가 필요하므로, 대신 짝마다 아는 조건부 목표 x − z에 맞추도록 훈련한다.
같은 입력에 여러 정답이 오면 제곱 오차를 최소로 하는 한 값은 평균, 곧 조건부 기댓값이다. xt의 함수들이 이루는 공간 위로의 직교사영이다. 분포를 모델 위로 옮기는 사영과 모양이 같고, 거리를 재는 기준은 KL 발산(두 분포가 같은 사건에 매기는 확률이 얼마나 다른지 재는 양)이 아니라 제곱 거리(L²)다. 조건부 타깃으로 훈련하면 주변 타깃을 배운다는 점에서 디퓨전의 디노이징 스코어 매칭과 완전히 같은 구조다.
짝 하나 (z, x)를 조건으로 붙여 정한 목표로 주변 속도장을 배우는 이 방법을 조건부 플로우 매칭(conditional flow matching, CFM)이라 부른다. 「조건부」는 (z, x) 짝을 정해 놓고 본다는 뜻이고, 이 장의 나머지에서도 이 이름을 쓴다.
직접 움직여 보기
불러오는 중…
파이썬
import numpy as np
rng = np.random.default_rng(0)
n = 1_000_000
# 조건부 타깃 x − z 의 평균 = 주변 속도장. 데이터 ±1, z ~ N(0,1)
x = rng.choice([-1.0, 1.0], 4 * n); z = rng.normal(size=4 * n); y = 0.5
for t in [0.2, 0.5, 0.8]:
xt = (1 - t) * z + t * x
near = np.abs(xt - y) < 0.01
v = (np.tanh(t * y / (1 - t)**2) - y) / (1 - t) # 닫힌꼴
s = (t * np.tanh(t * y / (1 - t)**2) - y) / (1 - t)**2 # ∇log p_t
print(f"t={t}: 표본평균 E[x−z|x_t=0.5] {(x - z)[near].mean():.3f} "
f"닫힌꼴 v {v:.3f} y/t + (1−t)/t·∇log p_t {y / t + (1 - t) / t * s:.3f}")
# t=0.2: 표본평균 E[x−z|x_t=0.5] -0.435 닫힌꼴 v -0.431 y/t + (1−t)/t·∇log p_t -0.431
# t=0.5: 표본평균 E[x−z|x_t=0.5] 0.527 닫힌꼴 v 0.523 y/t + (1−t)/t·∇log p_t 0.523
# t=0.8: 표본평균 E[x−z|x_t=0.5] 2.499 닫힌꼴 v 2.500 y/t + (1−t)/t·∇log p_t 2.500
같은 점 0.5에서 속도가 t = 0.2에는 −0.43(가운데 쪽), t = 0.8에는 +2.5(봉우리 +1 쪽)다. 조건부 목표 x − z는 짝마다 일정하지만, 주변 속도장은 시간에 따라 부호까지 바뀐다.
마지막 칸 y/t + (1−t)/t·∇log pt 는 스코어로 속도를 만드는 식이다. 스코어로 만든 속도가 샘플로 잰 평균과 왜 맞아떨어지는지는 이 장의 「속도와 스코어의 다리」 절에서, 안개 낀 점에서 스코어 방향으로 걸으면 원래 점의 평균에 닿는다는 트위디 공식으로 유도한다.
이 절의 결론
“직선인 것은 노이즈 z와 데이터 x를 짝지은 쌍 하나의 길이다. 신경망이 배우는 주변 속도장은 그 점을 지나는 모든 (z, x) 짝의 직선 속도를 평균한 것이라, 위치와 시간에 따라 변한다.”
문제 3. 교차로에 화살표 하나
한 교차로를 지나는 차 가운데 70%는 동쪽(+1)으로, 30%는 서쪽(−1)으로 간다. 교차로 바닥에 화살표 하나만 그릴 수 있다. 화살표의 값 a(동쪽이 +, 서쪽이 −)는 차들의 실제 방향과의 제곱 오차 평균이 가장 작게 고른다. a는 얼마인가? 차가 많이 가는 동쪽을 가리키는 a = +1과 비교하라.
교차로를 지나는 차 열 대(동쪽 7대, 서쪽 3대)와 값을 정해야 할 가운데 화살표 a
함께 풀기
김민준
당연히 +1이요. 열에 일곱이 동쪽으로 가니까 동쪽을 가리켜야죠.
선생님
a = +1일 때 제곱 오차의 평균을 계산해 봐요.
김민준
동쪽 차는 0, 서쪽 차는 (−1 − 1)² = 4라서 0.3 × 4 = 1.2요.
선생님
a = 0이면요?
김민준
0.7 × 1 + 0.3 × 1 = 1.0이에요. 아무 쪽도 안 가리키는 화살표가 더 낫다고요?
이서연
0.7(1 − a)² + 0.3(1 + a)²를 a로 미분해서 0으로 두면 a = 0.7 − 0.3 = 0.4야. 오차는 0.84로 셋 중 가장 작아. 제곱 오차를 가장 작게 하는 값 하나는 평균이야.
김민준
화살표 0.4를 그대로 따라가는 차는 한 대도 없는데, 값 하나로 말해야 하면 그게 최선이네요. 조교가 반 전체 과제 점수를 숫자 하나로 보고하라고 하면 평균을 내는 거랑 같아요.
문제 4. 두 점으로 가는 속도장
데이터가 두 점 ±1(반반), 노이즈가 z ~ N(0, 1)이다. 선형 경로 xt = (1 − t)z + tx에서 (가) xt = y를 본 뒤 x = +1일 사후확률을 구하고, 주변 속도장 v(y, t)의 닫힌꼴을 구하라. (나) v(0.2, 0.6)을 계산하라.
t = 0의 노이즈 N(0, 1), t = 1의 데이터 두 점 ±1, 속도를 물을 점 (y, t) = (0.2, 0.6)
함께 풀기
김민준
이건 쉬워요. 직선 경로의 속도는 x − z로 상수라고 했으니까, 그걸 그대로 쓰면…
선생님
y = 0.2, t = 0.6에 있는 새의 x − z가 얼마예요?
김민준
x = +1이면 z = (0.2 − 0.6)/0.4 = −1이라 x − z = 2이고, x = −1이면 z = (0.2 + 0.6)/0.4 = 2라 x − z = −3이에요. …같은 점에 두 가지 속도가 있네요.
김민준
그럼 상수라는 게 뭐였어요? 짝 하나의 속도가 상수라는 거였구나. 신경망은 이 점에서 하나만 말해야 하니까, 교차로 화살표처럼 2와 −3의 가중평균이에요.
이서연
섞는 비율은 내가 구할게. x = +1일 때 xt = (1 − t)z + t라서 y가 나올 우도(그 x가 이 y를 낼 확률밀도)는 exp(−(y − t)²/2)예요.