직선 조건부 경로는 잡음 x0와 데이터 x1을 잇는다.
xt=(1−t)x0+tx1,u=x1−x0.
두 함수를 완성한다.
cfm_pair(x0, x1, t): 잡음 x0(shape (N, d)), 데이터 x1(shape (N, d)), 시간 t(shape (N,))를 받아 (xt, u)를 반환한다. 둘 다 shape (N, d)다. 표본마다 자기 시간 t[i]를 쓴다(broadcasting에 주의한다).
velocity_from_eps(xt, eps_hat, t): 같은 직선 경로에서 확산 모델처럼 잡음을 예측한 값 ε^=E[x0∣xt]가 주어질 때, 속도 v=E[x1−x0∣xt]를 반환한다. xt, eps_hat의 shape은 (N, d), t는 (N,)이고 0<t≤1이다.
힌트: xt=(1−t)ε^+tx^1이 기댓값에서도 성립하므로 먼저 x^1을 구하고, v=x^1−ε^를 정리한다.
테스트는 다음을 확인한다.
- 반환 shape, 그리고 t=0이면 xt=x0, t=1이면 xt=x1.
- 같은 짝에서 시간만 바꾸면 목표 u는 바뀌지 않는다(직선 위를 일정한 속도로 움직인다).
- 데이터가 한 점 c뿐이면 참 ε-예측은 (xt−tc)/(1−t)이고, 이것을 넣었을 때 속도는 (c−xt)/(1−t), 즉 남은 시간 안에 c에 도착하는 속도여야 한다.
- 짝 하나의 진짜 잡음 x0를
eps_hat으로 넣으면 그 짝의 목표 u가 나온다.