Generative Adversarial Nets
Ian J. Goodfellow et al.
摘要
本文评估生成模型的新方法:对抗网络。同时训练生成器与判别器,生成器的目的是拟合出真实数据的分布,判别器的目的是评估样本为真实数据而非生成数据的概率。
在训练过程中,生成器尽最大努力使判别器误判,而判别器将尽最大努力作出正确判断。这实质上为零和博弈,结果为生成器可以复原真实数据分布,生成高度伪造的数据,以假乱真,使得判别器对每个样本判断结果为12\frac{1}{2}21.
概述
文中探究了一种简单情形:生成模型为一个多层感知机,往其中输入随机噪声数据,得到输出的生成样本。而判别器也是一个多层感知机。假设随机噪声zzz的的分布为pz(z)p_z(z)pz(z),生成器GGG生成的数据分布为pg(z)=G(z;θg)p_g(z)=G(z;\theta_g)pg(z)=G(z;θg),其中θg\theta_gθg为生成器GGG的参数,生成器GGG的目标就是使已知分布pg(z)p_g(z)pg(z)尽量接近未知的真实数据分布pdata(x)p_{data}(x)pdata(x),判别器DDD的输出为D(x;θd)D(x;\theta_d)D(x;θd),是一个标量,表示数据xxx为真实数据的概率。
根据交叉熵损失,可以构造出如下损失函数:
V(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
V(D,G)=E_{x\sim p_{data}(x)}[\log D(x)]+E_{z\sim p_{z}(z)}[\log (1-D(G(z)))]
V(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
训练中,D,GD,GD,G的目的各不相同,GGG希望其生成的数据越接近真实越好,换言之,GGG希望D(G(z))D(G(z))D(G(z))尽可能大(即接近1),这将使得V(D,G)V(D,G)V(D,G)变小。
DDD希望其鉴别数据真伪的能流越强越好,换言之,DDD希望D(x)D(x)D(x)尽可能大(即接近1),D(G(z))D(G(z))D(G(z))尽可能小(即接近0),这将使得V(D,G)V(D,G)V(D,G)变大。
综合来看,训练目标为:
minGmaxDV(D,G)
\min_G \max_D V(D,G)
GminDmaxV(D,G)
注意
实际上,上述损失函数V(D,G)V(D,G)V(D,G)中训练方式minGlog(1−D(G(z))\min_G \log (1-D(G(z))minGlog(1−D(G(z))不能为GGG的训练提供足够大的梯度,因为在训练初始阶段,GGG的伪造性能还很差,DDD可以轻易鉴别真伪,给出很高的置信度来区分生成样本与真实样本。此时对任意的输入噪声zzz,D(G(z))D(G(z))D(G(z))都几乎为0,log(1−D(G(z))\log (1-D(G(z))log(1−D(G(z))也几乎为0,处于饱和状态,只能为GGG提供很小的梯度。如果用maxGlog(D(G(z))\max_G \log (D(G(z))maxGlog(D(G(z))的方式训练GGG,则尤为不同,由于D(G(z))D(G(z))D(G(z))几乎为0,故log(D(G(z))\log (D(G(z))log(D(G(z))存在着很大的绝对值,可以为GGG的训练提供更强烈的梯度。
训练算法:
(请忽视以下的‘——’)
for 总训练迭代次数:
——for k 步: //进判别器DDD行训练
————从已知的噪声分布Pz(z)P_z(z)Pz(z)中选出mmm个样本{z(1),...,z(m)}\left\{z^{(1)},...,z^{(m)} \right\}{z(1),...,z(m)}
————从训练数据中选出mmm个样本{x(1),...,x(m)}\left\{x^{(1)},...,x^{(m)} \right\}{x(1),...,x(m)}
————设判别器DDD的参数为θd\theta_dθd,通过加上如下梯度来更新判别器DDD:
————∇θd1m∑i=1m[logD(x)+log(1−D(G(z)))]\nabla_{\theta_d}\frac{1}{m}\sum^m_{i=1}[\log D(x)+\log (1-D(G(z)))]∇θdm1∑i=1m[logD(x)+log(1−D(G(z)))]
——for 1 步: //进生成器GGG行训练
————从已知的噪声分布Pz(z)P_z(z)Pz(z)中选出mmm个样本{z(1),...,z(m)}\left\{z^{(1)},...,z^{(m)} \right\}{z(1),...,z(m)}
————设判别器GGG的参数为θg\theta_gθg,通过减去如下梯度来更新判别器DDD:
————∇θg1m∑i=1mlog(1−D(G(z)))\nabla_{\theta_g}\frac{1}{m}\sum^m_{i=1}\log (1-D(G(z)))∇θgm1∑i=1mlog(1−D(G(z)))
以上算法在每对判别器DDD的参数更新kkk次后,对生成器DDD的参数更新1次。训练完成后,从Pz(z)P_z(z)Pz(z)任取一个样本,经过生成器GGG运算后,都可生成出符合pdata(x)p_{data}(x)pdata(x)分布的样本。