我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes
本节对应笔记:
- https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-md/23_Unsupervised%20Learning%20Generation.md 不全,只有本节内容的 1-4 内容。
本节内容综述
- 关于 Generation 的内容,OpenAI有一篇很好的科普文:openai.com/blog/generative-models/。“不能产生,就是没有完全理解。”
- 可分为 PixelRNN 、Variational Auto Encoder(VAE)、Generative Adversarial Network。
- 首先来看 PixelRNN 。
- 接下来是Variational Auto Encoder。
- 下一节课中,详细讨论了 Why VAE ?优化目标如何来的?从意义上和数学上分别理解。最后,介绍了VAE的局限性。
- 由此,我们引出 GAN 。Yann LeCun在17年时评价很高。这里讲讲其思想。但是,其也有局限性,如难以训练。
文章目录
小细节
Pixel RNN
如上图,在不同时刻输入像素序列,得到一张图片。其效果不错。
如上,在语音上也可应用。对于视频同理。
Practicing Generation Models
做个实验,生成宝可梦图片。
要注意:
- 用三个数表示一个像素,但是这样生成的图片有点灰(因为用的sigmoid function,最终生成的RGB都在0.5左右)。
- 于是李老师为像素做了个 one-hot 与近似,如下图。
如下,每一行代表一张图。只有700+的数据,效果就可以不错。李老师做了一层LSTM。
如下,在测试集上,效果还可以。
此外,让机器随便画,生成效果如下。
Variational Auto Encoder
在VAE中,code不再直接等于Encoder的输出。假设目标降维空间为3维,那我们让Encoder分别输出和。并且,从正态分布中随机取出三个点,将下式作为最终的编码结果:
此外,神奇之处在于,我们不仅要最小化 input 与 output 间的差距,还要最小化下式:
发现,其实用 VAE 的图,不太清楚,但是可以对生成进行“控制”。
此外,可以使用 VAE 来写诗。
Why VAE?
如上,VAE在训练中,相当于对原数据加了噪声,因此其编码有更好的泛化效果。
上式中,为原编码,而为噪声。为噪声的方差,是通过学习自动改变的。
如上,我们之所以设置优化目标,是希望接近于0,且对做一个正则。
另一种说法(数学上)
如上,把每张图片想象成高维空间中的点。VAE做的就是,估计正确的图片其概率分布。
Gaussian Mixture Model
我们可以使用混合高斯模型。
如上,正常情况下,我们把看作从某个分布中来的数据;但是我们使用分布来表述要好于聚类的表述。具体来讲,就是用一个向量,来表示其属于各个分布的权重。
VAE就是高斯混合模型的 distributed representation 版本。
如上,当我们在 上采样到一个点后,这个点会对应到一个高斯分布(这样就有了无穷多的高斯分布)。至于其对应哪个高斯分布,由函数决定,高斯分布符合。
而这个函数可以是神经网络。
因此,对于数据的概率描述就是:
如上,除了极大似然,我们还需要引入另一个分布来表示Encoder。
我们可以进行如下数学变换(无论是什么分布,下列推导都成立1):
其中,就是。
因此,上式:
这是上式的下限 Lower Bound,。
因此,我们的最大化目标即为:
可以转换为:找和到让最大。
原因如下图。
如上,我们知道,的大小,只与有关,但是如果把增大,那么将变小(因为大了)。
在此基础上(),我们把上升,就可以让目标值越来越大。
而且,最终将有副产物:与是相近的。
因此如上,我们最小。其是一个神经网络,对应VAE的特殊的优化目标(推导见原论文);最大另外一项,也就是 Auto Encoder 做的事。
Problems of VAE
VAE从来没有真的去学,如何产生一张图片。如上,右边的图片明显不对,但是对于 VAE 来说,只是多了一个像素而已。VAE 只是进行模仿而已。
GAN
拟态的演化
如上,李老师将其类比为物种间的拟态的演化。
要注意的是,Generator从未看过真正的图片。
GAN - Discriminator
如上,将真的、假的图片输入判别器,让其拥有判别真假的能力。
GAN - Generator
如上,Generator则争取骗过Discriminator。如何训练呢?我们将二者视作一个大的网络。训练Generator时,我们fix住Discriminator的参数,然后仅梯度下降Generator的参数。
Toy Example
如上,我们希望生成器的数据(绿色的曲线)可以越接近真实值(黑色的点)越好。
而蓝色的线,则表示判别器认为哪里是对的。
绿色的线有没有可能移到很左部,既然判别器认为左边是对的?有可能,因此要小心地调参数。我们不知道Discriminator是不是对的。
In practical…
- GANs are difficult to optimize.
- No explicit signal about how good the generator is:
-
- In standard NNs, we monitor loss
-
- In GANs, we have to keep “well-matched in a contest”
- When discriminator fails, it does not guarantee that generator generates realistic images
-
- Just because discriminator is stupid
-
- Sometimes generator find a specific example that can fail the discriminator
-
- Making discriminator more robust may be helpful.