深度学习_GAN_GAN优化方法汇总
1.输入Normalize
- 将输入图片Normalize到 之间。
- 生成器最后一层的输出使用Tanh**函数。
Normalize非常重要,没有处理过的图片是没办法收敛的。图片规范化中一种简单的方法是(images-127.5)/127.5,然后送到判别器去训练。同理生成的图片也要经过判别器,即生成器的输出也是-1到1之间,所以要使用Tanh**函数。
2.使用修正的损失函数
-
在GAN论文中用来优化D,实际上更好。
因为第一个公式在实际中会造成训练早期梯度消失的问题。 -
实际工程中用反转标签来训练G更加方便,即把生成的图片当成real的标签来训练,把真实的图片当成fake来训练。
3.使用具有球形结构的随机噪声Z
-
不要使用均匀分布进行采样
-
使用高斯分布进行采样
When doing interpolations, do the interpolation via a great circle, rather than a straight line from point A to point B(博主不是很懂,尴尬)
4.BatchNorm
- 一个mini-batch中必须只有real数据或者fake数据,不要把他们混在一起训练。
- 如果能用BatchNorm就用BatchNorm,如果不能用则用instance normalization。(对于每个样本,减去平均值除以标准差)
5.避免引入稀疏梯度:ReLU,MaxPool
- GAN的稳定性会因为引入稀疏梯度受到很大影响。
- 最好使用LeakyReLU作为**函数。(D和G中都使用)
- 对于下采样,最好使用:Average Pooling或者卷积+stride。
- 对于上采样,最好使用:PixelShuffle或者转置卷积+stride。
最好连Pooling也不用,因为使用Pooling会损失信息,这对于GAN训练没有益处。
6.使用Soft和Noisy的标签
- Label平滑,如果你设real=1,fake=0,那么我们在实际中可以进行一些改动,对于real,我们可以用一个0.7-1.2之间的随机值来代替,对于fake,用0-0.3这个区间来代替。
- 用real batch训练D的时候,不要一次性都给标签1,设一个小概率进行标签反转,也就是会有很小一部分为0,当然这些标签是噪声。
7.DCGAN/混合模型
- 如果可以用DCGAN为Baseline,使用它!
- 如果我们可以使用DCGAN但是没有模型是稳定的,那我们就可以用混合模型:KL+GAN或者VAE+GAN。
8.使用RL中的稳定技巧
Experience Replay
- Keep a replay buffer of past generations and occassionally show them.
- Keep checkpoints from the past of G and D and occassionaly swap them out for a few iterations.
All stability tricks that work for deep deterministic policy gradients.
9.使用Adam优化器
- Adam优化器对于GAN来说非常有用。
- 在生成器中使用Adam,在判别器中使用SGD。
10.追踪训练失败的信号
- D的损失=0:模型训练失败。
- 检查梯度的标准:如果超过100,事情就会搞砸。
- 训练时,D损失的方差很低,并且随着时间的推移而下降。或者方差和峰值都很大。
- 如果生成器的损失稳步下降,说明它愚弄了判别器。
11.不通过统计平衡损失
- 不要试图找到一个(G的数量/D的数量)计划来展开训练。
- 很难,我们都试过了。
- 如果你真的尝试了,就要有原则的方法,而不是直觉。
12.如果我们有类别标签,那就使用他们
如果我们有数据的类别标签,则在训练判别器的时候对样本进行分类。
13.在输入端添加噪声,随着时间衰减
- 在D的输入中加入一些人工噪声。
- 在生成器的每层中都加入高斯噪声。
14.多训练判别器
- 尤其是我们有噪声的时候。
- 难以寻找到合适的规则去多训练判别器的时机。
15.条件GANs中的离散变量
- 使用嵌入层。
- 作为附加通道添加到图像。
- 保持嵌入维度低和上采样以匹配图像通道大小。
16.在训练和测试阶段都使用Dropout
- 使用Dropout也是为了因为一定的噪声。(50%)
- 在生成器的某几层中使用Dropout,而且测试和训练阶段都要做。