RealNVP与Glow:流模型的传承与升华

640


作者丨苏剑林

单位丨广州火焰信息科技有限公司

研究方向丨NLP,神经网络

个人主页丨kexue.fm


话在开头


在上一篇文章细水长flow之NICE:流模型的基本概念与实现中,我们介绍了 flow 模型中的一个开山之作:NICE 模型。从 NICE 模型中,我们能知道 flow 模型的基本概念和基本思想,最后笔者还给出了 Keras 中的 NICE 实现。


本文我们来关心 NICE 的升级版:RealNVP 和 Glow。


Glow 模型的采样演示:




精巧的flow


不得不说,flow 模型是一个在设计上非常精巧的模型。总的来看,flow 就是想办法得到一个 encoder 将输入 x 编码为隐变量 z,并且使得 z 服从标准正态分布。得益于 flow 模型的精巧设计,这个 encoder 是可逆的,从而我们可以立马从 encoder 写出相应的 decoder(生成器)出来,因此,只要 encoder 训练完成,我们就能同时得到 decoder,完成生成模型的构建。 


为了完成这个构思,不仅仅要使得模型可逆,还要使得对应的雅可比行列式容易计算,为此,NICE 提出了加性耦合层,通过多个加性耦合层的堆叠,使得模型既具有强大的拟合能力,又具有单位雅可比行列式。就这样,一种不同于 VAE 和 GAN 的生成模型——flow 模型就这样出来了,它通过巧妙的构造,让我们能直接去拟合概率分布本身。


待探索的空间


NICE 提供了 flow 模型这样一种新的思路,并完成了简单的实验,但它同时也留下了更多的未知的空间。flow 模型构思巧妙,相比之下,NICE 的实验则显得过于粗糙:只是简单地堆叠了全连接层,并没有给出诸如卷积层的用法,论文虽然做了多个实验,但事实上真正成功的实验只有 MNIST,说服力不够。 


因此,flow 模型还需要进一步挖掘,才能在生成模型领域更加出众。些拓展,由它的“继承者”RealNVP 和 Glow 模型完成了,可以说,它们的工作使得 flow 模型大放异彩,成为生成模型领域的佼佼者。


RealNVP


这部分我们来介绍 RealNVP 模型,它是 NICE 的改进,来自论文 Density estimation using Real NVP [1]它一般化了耦合层,并成功地在耦合模型中引入了卷积层,使得可以更好地处理图像问题。更进一步地,它还提出了多尺度层的设计,这能够降低计算量,通过还提供了强大的正则效果,使得生成质量得到提升。至此,flow 模型的一般框架开始形成。 


后面的 Glow 模型基本上沿用了 RealNVP 的框架,只是对部分内容进行了修改(比如引入了可逆 1x1 卷积来代替排序层)。不过值得一提的是,Glow 简化了 RealNVP 的结构,表明 RealNVP 中某些比较复杂的设计是没有必要的。因此本文在介绍 RealNVP 和 Glow 时,并没有严格区分它们,而只是突出它们的主要贡献。  


仿射耦合层


其实 NICE 和 RealNVP 的第一作者都是 Laurent Dinh,他是 Bengio 的博士生,他对 flow 模型的追求和完善十分让我钦佩。在第一篇 NICE 中,他提出了加性耦合层,事实上也提到了乘性耦合层,只不过没有用上;而在 RealNVP 中,加性和乘性耦合层结合在一起,成为一个一般的“仿射耦合层”。


640


这里的 s,t 都是 x1 的向量函数,形式上第二个式子对应于 x2 的一个仿射变换,因此称为“仿射耦合层”。


仿射耦合的雅可比矩阵依然是一个三角阵,但对角线不全为 1,用分块矩阵表示为:


640


很明显,它的行列式就是 s 各个元素之积。为了保证可逆性,一般我们约束 s 各个元素均大于零,所以一般情况下,我们都是直接用神经网络建模输出 log s,然后取指数形式640。 


注:从仿射层大概就可以知道 RealNVP 的名称来源了,它的全称为“real-valued non-volume preserving”,强行翻译为“实值非体积保持”。相对于加性耦合层的行列式为 1,RealNVP 的雅可比行列式不再恒等于 1,而我们知道行列式的几何意义就是体积(请参考《新理解矩阵5:体积=行列式》[2]),所以行列式等于 1 就意味着体积没有变化,而仿射耦合层的行列式不等于 1 就意味着体积有所变化,所谓“非体积保持”。 


随机打乱维度


在 NICE 中,作者通过交错的方式来混合信息流(这也理论等价于直接反转原来的向量),如下图(对应地,这里已经换为本文的仿射耦合层图示):


640

 NICE通过交叉耦合,充分混合信息


而 RealNVP 发现,通过随机的方式将向量打乱,可以使信息混合得更加充分,最终的 loss 可以更低,如图:


640

 RealNVP通过随机打乱每一步输出的整个向量,使得信息混合得更充分均匀


这里的随机打乱,就是指将每一步 flow 输出的两个向量 h1,h2 拼接成一个向量 h,然后将这个向量重新随机排序。</

  • 14
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值