Skip to main content

Normalizing Flow

Normalizing Flow は、simple な base distribution を、連続した invertible transformation によって複雑な data distribution へ変換する方法です。

Normalizing Flow

画像出典: Lilian Weng, “Flow-based Deep Generative Models”。Simple な distribution が、複数の invertible transformation を通じて複雑な distribution に変換されます。

基本 idea

Base variable z0z_0 が simple な distribution に従うとします。

z0p0(z0)z_0 \sim p_0(z_0)

複数の invertible transformation f1,f2,,fKf_1, f_2, \dots, f_K を順に適用します。

zK=fKfK1f1(z0)z_K = f_K \circ f_{K-1} \circ \cdots \circ f_1(z_0)

この連続した transformation が flow です。

Log likelihood

Change of variables theorem を繰り返し適用すると、log density は次のようになります。

logpK(zK)=logp0(z0)k=1Klogdetfkzk1\log p_K(z_K) = \log p_0(z_0) - \sum_{k=1}^{K} \log \left| \det \frac{\partial f_k}{\partial z_{k-1}} \right|

この式からわかるように、Normalizing Flow では次の二つが重要です。

  • Transformation が invertible であること。
  • Jacobian determinant が効率よく計算できること。

代表的な model

Normalizing Flow の代表的な model には、次のようなものがあります。

数式で見る複数 flow の合成

Normalizing Flow は、複数の可逆変換を合成して複雑な分布を作ります。

zK=fKfK1f1(z0)\mathbf{z}_K=f_K\circ f_{K-1}\circ\cdots\circ f_1(\mathbf{z}_0)

Log density は各変換の log determinant の和で計算できます。

logp(zK)=logp(z0)k=1Klogdetfkzk1\log p(\mathbf{z}_K)=\log p(\mathbf{z}_0)- \sum_{k=1}^{K}\log\left|\det\frac{\partial f_k}{\partial \mathbf{z}_{k-1}}\right|

この式の気持ちは、「一つ一つは計算しやすい可逆変換を何段も積み重ねることで、単純な Gaussian を複雑な data 分布へ曲げる」というものです。Flow は exact likelihood を計算できる一方で、可逆性と Jacobian 計算の制約が architecture に強くかかります。

関連ページ