StyleGAN训练过程踩坑记录

前言

笔者基于论文GLEAN: Generative Latent Bank for Large-Factor Image Super-Resolution(CVPR2021 oral)中的基于mmedit的开源代码(由mmlab实验室开发,集成化程度相当高)在自己的数据集上进行调试。

作为深度学习萌新一枚,对GAN的使用毫无经验,因此写下这篇博客总结调试多天的心得收获,也或许能帮助到其他小伙伴。

本文主要聚焦训练过程中参数调节等技巧层面的问题,并不涉及对StyleGAN中结构的分析亦或是对上述改进论文的分析,也不涉及GAN网络结构设计中的复杂问题,相关问题可以移步作者原文Analyzing and Improving the Image Quality of StyleGAN


一、GAN中几项损失的权重问题

这里考虑GAN中常见的几种损失,pixel loss(一般使用L1损失或L2损失),GAN loss(生成器的GAN loss衡量的是生成的假图片在判别器中生成的标签与真实图片间标签的差异,常用交叉熵),Perceptual Loss(感知损失,可以参见这里)。笔者采用了以下的方法调节损失间的权重(这里假设pixel loss的权重为1个基准)

1.找到网络随机初始化状态下各项损失的基础值

训练网络的理想状态当然是各项损失逐次下降而且生成图片效果良好,因此我们首先要弄明白网络参数随机初始化以后各项损失大概是多少。

这个很容易做到,将学习率先调成零,确定一下各项损失数量级即可。

2.损失之间数量级的调节

将各项损失数量级大致配平再开始训练,当然也有些经验分享说pixel loss要比其他损失高一个数量级。至少在开始训练阶段,GANloss等不能过高,否则网络可能陷入无意义对抗,什么都学不到。

大致调好后网络就可以开始训练了,只要不出现梯度爆炸(例如判别器过强,生成器GAN Loss数量级爆炸)或梯度消失(例如判别器过弱,生成器从GAN当中学不到什么),那么就可以持续训练调试出一个具备初步性能的网络。那么可以关注一下这时各项损失的大小,因为在接下来调节过程中还要让各项数值逐次减小。

3.损失权重的微调

为了微调损失权重,大家的程序中一定要包括valid过程中图像存储、定时记录当前权重、程序能够从当前断点加载权重并重开的功能,这样才能方便地中断程序调节参数,还能实时观察效果。



二、GAN中判别器训练问题

1.什么是正常的判别器损失

根据小白现有的实践经验,正常的损失应该具有以下几个特征:

  • 生成器与判别器损失交替下降
  • 判别器损失值相较之前记录的初始化时候的判别器有明显下降,否则判别器可以被认为性能很弱,作用不大。
  • 判别器损失最后稳定在一个较低位置,意味着判别器能力很强,但生成器能力已经被训练到位,难以进一步改善。

2.判别器过强

判别器过强会造成梯度爆炸,也就是说生成器的权重会剧烈震荡,各项损失也剧烈震荡,生成图片效果很差。

训练技巧层面的解决方案有:

  • 降低学习率,成数量级地逐次下降
  • 在生成器工作一段时间后再启动判别器训练
  • 生成器训练多个batch后再启动判别器

3.判别器过弱

判别器过弱会造成梯度消失,也就是对生成器训练没多大帮助(“有你没你一个样”)

训练技巧层面的解决方案有:

  • 可能是生成器的GAN loss权重过大,导致生成器比判别器强很多,可以大幅减小上述权重,甚至减少至零。意味着我们几乎单独训练一个判别器,如果这时判别器损失还是很高,多半是其网络结构本身不合理,无法完成任务。


你可能感兴趣的:(深度学习)