OpenAI之Glow,基于流的可逆生成模型

OpenAI之Glow,基于流的可逆生成模型

看到最近比较火的一篇图像生成的文章,很有意思.效果也非常的好.值得深入学习一番,欢迎大家指正,一起学习.

论文链接:https://www.paperweekly.site/papers/2101

代码链接:github.com/openai/glow

先放上几张Demo.

微笑刘亦菲:将笑容的选项调至最大,尽情的微笑吧
小眼睛微笑版刘亦菲
老年白发版微笑刘亦菲

下面的是作者在博客里给出的demo,可以看出图像生成过度非常的自然.

https://www.zhihu.com/video/1002681358216462336

直观的了解大佬的工作之后,想要理解,还是要读论文.

Glow: Generative Flow with Invertible 1x1 Convolutions

基于流的可逆生成模型的优缺点就不再详述了.(网上很多)

1.背景

  文章的工作其实是对输入的复杂的高维数据进行一个非线性变换,同时这个变换是可逆的.通过这个变换将输入的高维数据映射到潜在空间,产生独立的潜在变量(反之亦然).

  a.假设定义x是一个高维的随机向量,并且x的真实分布p(x)未知

  b.模型: p_{\theta}(x), \theta 参数

  那么,需要最小化的对数似然函数为:

\frac{1}{N}\sum_{i=1}^{N}{-logp_{\theta}(x^{i})}  

  c.潜在空间变量z ,先验概率分布为 p_{\theta}(z)=N(z;0,I),文章中满足高斯正态分布.

  为了实现空间之间的映射,可以找一个可逆的映射函数,比如f,使得z=f_{\theta}(x) ,同时 x=g_{\theta}(z) , g_{\theta}^{-1}=f_{\theta}

  假设函数f由一系列的变换函数组合而成 f=f_{1}\circ f_{2}\circ \cdot\cdot\cdot \circ f_{K} ,可以想象出这是一个flow,它的构成可以写成 x\leftrightarrow h_{1} \leftrightarrow h_{2} \cdot\cdot\cdot z :  x 经过 f_{1} 变换成 h_{1} ,等等等一直到最后.当然不要忘记这是个可逆的过程. 

  但是寻找这样一个可逆的映射难度比较大,文章通过引入一个雅克比矩阵来辅助实现映射.由雅克比行列式的一个重要性质:一个可逆函数的雅克比矩阵的逆矩阵即为该函数反函数的雅克比矩阵.基于雅克比矩阵的知识的基础上,就可以实现映射:

p_{\theta}(x)=p_{\theta}(z)\left|\det\frac{\partial(z)}{\partial(x)} \right|

左右两端同时求对数

即:三角矩阵行列式的值等于对角线值的相乘,展开为log对数的时候就是sum.

2.网络框架

  可以看到整个模型右边,整个流需要分为K次单步流来完成.右边的框架中绿色的模块都跟左边的整个模块一样.下面介绍左边这个绿色模块.

  简单来说就是三个部分.第一个部分actnorm就是把激活神经元归一化(想象成数据与处理);第二个部分可逆1x1卷积;第三个部分Affine Transformation仿射变换.

Invertible 1x1 Convolution

可逆 1x1 卷积是在 NICE 和 RealNVP 上的改进,NICE 和 RealNVP 是反转通道的排序,而可逆 1×1 卷积替换该固定置换,其中权重矩阵被初始化为随机旋转矩阵。具有相等数量的输入和输出通道的 1×1 卷积是置换操作的概括。通过矩阵的简化计算,可以简化整体的计算量。

Affine Transformation

  仿射变换层可以借助于文中给的表格来理解.正如文章中所介绍的分为三个部分Zero initialization,Split and concatenation,Permutation

本文Glow与之前的RealNVP不同的地方时添加可逆 1x1 卷积,以及删除其他组件,从而整体简化架构。

  RealNVP的基本步骤是:

   (1)通过在通道的排列改变为(固定)shuffling 排列。

   (2) 从特征维的中间向下将输入分成两部分:A 和 B。

   (3) 将 A 输入浅层卷积神经网络。根据神经网络的输出对 B 进行线性变换。

   (4) 连接 A 和 B。

  本文用卷积神经网络替换之前的置换操作.从表格可见,

  Glow的基本步骤是:

  (1)可逆 1x1 卷积

  (2)从输入tensor的通道维度上将其分成两半 x_{a},x_{b}

  (3)对 x_{b} 做非线性变换(输入卷积神经网络 NN() ),根据其输出对 x_{a} 做仿射耦合变换, \odot 为为哈达马积,也就是矩阵的乘法表示

  (4)将仿射耦合变换得到的tensor,与 x_{b} 在通道上concat在一起

  对于整个网络而言,同时还加入了多尺度的信息,意思就是每一次做流生成潜在变量时,由于要将两个潜在变量拼接后输出,为了保证多尺度就每次保留一个潜在变量,将另一个潜在变量返回到输入再次进行流操作, 经过 L−1 次流操作后将不再返回到输入而是直接输出和之前的 L−1 个潜在变量拼接形成最后的潜在变量的输出。

3.Simple python implementation of the invertible 1X1 convolution

结合图表里边的公式理解如下可逆 1x1 卷积代码

# Invertible 1x1 conv
def invertible_1x1_conv(name, z, logdet, reverse=False):
    if True:  # Set to "False" to use the LU-decomposed version
        with tf.variable_scope(name):
            shape = Z.int_shape(z)
            w_shape = [shape[3], shape[3]]
            # Sample a random orthogonal matrix:
            w_init = np.linalg.qr(np.random.randn(
                *w_shape))[0].astype('float32')
            w = tf.get_variable("W", dtype=tf.float32, initializer=w_init)
            #dlogdet = tf.linalg.LinearOperator(w).log_abs_determinant() * shape[1]*shape[2]
            dlogdet = tf.cast(tf.log(abs(tf.matrix_determinant(
                tf.cast(w, 'float64')))), 'float32') * shape[1]*shape[2]
            if not reverse:
                _w = tf.reshape(w, [1, 1] + w_shape)
                z = tf.nn.conv2d(z, _w, [1, 1, 1, 1],
                                 'SAME', data_format='NHWC')
                logdet += dlogdet
                return z, logdet
            else:
                _w = tf.matrix_inverse(w)
                _w = tf.reshape(_w, [1, 1]+w_shape)
                z = tf.nn.conv2d(z, _w, [1, 1, 1, 1],
                                 'SAME', data_format='NHWC')
                logdet -= dlogdet
                return z, logdet

代码通过布尔量reverse控制卷积的前向或者反向运算.

首先,从上一层输出get到各种shape.然后初始化权重矩阵(random orthogonal matrix),由表中公式可知,接下来计算的是权重W的对数行列式.

如果是前向,那么先reshape权重矩阵,然后做 1x1 卷积,再计算对数行列式.

如果是反向,那么先对权重矩阵求逆,reshape之后1x1 卷积,再计算对数行列式.

4.总结

  文章提出了一种新型流Glow,并在标准图像建模基准上的对数似然性方面展示了更先进的定量性能。此外,文章证明了在高分辨率人脸训练时,作者的模型能够合成逼真的图像。

****************** 完 ********************


参考

  1. Glow: Generative Flow with Invertible 1x1 Convolutions;Diederik P. Kingma*, Prafulla Dhariwal OpenAI, San Francisco
  2. CSDN博客:blog.csdn.net/qq_363567
  3. paperweekly:paperweekly.site/papers
  4. 机器之心:OpenAI提出可逆生成模型Glow
  5. 量子位:OpenAI开源最新生成模型,分分钟合成超逼真人像
发布于 2018-07-18

文章被以下专栏收录