https://github.com/soumith/ganhacks
1.输入归一化
把信号归一化到-1 到1
generator的最后一层输出用Tanh
2.使用修饰过后的损失函数
在GAN的文章中,generator的损失函数是min(log 1-D) 但是在实际中会用max(log D)
- 因为前一个式子在早期会有梯度消失的问题
- Goodfellow et. al (2014)
在实际中的好方法:
训练生成器时翻转标签:real = fake, fake = real
3.使用球体Z
G的初始值不从均匀分布中采样,从高斯分布中采样
torch.randn(*size) 从标准正态分布(均值为0,方差为1)中抽取的一组随机数。应该是高斯分布
进行插值时,请通过大圆而不是从A点到B的直线进行插值
- Tom White's Sampling Generative Networks ref code https://github.com/dribnet/plat has more details
4.特征标准化
为真实数据和生成数据构造不同的mini batch,即每个mini batch仅需要包含所有真实图像或所有生成的图像。
如果不使用batch norm,则使用标准化(对于每个样本,减去均值并除以标准差)。
5. 避免稀疏梯度:ReLU,MaxPool
如果梯度稀疏,GAN的稳定性会受到影响
LeakyReLU =好(在G和D中)
对于下采样,使用:平均池化,Conv2d +stride
对于上采样,使用:PixelShuffle,ConvTranspose2d + stride
PixelShuffle:https://arxiv.org/abs/1609.05158
6.使用软标签和带噪声的标签
标签平滑,即如果您有两个目标标签:Real = 1和Fake = 0,则对于每个传入样本,如果它是真实的,则将标签替换为介于0.7和1.2之间的随机数,如果它是虚假的 ,将其替换为0.0和0.3。
比如
- Salimans et. al. 2016
使标签对discriminator产生干扰:训练鉴别器时偶尔翻转标签
7.DCGAN / Hybrid Models
如果能用就用DCGAN吧,这个能行!
如果不能使用DCGAN并且没有稳定的模型,可以使用混合模型:KL + GAN或VAE + GAN
8.使用强化学习的稳定性技巧
- Experience Replay
- Keep a replay buffer of past generations and occassionally show them
- 从过去的G和D中保留检查点偶尔用这个替换几次迭代
- 适用于深度确定性策略梯度的所有稳定性技巧
Pfau & Vinyals (2016)
9.使用ADAM优化器
optim.Adam规则
Radford et. al. 2015
使用SGD训练D,ADAM训练G
10.尽早觉察出失败
D loss为0,失败 (D太强了,以至于G没有动力去产生好的fake数据,他觉得自己太垃圾于是索性放弃了)
检查梯度的范数:如果大于100就坏掉了 (梯度也不能太大,D或G,不希望D和G性能差距太大,他们应该同时进步)
网络正常时,D的loss曲线的方差较小,并且随着时间的推移而下降或者有大的方差并且有尖峰
如果G的loss稳定上升,那么G就是在用垃圾愚弄D
11.不要通过统计来平衡损失(除非理由充分)
不要尝试去找到一个(number of G/number of D)时间表去展开训练
很困难,我们都尝试过
如果你想尝试,请基于规则,而不是直觉
举例
while lossD > A:
train D
while lossG > B:
train G
12.如果有标签,请使用
如果有可用的标签,请训练鉴别器以对样本进行分类:auxillary GANs
13.给输入加上随时间衰减的噪声
给D的输入加上人工噪声 Arjovsky et. al., Huszar, 2016
- http://www.inference.vc/instance-noise-a-trick-for-stabilising-gan-training/
- https://openreview.net/forum?id=Hk4_qw5xe
给G的每层加上高斯噪声 Zhao et. al. EBGAN
- Improved GANs: OpenAI code also has it (commented out)
14.[不确定]训练discriminator更多(有时)
特别是有噪声的情况下
找到到底训练D和G多少次非常困难
(意思是可以训练5次D,训练1次G,但至于准确确定训练多少次D再训练G非常困难)
15.[不确定]batch discrimination
混合的结果
(不知道这一条什么意思)
16.条件GAN中的离散变量
使用embedding层
往图像中加入条件信道
控制embedding的维度较低并且上采样去匹配图像信道的大小
17.在训练和测试阶段在G中用dropout
在dropout(50%)中提供噪声
在G的几层中用
Authors
- Soumith Chintala
- Emily Denton
- Martin Arjovsky
- Michael Mathieu