[CS231n]8·Generative Models
CS231n Convolutional Neural Networks for Visual Recognition
https://www.bilibili.com/video/BV1nJ411z7fe
Generative Models
Generative models 隶属于 unsupervised learning 的范畴,其数据集没有标签。其目的是根据输入学会一种数据集的分布,并生成具有这种分布的新的图像。
Pixel RNN & Pixel CNN
Pixel RNN 和 Pixel CNN 都属于 Fully visible belief network,其思想是对于图像
这跟网络有什么关系呢?上式的计算未免过于复杂,而我们知道神经网络善于对一个复杂的计算过程建模,因此我们可以设计一些网络达到目的。
Pixel RNN
我们从左上角开始,按照下图所示顺序生成新的像素:
自然而然地,这个时序过程可以用 RNN/LSTM 来完成。
其缺点是每个像素是顺次生成的,这导致网络的生成速度较慢,其训练速度也慢。
Pixel CNN
把 RNN 换成 CNN,根据周围像素生成新的像素。
训练比 Pixel RNN 快,但生成依旧是顺次生成,速度依旧较慢。
Variational Autoencoders (VAE)
Autoencoders
在学习 VAE 之前,我们首先需要了解 Autoencoders.
Autoencoders 是一种 unsupervised 的 dimensionality reduction 的方法。其思想是,用一个 CNN 将输入数据
Autoencoders 可以用于 supervised model 的初始化,帮助模型的学习。
VAE
我们假设真实数据
我们可以合理地选取高斯分布为
根据极大似然法的思想,最大化这个似然函数就是训练神经网络的过程了。
这时问题出现了,因为积分的存在,我们无法处理
对于第二个问题,我们再定义一个神经网络
两个神经网络的输出都是均值和方差,如此,在 inference 阶段,我们可以选取以该均值和方差为统计量的正态分布作为采样的概率分布。
对第一个问题的解决方法是,我们训练一个
现在我们训练好了一个 VAE 网络,就可以用它来生成数据了。从
以下是生成 MNIST 数字的 VAE,选取
可以看到数字的渐变过程,还是蛮有趣的。
GANs
PixelCNNs 和 VAEs 都显式地对概率密度函数
我们没有直接的方法从训练集里找出一个概率分布并据此采样以生成新的图像,但我们能从一个简单分布采样,例如随机噪声;随后我们不断改变这个简单的分布,以最终逼近真正的分布。这个复杂的过程显然用神经网络建模是最好不过的了:
那么我们如何训练这个神经网络呢?方法是用两个神经网络进行博弈——Generator network 负责生成新的图像,Discriminator network 负责辨别输入图像是真的还是假的(输出真的概率)。训练时 Generator 的目标是尽可能地骗过 Discriminator,而 Discriminator 的目标就是不被 Generator 骗到。
如此,两个网络在对抗中共同成长,一路相爱相杀,最后都能取得较好的成效。
我们的目标函数定义为 Minimax objective function:
训练时这个目标函数可以拆成两部分,对 Discirminator,用梯度上升使得:
然而在实践中,优化这个目标函数并不能工作得很好。这是因为
总结一下,训练 GANs 的流程为: