Density estimation using Real NVP

发布时间 2023-05-25 10:39:57作者: 馒头and花卷

Dinh L, Sohl-Dickstein J. and Bengio S. Density estimation using real nvp. ICLR, 2017.

一种可逆的 flow, 感觉很 diffusion 已经非常非常像了. 果然, 伟大的成果从来不是一蹴而就的.

Motivation

  • \(x\) 是原始数据, \(z\) 是隐变量, 作者希望找到一个可逆变换 \(f\) 满足:

    1. \(z = f(x)\) 服从一个简单的分布, 比如正态分布;
    2. 逆变换 \(f^{-1}\) 是容易操作的.
  • 如此一来, 我们就可以直接从一个简单的分布 \(p_Z\) 中采样 \(z\), 然后通过

    \[x = f^{-1}(z) \]

    就完成了 generation 的过程.

Real NVP

  • 至于怎么找到这个变换 \(f(\cdot)\) 就是借用 flow 的思想了.

  • 我们知道, 对于 \(z = f(x)\)

    \[p_Z(z) = p_X(f^{-1}(z)) |\text{det}(\nabla_x f)|^{-1} \Rightarrow p_X(x) = p_Z(f(x)) |\text{det}(\nabla_x f(x))|. \]

  • 我们假设 \(p_Z(z)\) 服从一个简单的分布 (比如高斯分布), 如此一来只需要极大化对数似然即可:

    \[\max_f \quad \log (p_X(x)) = \log (p_Z(f(x))) + \log (|\text{det}(\nabla_x f(x))|). \]

  • 整体的可行性要求:

    1. \(f(\cdot)\) 具有较强的表达能力, 使得它能够将 \(x\) 映射到一般的简单分布中去;
    2. \(\text{det}(\nabla_x f(x))\) 是容易求解的.

Coupling layers

  • 作者介绍了一种 coupling layers, 符合我们所需的条件.

  • 每一层, 我们将输入 \(x\) 切分为 \([x_1, x_2]\), 然后根据如下变换得到输出:

    \[y_1 = x_1 \\ y_2 = x_2 \odot \exp(s(x_1)) + t(x_1), \]

    其中 \(s, t\) 是可训练的 scale, translation function.

  • 容易证明:

    \[\nabla_x y = \left [ \begin{array}{ll} \mathbb{I}_d & 0 \\ \nabla_{x_1} y_2 & \text{diag}(\exp(s(x_{1:d}))) \end{array} \right ], \]

    为一下三角矩阵, 所以它的行列式就是对角元素的乘积.

  • 如果给定 \(y\), 反向求解 \(x\) 也是容易的:

    \[x_1 = y_1, \\ x_2 = (y_2 - t(y_1)) \odot \exp(-s(y_1)). \]

  • 假设我们用了两层:

    \[z = f(y) = f \circ g (x), \]

    \[\nabla_x z = \nabla_y f \nabla_x g, \]

    \[\text{det}(\nabla_x z) = \text{det}(\nabla_y f) \text{det}(\nabla_x g), \]

    只需一层层算就可以了.

  • 显然, 该思想可以很容易扩展到多层. 另外, 需要注意的是, 每一层, 输入的切分应当是各异的以避免一部分特征始终不变.