【机器学习】李宏毅——Flow-based Generative Models
前文我介绍了部分关于生成学习的内容,可以参考我这篇博文点此
前面介绍的各个生成模型,都存在一定的问题:
- 对于PixelRNN这类模型来说,就是从左上角的像素开始一个个地进行生成,那么这个生成顺序是否合理,每一个像素是否只与它前面的像素有关,这就是其问题
- VAE的问题在前文就已经提到,它只能够学会模仿训练集中的例子,无法真正做到“创造”
- 对于GAN来说可能是生成方面最好的模型,但是实在是太难训练了
因此我们接下来要介绍的流形生成模型,就是用多个比较简单的生成器进行串联,来达到用简单的分布转换成复杂的分布的效果。
Generator
一般来说,生成器是一个神经网络,其定义了一个概率分布。例如我们有一个生成器G如下图,那么我们输入一个z,就可以得到输出x;而z我们可以看成是从简单的正态分布中采样得来的,而最终得到的x的分布则可以认为跟生成器G相关,因此定义该分布为
那么我们调整生成器的目的就是希望
其中,
Math Background
Jacobian Matrix
雅可比矩阵可以通过下图来简单理解:
那么存在一个重要的性质是:
即它们互为逆矩阵,且行列式也存在互为倒数的关系。而行列式还有另外一个含义,就是将矩阵的每一行都当成一个向量,并在对应维度的空间中展开,那么形成的那个空间的“体积“就是行列式的绝对值,如下图的二维的面积和三维的体积:
Change of Variable Theorem
根据前面的描述,我们已知了z的分布,假设当前也知道了x的分布,那么我们想要的是求出来生成器G,或者说求出来怎么从z的分布转换到x的分布,如下图:
我们先从最简单的情形来介绍我们具体解决问题的方式。
假设当前z满足的分布为一个0到1之间的均匀分布,而z和x之间的关系已知,为
那么假设z和x的分布都为更加复杂的情况,那我们可以在某点
需要注意的是转换成微分之后需要加上绝对值,因为微分可正可负。
那么接下来拓展到二维空间,假设当前的
那么它们之间存在的关系从面积相等拓展到了体积相等,即:
也就是两个图形的面积和在对应点的取值的乘积相等。那么对上式进行推导:
可以发现两者分布之间相差为雅克比矩阵的行列式的绝对值。
Flow-based Model
经过上面的各种推导,我们可以将目标函数进行转换:
而我们如果要最大化最下面的式子,我们首先需要知道怎么算雅克比矩阵的行列式,这在当矩阵的大小很大的时候是非常耗时的;其次是要知道怎么算生成器G的逆
因此要最大化的目标函数也变成了:
可以发现上述要最大化的目标函数中只有
因为我们在训练的时候就会从分布中采样得到x,然后代入得到z,并且根据最大化上式来调整
Coupling Layer
为了能够方便计算雅克比矩阵,因此我们采用Coupling Layer这种思想,即我们假设z和x之间满足这种关系:
其中F和H是两个函数,进行向量的变换而已,它有多复杂都是可以的。而上图是正向的过程,因为我们训练的时候是训练
因此满足了上述关系之后,雅克比矩阵的计算就变得很方便了:
首先解释一下为什么左下角那个复杂的块矩阵我们不用注意:因为右上角是零矩阵,因此在计算行列式的时候只会关注右下角矩阵的值而不会管左下角矩阵的值是多少。
因此对于这种关系的变换我们就可以很方便的求出雅克比矩阵行列式的值。
再接下来我们就可以将多个Coupling Layer串在一起,但如果正向直接串的话就会发现前d维度的值是直接拷贝的,从头到尾都相同,这并不是我们想要的结果,我们不是希望前d维度的值一直保持不变:
那么可能的解决办法是反向串:
本文作者:FavoriteStar
本文链接:https://www.cnblogs.com/FavoriteStar/p/16998322.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步