Glow: Generative Flow with Invertible 1×1 Convolutions

/ by GuoWY / 论文来源: https://arxiv.org/pdf/1807.03039.pdf

总 结

  • GLOW,让可逆生成模型焕发生机

      GLOW是基于NICE和RealNVP的成果,先推荐一些相关论文和写的不错的解读:

      【好文推荐】换脸效果媲美GAN!一文解析OpenAI流生成模型Glow [1]

      【论文原文】NICE [2]

      【好文推荐】细水长flow之NICE:流模型的基本概念与实现 [3]

      【论文原文】RealNVP [4]

      【好文推荐】RealNVP与Glow:流模型的传承与升华 [5]

      很多实现细节在上述资料中都有了比较详尽的说明,我们看一下Glow的整体框架:

      

      上图来自于论文原文,首先依据这张图粗略地做一个框架介绍。图(b)是整体架构的示意图,输入的数据会经过L个模块,前L-1个模块都包括了squeeze,单步流和split层,最后一个模块不再需要split。squeeze层的功能是扩增通道,因为卷积只能在通道上实行(参见[4][5]),所以有必要让通道数量增加。单步流的功能是对数据做可逆变换,具体的实现后文会说明。split层的功能是分割图像,一半保留,一半继续循环,它来源于RealNVP的多尺度架构。下面重点介绍单步流(flow)的实现。

      图(a)是单步流的示意图,包括三个部分。第一个,actnorm,它实质上是NICE中的尺度变化层的一般化,直观上理解等价于CNN中的BatchNorm。第二个,1×1的可逆卷积,这其实是对于反转通道的优化,反转是为了让信息混合更加充分。在NICE中实行的是交替反转,在RealNVP中是随机反转,那在GLOW中用一个可学习的置换矩阵去替代这一部分,发挥了神经网络的优势。值得一提的是,如果仅仅是用置换矩阵替代,计算量是非常大且复杂的,GLOW中采用了LU分解的方式,这样在计算行列式的时候只需要计算分解式U的对角线之 和(详见[5])。最后一个部分是仿射耦合层,是让数据产生丰富的可逆变化的部分。仿射的意思是把乘性耦合块和加性耦合块堆叠在一起,能产生复杂的变换效果。耦合的意思,我觉得可以粗浅的理解为,用数学方法对数据变换就叫做耦合(后来出现的非数学方法就叫做神经网络)。 值得注意的是,单步流要尽可能做到可逆且易于计算,然而actnorm和仿射耦合层的行列式计算结果都不为1,这会提升模型的计算难度,GLOW采用的解决方案是把这两个行列式结果加入到loss当中去,这样能够抑制其计算难度。

      上述内容较为粗略地回顾了一下GLOW的框架设计。其实GLOW涉及到的碎片化的知识挺多的,不过原论文和解读中已经写得较为详尽和清楚,我没必要再详细地复述这些细节。下面表达一下我对于生成流这种模型的看法和感受。

      虽然说生成流是一种全新的模型,但是它本质上还是属于神经网络模型,因为它也是搭建了一个输入到输出的通路,并且通过学习不断改进通路当中的参数。但是,与普通的神经网络不同的是,这条通路是一个双工通路,就是数据不仅可以从左向右传递也可以从右向左传递。可逆性对于神经网络而言确是一个难能可贵的价值。不妨思考一下为何GLOW能火:最初的NICE实现的是从A分布到高斯分布的可逆求解,局限性很大;RealNVP实现了从A分布到条件非高斯分布的可逆求解,局限性降低了;而对于GLOW,受益于1×1卷积网络的加入模型拟合能力大幅提高,实现了从A分布到B分布的可逆求解,其中B分布是具有与A分布同样抽象级别的分布。这意味着,给定一批数据A和另一批数据B,GLOW能找到从A变化到B的网络通路,并且这个网络也能让B变化到A。不过遗憾的是,可逆性是具有代价的。从现阶段来看,可逆性的训练成本非常昂贵,计算量大,迭代速度慢都制约着GLOW的应用。总而言之,GLOW的出现让可逆生成模型焕发了生机,它也是一个非常具有前景的模型,期待以后它能变得更加成熟易用,发挥出它独到的优势与特点。

      

评 论