最近在跟着教程用PyTorch搭一个简单的DCGAN,想在自拍数据集上生成点真人脸的假图。结果每次训练到差不多200个epoch左右,判别器loss就突然飙到20多,生成器loss直接掉到0附近,然后整个模型就废掉了,出来的全是噪点。我确认过数据归一化是[-1,1],学习率设的是0.0002,用的是Adam优化器。有人说是梯度爆炸或者模式崩塌,但我不知道怎么判断具体是哪种,也不知道该调什么参数。有没有大佬给个排查思路?或者有什么靠谱的GAN训练trick可以分享?先谢过。
用PyTorch写GAN训练到一半loss爆了,有人遇到过类似情况吗?
全部回复
共 163 条这很典型是模式崩塌,试试给判别器加梯度惩罚或标签平滑,能稳住loss。
这情况太典型了,八成是判别器学得太快把生成器压死了,模式崩塌的特征。你可以试试把判别器的学习率降到生成器的一半,比如0.0001,或者给判别器加个label smoothing,让它的判断别那么“自信”。另外检查一下生成器有没有用BatchNorm,有时候它反而会加剧训练不稳定。
这种loss走势大概率是判别器过拟合了,试试给判别器加一点dropout或者调低它的学习率。
这情况太典型了,八成是判别器学得太快导致生成器梯度消失。你可以试试给判别器加个标签平滑,把真实标签从1换成0.9,或者每训练一次判别器就训练两次生成器来平衡一下。另外检查下损失函数有没有用错,BCEWithLogitsLoss比直接BCELoss更稳定。我自己的经验是调小判别器学习率到0.00005也能缓解这种突然崩掉的问题。
这个现象太典型了,八成是判别器学得太快把生成器压死了,也就是判別器loss先崩、生成器跟着摆烂的那种模式崩塌。你可以试试把判别器的学习率调低一点,比如改成0.00005,或者每更新两次生成器才更新一次判别器,让两边节奏平衡些。另外加标签平滑和梯度惩罚(比如WGAN-GP的思路)也能有效稳住训练,我自己之前用类似参数调了一周才试出来。
试试把D和G的学习率分开调,D降到0.0001,G保持看看,或者加个label smoothing也能稳住。
200轮突然炸这个现象太典型了,大概率是判别器学得太快导致生成器梯度消失。你试试把判别器的学习率调到生成器的一半,或者给它加个标签平滑(比如正样本用0.9而不是1)。另外检查下判别器里有没有用BatchNorm,DCGAN官方建议判别器全用LeakyReLU不加BN,不然容易震荡。我之前也是自拍数据集,把生成器加了两层转置卷积才稳住。
我遇到过类似情况,200轮左右炸loss大概率是判别器学太快了。可以试试把判别器的学习率调低到生成器的一半,比如生成器用0.0002,判别器用0.0001,或者给判别器加一些label smoothing。另外检查下是不是所有batch norm都在正确的位置,我之前就是bn放错层导致梯度不稳定。
我之前也踩过这个坑,200 epoch左右loss爆炸大概率是判别器太强了,生成器完全跟不上。可以试试调低判别器的学习率,比如降到0.00005,或者给判别器加一点梯度惩罚。另外检查下有没有用BatchNorm,DCGAN里生成器和判别器对BN的位置挺敏感的,我之前换成InstanceNorm就稳了不少。还有个小trick是把标签平滑一下,判别器真假标签用0.9和0.1代替0和1,能防止它过于自信。
这个情况我遇到过好几次,大概率是判别器学太快把生成器压死了,属于典型的模式崩塌前兆。你可以试试把判别器的学习率调低到0.00005左右,或者给判别器加一点标签平滑,比如真实标签用0.9而不是1。另外检查下判别器有没有用batch normalization,有时候bn层在小batch size下反而会让训练不稳定。
你这情况八成是生成器把判别器打趴了,模式崩塌的典型症状。我之前玩DCGAN时候也踩过这个坑,试了下把生成器和判别器的学习率调成不对称的,比如生成器用0.0001,判别器用0.0004,或者反过来,效果好了不少。另外可以看看判别器里是不是用了BatchNorm,DCGAN里判别器一般不建议用这个,换成InstanceNorm或者干脆去掉试试。还有个小trick是给判别器加一点标签平滑,把真实标签从1换成0.9,能防止它过于自信。
学到了,感谢分享!
这个思路不错,收藏了。
200轮左右崩太经典了,建议先试试给判别器加标签平滑,把真实标签从1换成0.9,能缓解梯度爆炸。另外模式崩塌的话可以关注生成图像的多样性,如果全是同一张脸或者噪点,那就是崩了。我之前用WGAN-GP的梯度惩罚替代BCE loss,训练稳定很多,你可以试一下把D更新次数调成5:1,同时把学习率降到0.0001再看看效果。
这个情况挺典型的,200epoch左右崩掉大概率是判别器学太快了,把生成器压得太死。你可以试试给判别器加一点label smoothing,或者降低它的学习率,比如调到0.0001,生成器保持0.0002。另外检查一下有没有用BatchNorm,DCGAN里生成器和判别器都要加,不然很容易梯度爆炸。我上次也是自拍数据集遇到类似问题,后来加了谱归一化(SN)就稳了很多,你可以参考一下。
这种情况我遇到过好几次,大概率是判别器学太快把生成器压死了。可以试试调低判别器的学习率,比如降到0.00005,或者每训练两次生成器才训一次判别器。另外给判别器加一点标签平滑(比如真标签设成0.9)也能防止它过于自信。你检查下判别器里有没有用BatchNorm,DCGAN里判别器一般建议用LayerNorm或者干脆不用BN,否则容易出这种训练崩溃。
大概率是模式崩塌,试试给判别器加标签平滑,或者调低学习率到0.0001看看效果。
这情况太典型了,八成是生成器把判别器给骗傻了,导致梯度消失然后模式崩溃。可以试试给判别器加个标签平滑,把真实标签从1换成0.9,虚假标签从0换成0.1,能有效防止loss突然飙高。另外学习率0.0002对DCGAN来说其实不算低,试试降到0.0001或者用不同的lr分别调生成器和判别器,我遇到过类似问题这么调好的。
这种情况我也遇到过,多半是判别器太强导致生成器直接摆烂了。可以试试给判别器加一点dropout或者把它的学习率调低一点,比如设成生成器的一半,让两边别失衡太严重。另外检查一下你的梯度是否爆了,可以在每次更新前把梯度clip到[-1,1]来稳定训练。还有个小trick是把判别器里的LeakyReLU斜率从默认的0.02改到0.1或0.2,能让梯度流动更顺畅一些。
这种情况大概率是判别器太强直接把生成器锤爆了,典型的模式崩塌前兆。我之前跑DCGAN也翻过车,建议试试把判别器的学习率调低到生成器的十分之一,比如生成器0.0002,判别器0.00002,或者给判别器加个标签平滑。另外也可以检查下判别器里有没有用BatchNorm,DCGAN里判别器一般不用BN,不然容易让梯度炸掉。