가장 단순한 normalizing flow는 표준정규분포 z∼N(0,Id)에 가역 아핀 변환을 적용한 것이다.
y=Az+b,detA=0.
밀도 변환 공식에 따라
logpY(y)=logpZ(A−1(y−b))−log∣detA∣,logpZ(z)=−21∥z∥2−2dlog(2π)
이다. 함수 affine_flow_logpdf(Y, A, b)를 완성한다.
| 인자 |
shape |
Y |
(N, d), 행마다 한 점 |
A |
(d, d), 가역 |
b |
(d,) |
반환값은 shape (N,)인 로그밀도 배열이다.
테스트는 다음을 확인한다.
- 결과가 평균 b, 공분산 AA⊤인 다변량 정규분포의 로그밀도와 같은가.
- detA<0(반사가 섞인 변환)에서도 맞는가. 절댓값을 빠뜨리면
log에 음수가 들어간다.
- 2차원에서 밀도를 넓은 격자 위에서 적분하면 1이 되는가.
힌트: A−1(y−b)는 역행렬을 만들지 말고 np.linalg.solve(A, (Y - b).T).T로 계산한다. log∣detA∣는 np.linalg.slogdet(A)의 둘째 값이다.