GAN
参考文献:
受限玻尔兹曼机也是生成模型
自编码机:
所学得的NN Decoder可以将一个任意生成的向量生成为一张图片
VAE(Variational Auto-Encoder)变分自编码器:
为了不使σ 为0,因此加入限制:
目的是为了使得m越接近0越好,相当于L2的正则化,而前一项也越接近0越好
缺点:没有真正去模拟一张图片,无法达到和人一样的识别效果
GAN
Dv1可以分辨Gv1和real image之间的差别,Gv2可以产生无法使Dv1识别出来的图片,Dv2可以分辨Gv2和real image之间的差别,以此类推
训练过程:
- 随机初始化一个G,生成一组image,将其标为negative,例如0
- 将真实的image标为positive,例如1,并将这两组数据作为D的输入
- 将G和D的网络相连成一个网络,固定D的网络,通过调整G的网络参数使得D输出值最大
DCGAN (Deep Convolutional GAN):和原始GAN的区别是其架构全都是CNN
GAN基本原理:
原始数据分布为Pdata(x) ,需要寻找一个PG(x;θ)
使其与Pdata(x)
相似:
- 从Pdata(x)
中采样数据
- 计算PG(x;θ)
- 找到θ*
使得似然
最大化
KL越小,表示两个分布越相近
高斯混合模型无法很逼近原始数据分布,因此生成的图像都是糊成一个色块
因此采用神经网络来解决这个问题
因为G很复杂,即使知道z的先验分布,也难以计算似然,GAN解决了这个问题
先固定G,对于每个G找出使其最大的D,然后在所有的最大值中找出其中的最小值,并获得相应的G和D的pair
这里Pdata(x) 和PG(x)
都是标量,因此用a和b来表示
最后推导出的两个KL是对称相等的
可以定义其他的V使得其最后呈现的是其他divergence形式
如果分布一致,那么JSD为0;如果完全不一致则为log2
将其转化为关于G的损失函数L(G),并求微分
存在的问题:更新后的JS并不一定比上一个小
实现:无法做积分,因此采用采样的方式
Loss和JSD相反
一次迭代:
Pprior(z) 是自己定的,因此知道如何采样
训练D:重复k次,找出让V最大的D。但是实际上,不一定能找到全局最优,只会找到局部最优,也就是下界
训练G:固定D,寻找使V最小的G,通常只会更新一次,由于上述更新问题,更新多次并不一定使得V下降
训练开始时,由于G是随机初始化的,因此D(x)的值通常很小,其微分也很小,因此训练速度很慢
因此将函数进行改进,使其微分值变大,也就是最小化reverse KL divergence-2JSD
*WGAN
实践中D可以轻易认出已经训练地很好的G产生的image,D的loss几乎都为0,可能的原因:
- 用采样来逼近,没有办法进行积分->解决办法:减少训练次数,减少网络参数等来使其弱化
- 数据的特性:考虑的数据往往是高维空间中的数据,使其交集过少
G需要慢慢演化:
解决方法:
增加噪声:①输入增加噪声;②标签增加噪声
使得D无法完美分开真实和生成数据,使得两个分布之间存在交叠,但噪声需要随着时间衰减
Mode Collapse
有多个分布,但只能学出一个分布
- PG
尽量覆盖所有的Pdata
,以免产生无穷大的KL
- 只要PG
产生的image不像是真实的图片,那么reverse KL就会无穷大,因此PG
就会分布得更加保守,因此可能产生同一张image,以免产生无穷大的reverse KL
Conditional GAN
控制G产生什么
- 为了对其进行随意的影响可以在输入时加入噪声分布,但在训练中通常会被无视,因此采用dropout的方式使其无法无视噪声的影响
- 我们需要生成一个image是和c相关的
应用:
- Text-image
- Image-image translation