
2.2 LSGAN
GAN的训练过程中经常出现生成器的梯度消失问题。一般而言,在深度学习中,我们需要根据损失函数计算的误差通过反向传播的方式,指导深度网络参数的更新优化。例如,对于一个含有多个隐藏层的简单神经网络来说,当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常。但是当靠近输入层时,由于梯度消失现象会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞,从而导致在训练该网络时,学习效果只等价于对后面几层浅层网络的权重更新。
GAN中的梯度消失问题与上述梯度消失问题有一点区别。因为GAN中包括生成器G和判别器D两个神经网络,它采用生成器G和判别器D交替训练的方式,当固定判别器D的参数而训练生成器G时,生成器G的参数的梯度几乎为0,即判别器D没有向生成器提供任何改进信息,导致生成器G无法成长,训练过程停滞。这便是GAN中的梯度消失问题。综上,一般的梯度消失问题讨论的是靠近输入层的浅层网络无法获得梯度信息(图2-6中的多层全连接网络的框内部分产生梯度消失),而在GAN中多指判别器无法向生成器提供梯度信息(图2-7的生成器产生梯度消失,即虚线部分)。

图2-6 深度网络的梯度消失

图2-7 GAN的梯度消失
为什么生成器G会产生梯度消失的现象?LSGAN认为:这是因为我们没有对那些分类正确却远离真实分布pdata的样本施加任何惩罚措施。下面从两个角度来描述这个观点[1]。
如图2-8所示,当固定判别器时,决策面D(x)=0.5是固定的,简单起见,我们使用直线表示决策面。对于决策面左上方的样本,D(x)小于0.5,而对于决策面右下方的样本,D(x)大于0.5,并且距离决策面越远,D(x)的数值与0.5的偏差越大。故对于当前的判别器,如果样本越在左上方,D(x)的数值越靠近0,则认为该样本来源于训练数据集的概率越低;如果样本越往右下方,D(x)的数值越靠近1,则认为该样本来源于训练数据集的概率越高。这时,考虑右下角的三角样本,这几个由生成器生成的样本距离决策面很远,故判别器对其具有很高的置信程度,但同时这几个样本也明显与训练数据集有很大的距离。当我们使用三角样本训练生成器时,这些样本可以成功欺骗判别器,导致判别器不会向生成器传达任何改进信息,这便产生了梯度消失,此时pg和pdata还有较大的差距。

图2-8 判别器固定时样本分布
另外,我们也可以从目标函数的角度来描述这个问题。在标准形式的GAN中,判别器D的最后一层使用的是sigmoid激活函数:

如图2-9所示,这里我们需要将判别器D的最后一个神经元的线性运算和激活函数运算进行拆分,对于输入的样本x,在经过前面多层的神经网络的运算到达最后一层(最后一层只有一个神经元)并经过该神经元线性运算后得到特征y,再通过激活函数sigmoid运算得到σ(y)。同时,标准形式GAN中生成器的目标函数为:


图2-9 判别器的内部结构
对任意特征y,其函数曲线为:

当σ(y)数值很大时,表示判别器认为输入样本有很大概率来源于训练数据集。如图2-10中三角样本所示,使用这些样本训练生成器时,目标函数进入数值平缓区,产生的梯度非常小,故容易造成梯度消失,也就是说生成器生成了对判别器而言置信度很高的样本,无论该样本是否“真正”符合训练集的概率分布,均不会传递给生成器梯度供其进化。
另外,若使用生成器的另一个目标函数:


图2-10 使用三角样本训练及对应的梯度
同上,对任意样本,其曲线为:

当σ(y)数值很小时,表示判别器认为输入样本有很小概率来源于训练数据集。如图2-11中菱形样本所示,使用这些样本训练生成器时,目标函数进入也会数值平缓区,产生的梯度非常小,故容易造成梯度消失,也就是说即使生成器产生了低置信度的样本,判别器也不会提供梯度从而“驱动”生成器不再产生这些劣质的样本。
至此我们可以发现,梯度消失的问题限制了生成器的自我进化,阻止了判别器和生成器实现最优解。为了解决这个问题,LSGAN提出一种新的损失函数:最小二乘损失函数,该损失函数可以惩罚生成器生成的远离决策面的样本,即可将样本拉近决策面,从而避免梯度消失问题。
在LSGAN中,对判别器D,训练数据集的样本的标签为b,生成器生成样本的标签为a,其目标函数为:

图2-11 使用菱形样本训练及对应的梯度

对生成器G,其目标函数为:

其中,c表示生成器希望判别器相信的数值。通常,我们有两种方案对a,b,c赋值。第一种方案,令b=c=1,且a=0,即使用0-1编码方案,使生成器产生的样本尽量真实。第二种方案,令a=-1,b=1,c=0。可以证明,当b-c=1且b-a=2时,生成器优化的是pdata+pg和2pg之间的皮尔逊卡方散度(属于f散度的一种)。实践中,LSGAN的激活函数通常选择ReLU函数和LeakyReLU函数,且这两种方案展现了相似的性能。