Generative Models
- PixelRNN
- Variational Autoencoder(VAE) 变分自编码器
- Generative Adversarial Network(GAN) 生成对抗网络
1.PixelRNN
1.1 原理
假设目标为让计算机自己画出3*3的图片,做法:
- 随机给一个图(橘色)
- 训练一个模型RNN(输入可为可变长度),输入:橘色,输出:设定的图(蓝色)
- 输入:橘色+蓝色,再放入模型中,输出:浅蓝色
- 输入:橘色+蓝色+浅蓝色,再放入模型中,输出:灰色
- 不断重复,以画完一张3*3的图
- 最终目的:让机器知道,当输入某特定图时,会输出对应的图。
1.2 应用
1.2.1 wavenet语音合成
原理:
- 输入 x 1 x_1 x1→隐藏层若干→输出 y 1 y_1 y1
- 输入 x 1 y 1 x_1 y_1 x1y1→隐藏层若干→输出 y 2 y_2 y2
- 输入 x 1 y 1 y 2 x_1 y_1 y_2 x1y1y2→隐藏层若干→输出 y 3 y_3 y3
- 以此类推f
1.2.2 举例生成宝可梦
每张图由RGB三色合成,然而实际当RGB某一值明显高时 其生成的图片色彩才鲜明,若当其值都差不多时 其生成的图片都趋于灰色。所以,本例中改进做法,直接产生颜色(而不通过合成),做法如下:
- 若出现绿色,则对应的值为1
- 但颜色可能有2563种,故将颜色做聚类(clustering),得到167种颜色
- 1层 LSTM,512 cells
2.Variational Autoencoder(VAE) 变分自编码器
2.1 理解
- 之前讲过的auto-encoder,我们可以通过code→decoder→图片。那么当我们随机输入一个code时,实际上不一定能得到理想结果
- VAE改进做法如下:
2.2 为什么使用VAE?
2.2.1 直观解释
使用auto-encoder时,我们可以输入满月-code-输出满月;输入弦月-code-输出弦月。但是当输入的图片是中间状态时,因为encode是神经网络(非线性模型),故所得输出并不能确定。
使用VAE时,我们可以输入满月-code+noise(VAE自动加)-输出满月;输入弦月-code+noise-输出弦月。那么中间有个交界点,那么该点最后被解码为满月or弦月? 故VAE在计算时会最小化误差,所以产生的会是介于满月和弦月的图。
具体:
- 如图 m m m 代表auto-encoder做法中的code, c c c 代表加入了noise后的结果。 σ \sigma σ (值多大由机器学习得到)代表noise的方差,取exponential就是为了保证方差为正。
- 同时,为保证方差取值合理(不会过小),需要进行限制,即最小化下方约束。图中:绿色线-表示前两项相减后的结果,min结果会在
σ
i
\sigma_i
σi→0时取得,那么再取exponential就会→1,取值合理。
2.2.2 数学解释
假设模型
- 目的:生成宝可梦图片
- 将每张宝可梦图片想成是高维空间中的一个点
- 现在需要估计点的概率分布
- 那么之后在使用模型时,取概率较大的点,就会比较有可能是宝可梦的图片
估计点的概率分布做法——高斯混合模型Gaussian Mixture Model
解释: 如图黑色线表示一个复杂分布,实际上该分布是由很多其他高斯分布*权重叠合起来的。
高斯混合模型Gaussian Mixture Model做法:
- 【蓝色框】代表不同的高斯分布,每个高斯分布有自己的均值和方差,也有自己的权重。根据权重决定从哪个高斯分布采样数据。
- 多项式m~P(m),m代表为第m个高斯分布,表示选择了第m个高斯分布
- 第m个高斯分布有自己的均值、方差
- P(m)权重,P(x|m)表示当选择第m个高斯分布时采样到x(即VAE中的input)的概率,得到:
VAE做法:
- 从正态分布中采样向量 z ~ N(0,1),z的各个维度代表各个属性。
- z是高维的(其均值和方差无数多,注意别被图示中的z迷惑),在z上可采样无数点x,每个点x对应不同的高斯分布。
- 设置一个NN(神经网络)通过使
L
L
L最大化,以得到合适的参数。不同的高斯分布通过该NN得到其自身的均值和方差。
- 引入q(z|x),即当已知采样数据x,通过另一个NN,可以得到其来源分布的均值和方差
3.Generative Adversarial Network(GAN) 生成对抗网络
3.1 举例
- 神兽1吃蝴蝶,但神兽1认为蝴蝶没棕色的
- 故,蝴蝶演化为棕色。但同时神兽1演化为神兽2,其认为蝴蝶没有叶脉
- 故,蝴蝶再次演化为枯叶蝶。但同时神兽2继续演化…
3.2 演化过程
3.2.1 总体过程
- 现有第一代Generator(生成器),很废
- 第一代Discriminator(鉴别器),根据实际的图片和第一代Generator的图,调整其参数,去判断一张图片是真正的图片还是由Generator产生
- Generator根据第一代Discriminator演化成第二代Generator
- 同样过程,演化第二代Discriminator…
注意 Generator从来没看过真正图片是什么,其目标仅仅是骗过最新一代的Discriminator。故其产生的图片是数据库中从未有过的。
3.2.2 discriminator演化过程
3.2.3 generator演化过程
- 第一代generator产生的图片没办法骗过第一代discriminator
- 调整generator参数,使得第一代discriminator输出→1(真),注意一定要固定住第一代discriminator参数