如图1所示。生成器和判 别器是两个网络,在训练前我们要先分别进行参数初始化。训练的第一步是固定生成器,只训 练判别器。因为生成器的初始参数是随机初始化的,所以它什么都没有学习到,输入一系列采 样得到的向量给它,它的输出肯定都是些随机、混乱的图片,就像是坏掉的老式电视收不到信 号时的花屏一样,与真实的动漫头像完全不同。同时,我们会有一个很多动漫人物头像的图 像数据库,可以通过爬虫等方法得到。我们会从这个图库中采样一些动漫人物头像图片出来, 来与生成器产生出来的结果对比从而训练判别器。判别器的训练目标是要分辨真正的动漫人 物与生成器产生出来的动漫人物间的差异。具体来说,我们把真正的图片都标1,生成器产生 出来的图片都标0。接下来对于判别器来说,这就是一个分类或回归的问题。如果是分类的问 题,我们就把真正的人脸当作类别1,生成器产生出来的图片当作类别2,然后训练一个分类 器。如果当作回归的问题,判别器看到真实图片就要输出1,生成器的图片就要输出0,并且 进行0-1 之间的打分。总之,判别器就学着去分辨这个真实图像和产生出来的图像间的差异。
图1 GAN算法的第一步
我们训练完判别器以后,接下来第二步,固定判别器,训练生成器,如图2所示。训练 生成器的目的就是让生成器想办法去骗过判别器,因为在第一步中判别器已经学会分辨真图 和假图间的差异。生成器如果可以骗过判别器,那生成器产生出来的图片可能就可以以假乱 真。具体的操作如下:首先生成器输入一个向量,其可以来源于我们之前介绍的高斯分布中采样数据,并产生一个图片。接着我们将这个图片输入到判别器中,判别器会给这个图片一个打 分。这里判别器是固定的,它只需要给更“真”的图片更高的分数即可,生成器训练的目标就是 让图片更加真实,也就是提高分数。
图2 GAN算法的第二步
对于真实场景中生成器和判别器都是有很多层的神经网络,我们通常将两者一起当作一 个比较大的网络来看待,但是不会调整判别器部分的模型参数。因为假设要输出的分数越大 越好,那我们完全可以直接调整最后的输出层,改变一下偏差值设为很大的值,那输出的得分 就会很高,但是完全达不到我们想要的效果。所以我们只能训练生成的部分,训练方法与前 几章介绍的网络训练方法基本一致,只是我们希望优化目标越大越好,这个与之前我们希望 损失越小越好不同。当然我们也可以直接在优化目标前加“负号”,就当作损失看待也可以,这 样就变为了让损失变小。另一种方法,我们可以使用梯度上升进行优化,而取代之前的梯度下 降优化算法。
总结一下,GAN算法的两个步骤。步骤一,固定生成器训练判别器;步骤二,固定判别 器训练生成器。接下来就是重复以上的训练,训练完判别器固定判别器训练生成器。训练完生 成器以后再用生成器去产生更多的新图片再给判别器做训练。训练完判别器后再训练生成器, 如此反覆地去执行。当其中一个进行训练的时候,另外一个就固定住,期待它们都可以在自己 的目标处达到最优,如图3所示。
图3 GAN 算法的完整训练过程