生成对抗网络-GAN
1. GAN基础
本质
图片生成器
组成:
- D:判别网络;
- G:生成网络;
- Loss:判别是真实模型的概率:是/否真值。
数学原理
其中,z:均匀分布变量;x:某空间的数据;z->x生成某空间数据;
黑线:目标标准分布;绿线:生成数据分布;蓝线:判断函数(根据x大小判断是否真实的概率)
- 初始状态:生成数据同真实数据差距明显,容易判别;
- 训练过程:对是否真实判断得到的loss引导生成模型更新,差距减少;
- 最终状态:生成数据同真实数据相似,无法识别。
对于D:maximize【D(x)+1-D(G(z))】
对于G:minimize【1-D(G(z))】
目标:
假设前提:判别模型D,生成模型G具有学习能力,能够收敛。
简单模型
G: relu+sigmoid nn;
D: maxout
优缺点
优点:
- 不需要大量label数据,loss来源于D判定;
- 产生大量生成数据用于训练,接近无监督学习;
- 可以和深度神经网络结合。
缺点:
- 数据直接生成,没有推导过程;
- 生成器,判断器需要配合共同训练难度较大;
- 容易出现训练失败。
可能性
- 连接神经网络扩展;
- 输入不仅是噪声信号,条件控制;
- 时域信号生成。
2. 深度 GAN
DCGAN(Deep Convolutional GAN)
卷积神经网络+GAN
变化: 生成器G;判别器D(conv feat>1)
结构细节
- 没有pooling,stride conv/deconv
- 运用batchnorm;
- 不要FC(全连接层);
- 非线性激励ReLU(G),LeakyReLU(D).
总结
- GAN同深度CNN网络结合;
- 噪声输入有着重要作用,可以实现有意义的运算;
- 对输入信号实际意义可以有更深入研究,定性输出有可能。
3. 条件 GAN
cGAN(conditional)
用一些信息对GAN的生成图片进行范围约束;
信息的类型:文字、图片;
训练过程输入:随机信息+约束信息特征。
文字作为约束
输入: 随机信息+约束信息特征
文字+位置作为约束
Where and what ?
某位置的文字约束-key points condition
关键点多层次参与图片生成。
图片作为约束条件
利用图片生成相关的图片。
- 映射关系无限可能;
- 图片分割;
- 轮廓生成;
- 热图生成;
- 图片补全;
- 高精度生成。
模型结构:
随机输入同图片结合;
G学习图片到转化图片的映射关系;
D判断生成图片和正式图片是否一致。
- G:反池化,反卷积结构(deconv)
Unet结构。 - D:PatchGAN
图片整体优化会造成生成的图片边界模糊,高频信息难以估计。
解决方案:判别器关注在local区域。
4. Info GAN
特点
在DCGAN中,随机参数z的值有一定实际意义,如果有text label可以学习这种约束关系,如果没有label数据,则使用infoGAN。
infoGAN可以自动学习z中部分变量的意义。
- Z分为两部分,c和z;
- c代表数据分布某种物理意义,z随机信号。
关系
- DCGAN、InfoGAN没有额外数据标注;
- DCGAN中z对生成数据控制作用不确定,需要尝试观察;
- InfoGAN没有额外的标注,能够学到c与生成图片关系,引入Mutual Info 概念,其参与目标函数的确定,关系越紧密
I 越高,训练过程使得Mutual Info高,实现生成图片同c的联系。
新的loss为:
其中,V(D,G)为旧的loss。
例如,有四个pattern,设计出4个c,希望最终每个c对应一个pattern的强度。
结果
确定c向量长度,观察各个c物理意义。
特点:
- 无监督学习;
- 自动学到模式;
可用于生成特点图片。
要求:训练图片的模式比较明显。
5. Wasserstein GAN
GAN存在的问题
- 训练困难,G、D需要经过次数尝试,需要匹配好;
- Loss无法知道能否优化,图片的质量和分布无法得到明确的体现;
- 生成样本单一;
- 改进方案靠暴力多次尝试。
**原因:**Loss函数选择不合适,使模型容易面临梯度小时,梯度不稳定,优化目标不定导致模型失败。
WGAN的特点
- 无需平衡D、G的训练组合;
- 解决collapse model的问题,保证样本的多样性;
- 结构更改简单有效。
改进方法
充分利用神经网络拟合性能以及数值近似。
- 判别器最后一层去掉sigmoid(使得loss更明显);
- 生成器和判别器的loss不去log(使得loss更明显);
- 判别器的参数更新截断;
- 不用基于动量的优化算法。
6. 实例:图片生成器
Image conditon pix2pix
fork代码参见:https://github.com/KoalaTree/pix2pix-tensorflow