GAN网络训练技巧
- 当判别网络能力过强,传递给生成网络的“提示”信息太少,导致训练网络梯度消失,无法学习;
- 当判别网络能力太差,颠倒是否,训练网络无法稳定学习,还会扬长避短,“钻空”判别网络弱点,丢失生成样本的多样性(模型崩溃);
判别器因监督学习而提升,生成器因判别器而提升,同时两者都不能把对方放倒,一旦完全放倒对方,自己就独孤求败了,无法再次提升技能。
从原理上来说,生成器和判别器从一开始都是非常弱的,因此一般不会在训练一开始两者损失就非常剧烈的波动。在训练一段时间达到稳定期后,生成器和判别器的损失都应该在一个小区间内波动,而不会有明显的持续上升/下降趋势。
如果生成器损失持续明显上升,表明其无法学习怎么欺骗判别器,体现在结果上就是开始生成噪声。
如果判别器损失持续明显上升,表示其无法学习怎么识别生成器,体现在结果上就是生成器可能会生成一致的,无意义的但是能欺骗判别器的图像(比如直接输出训练集中的样本)。
因此正确的训练曲线一般是生成器和判别器一开始不怎么波动,然后损失下降,最后稳定。
提高训练稳定性和成功率的trick:
- 生成器预训练;
- 软标签和带噪声的标签。这一点在训练判别器时极为重要,使用硬标签(非0即1)训练出的判别器太无情了,要么通过,要么一棍子打死,没有半点道理可讲。我们可以在真实样本的标签1上加上(-0.2,0)的随机噪声,在假样本的标签0上加(0, 0.2)的随机噪声。软标签和带噪声的标签的加入可以在一定程度上解决生成网络梯度消失的问题;
- 反转标签(Real=False,fake=True)。反转标签,故意颠倒黑白。如果你正在使用「真实图像=1」、「生成图像=0」的标签分配方法,将标签反转过来会对训练有所帮助,原因解释就是,阎王爷也有开小差的时候,因”过失性”地弄错标签,这个被放过的小鬼反而能刺激判别网络别一条道走到黑,适当停下来想想。听的有点无离头了吧?从数学上讲就是,判别网络也是靠BP算法更新权重的,而权重的更新可能会遇到相对极值点而停止不前,而反转标签却可以打破这种僵局;
- 不要采用早停法(early stopping)。GAN在前期训练过程中,生成网络和判别网络都处于不稳定的状态,如果过早的就认为train不起来,未免太武断。GAN 的训练时间很长,初始的少量的损失值和生成的样本几乎不能显示出任何趋势和进展。在结束训练过程并调整设置之前,还是很有必要等待一段时间的。这条规则的一个例外情况是:如果你看到判别器损失迅速趋近于 0。如果发生了这种情况,几乎就没有任何机会补救了。最好在对网络或训练过程进行调整后重新开始训练;
- 监控梯度变化。如果可能的话,请监控网络中的梯度和损失变化。这可以帮助我们了解训练的进展情况。如果训练进展不是很顺利的话,这甚至可以帮助我们进行调试。理想情况下,生成网络应该在训练的早期接受大梯度,因为它需要学会如何生成看起来真实的数据。另一方面,判别网络则在训练早期则不应该总是接受大梯度,因为它可以很容易地区分真实数据和生成数据。当生成器训练地足够好时,判别器就没有那么容易区分真实数据和生成数据了。它会不断发生错误,并得到较大的梯度;
- 调整网络结构。在使用以上方法时,不防也考虑一下你的网络,如果单独train一个MNIST手写体不需要多大容量的生成网络,但要生成毛发都清晰可见的苍老师美照,显然你需要更复杂的网络。险了网络容量,还有激活函数,是使用sigmoid还是tanh,要不要带卷积?卷积核多大合适?随机模型使用高斯还是均匀分布等。有时,一个小改动将决定你的GAN模型能否训练成功。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 JrunDing!
评论