2차원 affine coupling 층 하나로 만든 flow를 생각한다. 기저 분포는 z∼N(0,I2)이고, 정변환 x=f(z)는
x1=z1,x2=z2exp(s(z1))+t(z1)
이다. s와 t는 임의의 함수(실제로는 신경망)이고, 배열을 받아 같은 shape의 배열을 돌려준다.
함수 flow_log_prob(x, s_fn, t_fn)을 완성해 각 점의 logp(x)를 반환한다.
| 인자 |
shape·의미 |
x |
(N, 2) 평가할 점 |
s_fn, t_fn |
(N,) 배열을 받아 (N,) 배열을 돌려주는 함수 |
반환값은 (N,) 배열이다.
순서대로 하면 된다.
- 역변환: z1=x1, z2=(x2−t(x1))exp(−s(x1)). s와 t의 역함수는 필요 없다.
- log-det: 정변환의 Jacobian은 하삼각행렬 [1∗0es(z1)]이므로 log∣det∂x/∂z∣=s(z1)이다.
- 변수변환 공식(8.3장): logp(x)=logN(z;0,I)−log∣det∂x/∂z∣.
부호에 주의한다. 정변환이 공간을 늘리는 곳(s>0)에서는 밀도가 낮아져야 한다. 테스트는 s,t가 상수일 때의 닫힌 꼴 가우시안, 격자 적분한 전체 질량, 표본의 구간 비율로 확인한다.