2.1 算法来源
作者:Mehdi Mirza, Simon Osindero 摘要: Generative Adversarial Nets were recently introduced as a novel way to train generative models. In this work we introduce the conditional version of generative adversarial nets, which can be constructed by simply feeding the data, y, we wish to condition on to both the generator and discriminator. We show that this model can generate MNIST digits conditioned on class labels. We also illustrate how this model could be used to learn a multi-modal model, and provide preliminary examples of an application to image tagging in which we demonstrate how this approach can generate descriptive tags which are not part of training labels. 日期:6 Nov 2014 论文链接: https://arxiv.org/pdf/1411.1784.pdf 实验数据: https://github.com/MrHeadbang/machineLearning/blob/main/mnist.zip 代码链接: https://github.com/eriklindernoren/PyTorch-GAN/blob/master/implementations/cgan/cgan.py
2.2 算法介绍
2.3 基于CGAN的手写数字生成实验
上述内容详见:【论文复现】Conditional Generative Adversarial Nets(CGAN)
2.4 实验分析
2.4.1 超参数调整
一、batch size
理论分析
批量梯度下降BGD:batch size=整个训练集,每次迭代时需要计算每个样本上损失函数的梯度并求和,梯度准确。不适用于大样本训练,只适用于小样本训练,但小样本训练易出现过拟合现象。 随机梯度下降SGD:batch size =1,每次迭代时只采集一个样本,计算这个样本损失函数的梯度并更新参数,因而梯度变化波动大,网络不容易收敛。
小批量梯度下降Mini-batch:每次迭代时随机选取小部分训练样本来计算梯度并更新参数,不仅使梯度变准确,也可以充分利用计算机的并行计算能力提高训练效率。
- 若batch size设置合适,此时再增加batch size大小,梯度也不会变得更准确。
- 同时为了达到更高的训练网络精度,应该增大epoch,使训练时间变长。
定量实验
固定参数:lr_d = lr_g = 0.0001 , n_critic = 5, epoch = 50
以d_loss为例,小batch size时loss波动明显,而batch size =1024几乎无波动,说明batch size越大训练越稳定,这是因为大的batch size梯度的计算更加稳定,因此loss曲线会更加平滑。
batch size与训练时间
大batch size不仅提高稳定性,还能减少训练时间:同样的epoch数目,大的batch size需要的batch数目减少了,可以减少参数更新的次数,进而减少训练时间。
关于loss曲线的说明
初始阶段g_loss上升,d_loss下降,即训练不稳定:G还没有学习到足够好的数据分布,因此 g_loss 会先上升。随着训练的进行, G和D逐渐达到平衡,g_loss 会稳步下降并最终收敛到一个稳定的水平。而D在不断适应G生成的更逼真的样本,并变得难以区分真实样本和生成样本,导致d_loss上升并逐渐趋于稳定。后续进行了learning rate、n_critic等超参数调整以及多种网络优化及正则化实验,以试图缓解初始阶段训练的不稳定。
二、epochs
定量实验
batch size = 32,lr_d = lr_g = 0.0001,n_critic = 5,时,每5 epoch:
如果epochs过少,模型欠拟合,无法很好地拟合训练数据。通过增加epoch,可以提高手写数字图像的质量和清晰度。但如果epochs过多,可能导致模型过拟合,对训练数据的噪声和细节学习过多,降低模型的泛化能力,本实验暂未出现该情况。
epoch与batch size
每epoch中,整个训练集将根据batch size划分成多个batch进行训练,直到遍历完整个训练集。计训练集大小为num,则总迭代次数
如上述batch size实验结果所示,固定epoch,step和batch size成反比,以batchsize = 128为例,其d_loss:
如图,3k step 内,d_loss下降,与batch size =1024(总step约3k)时变化趋势一致,均为下降,此后d_loss上升,与其余batch size变化趋势亦一致。
可见大batch size时,loss变化幅度更小,即训练过程更稳定,与前文分析相符。
相同step下不同batch size
batch size = 32生成图像效果差,由于其使用更少的数据来进行参数更新,出现欠拟合。较大的batch size从更多的数据中计算平均梯度,可以提供更稳定的梯度估计,提高泛化能力,生成图像质量更佳。但batch size = 256时效果一般,因为此时模型尚未收敛,为了达到更好的效果,需要增大epoch。
三、Adam:learning rate
batch size = 32 , n_critic = 5时,训练50 epoch,设置lr_d = lr_g
- 学习率太小,收敛速度慢
,也可能会陷入局部最优点
- 学习率较大
,参数的更新速度快,可以加快网络的收敛速度。
- 学习率太大
,loss振动幅度大,模型难以收敛。
四、Adam:weight_decay
batch size = 32 , lr_d = lr_g = 0.0001, n_critic = 5时,训练50 epoch
代码语言:javascript复制# Use Adam optimizer for updating discriminator's parameters
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=lr_d, weight_decay=1e-2)
# Use Adam optimizer for updating generator's parameters
g_optimizer = torch.optim.Adam(generator.parameters(), lr=lr_g, weight_decay=1e-2)
训练结束时生成数据:
Adam 的参数weight_decay将对模型的权重参数进行L2 正则化,weight decay 越大,正则化效果越强,阻碍了模型的灵活性,使得模型难以学习到数据的特征。正如实验结果所示,当 weight decay 设置为 e-2 时生成图像的效果最差,且g_loss 曲线下降缓慢。当减小 weight decay 时,模型对训练数据的拟合能力增强,g_loss 下降的速度也变快,生成图像的效果也更佳。
五、n_critic
设置batch size = 128 , lr_g = lr_d = 0.0001,训练50 epoch,,每更新n_critic次D,更新一次G:
loss曲线
如图,n_critic=1 初始阶段训练不稳定,loss有明显的水平震荡,(G和D频繁地交替训练,对抗激烈)。而n_critic越大,loss进入收敛状态越快,但同时也会使得训练过程变得更加缓慢。
相同step下不同n_critic
可以看到,相同step, n_critic越大,生成的图像效果越好,即增加n_critic值有助于提高模型的稳定性和生成图像的质量。step相同时,增加n_critic的值,可以使D进行更多次的训练,从而更有效地分辨真实图像和生成图像,进而有助于生成器生成更逼真的图像。