ICCV 2017 slides:https://github.com/soumith/talks/blob/master/2017-ICCV_Venice/How_To_Train_a_GAN.pdf
NIPS2016:https://github.com/soumith/ganhacks
训练GAN的16个trick
# 1:规范化输入
- 将输入图像规范化为-1到1之间
- 生成器最后一层的输出使用tanh函数(或其他bounds normalization)
#2:修改损失函数(经典GAN)
- 在GAN论文里人们通常用 min (log 1-D) 这个损失函数来优化G,但在实际训练的时候可以用max log D
-因为第一个公式早期有梯度消失的问题
- Goodfellow et. al (2014)
- 在实践中:训练G时使用反转标签能工作得很好,即:real = fake, fake = real
一些GAN变体
【TensorFlow】https://github.com/hwalsuklee/tensorflow-generative-model-collections
【Pytorch】https://github.com/znxlwm/pytorch-generative-model-collections
#3:使用一个具有球形结构的噪声z
- 在做插值(interpolation)时,在大圆(great circle)上进行
- Tom White的论文“Sampling Generative Networks”
- https://arxiv.org/abs/1609.04468
#4: BatchNorm
- 一个mini-batch里面必须保证只有Real样本或者Fake样本,不要把它们混起来训练
- 如果不能用batchnorm,可以用instance norm
#5:避免稀疏梯度:ReLU, MaxPool
- GAN的稳定性会因为引入了稀疏梯度受到影响
- LeakyReLU很好(对于G和D)
- 对于下采样,使用:Average Pooling,Conv2d + stride
- 对于上采样,使用:PixelShuffle, ConvTranspose2d + stride
-PixelShuffle 论文:https://arxiv.org/abs/1609.05158
#6:使用Soft和Noisy标签
- Label平滑,也就是说,如果有两个目标label:Real=1 和 Fake=0,那么对于每个新样本,如果是real,那么把label替换为0.7~1.2之间的随机值;如果样本是fake,那么把label替换为0.0~0.3之间的随机值。
- 训练D时,有时候可以使这些label是噪声:偶尔翻转label
- Salimans et. al. 2016
#7:架构:DCGANs / Hybrids
- 能用DCGAN就用DCGAN,
- 如果用不了DCGAN而且没有稳定的模型,可以使用混合模型:KL + GAN 或 VAE + GAN
- WGAN-gp的ResNet也很好(但非常慢)
- https://github.com/igul222/improved_wgan_training
#8:借用RL的训练技巧
- Experience replay
- 对于deep deterministic policy gradients(DDPG)有效的技巧
- 参考Pfau & Vinyals (2016)的论文
#9:优化器:ADAM
- 优化器用Adam(Radford et. al. 2015)
- 或者对D用SGD,G用Adam
#10:使用 Gradient Penalty
- 使梯度的norm规范化
- 对于为什么这一点有效,有多个理论(WGAN-GP, DRAGAN, 通过规范化使GAN稳定)
#11:不要通过loss statistics去balance G与D的训练过程(经典GAN)
#12:如果你有类别标签,请使用它们
- 如果还有可用的类别标签,在训练D判别真伪的同时对样本进行分类
#13:给输入增加噪声,随时间衰减
- 给D的输入增加一些人工噪声(Arjovsky et. al., Huszar, 2016)
- 给G的每一层增加一些高斯噪声(Zhao et. al. EBGAN)
#14:多训练判别器D
#15:避开离散空间
#16:离散变量
- 使用一个嵌入层
- 给图像增加额外通道
- 保持嵌入的维度低和上采样以匹配图像通道的大小
总结:
- GAN模型的稳定性在提升
- 理论研究有所进展
- 技巧只是权宜之计
时间线——GAN模型的稳定性
PPT下载:https://github.com/soumith/talks/blob/master/2017-ICCV_Venice/How_To_Train_a_GAN.pdf
参考:https://github.com/soumith/ganhacks