生成式对抗网络(Generative Adversarial Networks, GANs)
1 原始的 GANs
1.1 GANs 的结构
GANs 的结果图如下所示:

生成式对抗网络 GANs 最重要的两个部分为:
- 生成器(Generator) :用于生成“假”样本。生成器从先验分布中采得随机信号,经过神经网络的变换,得到模拟样本。
- 判别器(Discriminator) :用于判断输入的样本是真实的还是合成的。判别器既接收来自实际数据集的真实样本,也接收来自生成器的模拟样本,判别器需要判断输入的样本是真实数据还是生成器的模拟(假)数据。
从上面可以看出,生成器和判别器是对抗的关系,生成器要尽可能生成出让判别器失败的样本,而判别器要尽可能识别出生成器的假样本。GANs 就是通过这种对抗的关系,让生成器和判别器不断提升。理想状态下,生成器和判别器最终能达到一种平衡,两者都趋于完美,都没有更进一步的空间。
1.2 GANs 的训练过程
GANs 采用生成器和判别器交替优化的方式:
(1)固定生成器 GG,训练判别器 DD
固定生成器 GG,然后利用生成器随机模拟产生样本 G(z)G(z) 作为负样本(zz 是一个随机向量),并从真实数据集中采样获得正样本 XX,将这些正负样本输入到判别器 DD 中,根据判别器的输出(即 D(X)D(X) 或 D(G(z))D(G(z)) )和样本标签来计算误差,最后利误差反向传播算法来更新判别器的参数,如下图所示

(2)固定判别器 DD,训练生成器 GG
固定判别器 DD,然后利用当前生成器 GG 随机模拟产生样本 G(z)G(z),并输入到判别器 DD 中;根据判别器的输出 D(G(z))D(G(z)) 和样本标签来计算误差,最后利用误差反向传播算法来更新生成器 GG 的参数,如下图所示:

1.3 GANs 的训练模型
先给出 GANs 的公式:
minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)logD(G(z))\min_G \max_D V(D,G)=E_{x\sim p_{data}(x)}[\log D(x)] + E_{z\sim p_{z}(z)}[\log D(G(z))] \tag{1}
训练模型中需要用到的符号有:
- GG:生成器模型,通常为一个多层感知机结构的可微函数
- DD:判别器模型
- xx:判别器的输入,包括真实数据样本和生成器的输出
- zz:生成器输入的噪声变量,则生成器的输出为 x=G(z)x=G(z)
- pdata(x)≐p(x∣data)p_{data}(x) \doteq p(x|data):表示从实际数据集得到样本 xx 的概率
- pz(z)p_{z}(z):生成器输入的噪声变量 zz 的先验分布
- pg(x)≐p(x∣g)p_{g}(x) \doteq p(x|g):生成器输出的样本 xx 的概率
- psrc(data)p_{src}(data) 与 psrc(g)p_{src}(g):判别器模型输入样本中来自真实数据和来自生成器的概率,一般采用一半真实数据、一半假数据的方式,即:psrc(data)=psrc(g)=12p_{src}(data)=p_{src}(g)=\frac{1}{2}
- G(z;θg)G(z;\theta_g):θg\theta_g 为生成器的多层感知机的参数,G(z;θg)G(z;\theta_g) 代表生成器模型的输出空间
- D(x;θd)D(x;\theta_d):θd\theta_d 为判别器的多层感知机的参数,D(x;θd)D(x;\theta_d) 为判别器的输出,是一个标量值
- D(x)D(x):判别器预测输入样本 xx 来自于真实数据集的概率
- (G∗,D∗)(G*,D*):求得的解,即达到最终纳什均衡点时的生成器和判别器
1.3.1 生成器 GG 固定,寻求当下最优的判别器 DG∗D_G^*
判别器 DD 实质上解决的是一个二分类问题,其损失函数可以用 负对数似然(Negative Log-Likelihood,NLL) ,也称 绝对交叉熵损失(Categorical Cross-Entropy Loss) 来表示:
L(D)=−∫p(x)[p(data∣x)logD(x)+p(g∣x)log(1−D(x))]dx(2)L(D)=-\int p(x)[p(data|x) \log D(x) + p(g|x) \log (1-D(x))]dx \tag{2}
其中:
- p(data∣x)p(data|x):样本 xx 属于真实数据集的概率
- p(g∣x)p(g|x):样本 xx 属于生成器的概率
我们可以推出:
p(x)p(data∣x)=psrc(data)p(x∣data)=psrc(data)pdata(x)=12pdata(x)p(x)p(data|x)=p_{src}(data)p(x|data)=p_{src}(data)p_{data}(x)=\frac{1}{2}p_{data}(x)
p(x)p(g∣x)=psrc(g)p(x∣g)=psrc(g)pg(x)=12pg(x)p(x)p(g|x)=p_{src}(g)p(x|g)=p_{src}(g)p_{g}(x)=\frac{1}{2}p_{g}(x)
代入公式 (2)则有:
&= -\frac{1}{2}(E_{x\sim p_{data}(x)}[\log D(x)] + E_{x\sim p_{g}(x)}[\log (1-D(x))]) \tag{3}
因此,寻求当下最优的判别器 DG∗D_G^* 就是最大化以下值函数:
V(D)=Ex∼pdata(x)[logD(x)]+Ex∼pg(x)log(1−D(x))V(D)=E_{x\sim p_{data}(x)}[\log D(x)] + E_{x\sim p_{g}(x)}[\log (1-D(x))] \tag{4}
对于单个样本 xx,则最大化值函数:
maxDpdata(x)logD(x)+pg(x)log(1−D(x))\max_D p_{data}(x)\log D(x) + p_{g}(x)[\log (1-D(x))] \tag{5}
令 pdata(x)=ap_{data}(x)=a,pg(x)=bp_{g}(x)=b,D(x)=DD(x)=D,则式(5)可以写作:
f(D)=aD+bDf(D)= aD + bD
令其对 DD 的导数为零有
df(D)dD=a1D−b11−D=0\frac{df(D)}{dD}= a \frac{1}{D} - b \frac{1}{1-D}=0
从而有:
D∗=aa+bD^*=\frac{a}{a+b}
即:
D∗(x)=pdata(x)pdata(x)+pg(x)(6)D^*(x)=\frac{p_{data}(x)}{p_{data}(x)+p_{g}(x)} \tag{6}
在公式(6)外面套上对 xx 的积分,解由单点变成函数解:
DG∗(x)=pdatapdata+pg(7)D^*G(x)=\frac{p{data}}{p_{data}+p_{g}} \tag{7}
将公式(7)代入公式(4)中,有:
&= -2\log 2 + \int_x p_{data}(x) \log [\frac{p_{data}}{(p_{data}+p_{g})/2}] dx + \int_x p_{g}(x) \log [\frac{p_{g}}{(p_{data}+p_{g})/2}] dx
KL 散度(Kullback–Leibler Divergence)
又称相对熵(Relative Entropy),两个分布 PP 和 QQ 的 KL 散度记为 KL(P∥Q)KL(P| Q),计算公式为:
KL(P∥Q)=Ex∼P(x)[logP(x)Q(x)]=∑i=1n[P(xi)logP(xi)Q(xi)]KL(P| Q)=E_{x\sim P(x)}[\log\frac{P(x)}{Q(x)}]=\sum_{i=1}^n [P(x_i) \log\frac{P(x_i)}{Q(x_i)}]
JS 散度(Jensen–Shannon Divergence)
两个分布 PP 和 QQ 的 JS 散度记为 JS(P∥Q)JS(P| Q),计算公式为:
JS(P∥Q)=12KL(P∥P+Q2)+12KL(Q∥P+Q2)JS(P| Q)=\frac{1}{2}KL(P| \frac{P+Q}{2}) + \frac{1}{2}KL(Q | \frac{P+Q}{2})
& \in [-2\log 2, 0]
固定判别器为 DG∗D_G^* 时,求生成器 GG 的值函数可以写作:
minGV(G,DG∗(x))=minG{−2log2+2JS(pdata∥pg)}\min_G V(G, D^*G(x))=\min_G{ -2\log 2 + 2 JS(p{data} | p_{g}) }
显然,当 pdata=pgp_{data} = p_{g} 时,JS(pdata∥pg)=0JS(p_{data} | p_{g})=0,最优解 G∗(z)=x∼pdata(x)G^(z)=x \sim p_{data}(x),D∗(x)≡12D^(x) \equiv \frac{1}{2},值函数 V(G∗,D∗)=−2log2V(G*,D*)=-2log2
1.3.2 判别器 DD 固定,寻求当下最优的判别器 G∗G^*
令 G′G' 为上一步的生成器,DD 为在 G′G' 下求得的最优判别器 DG′∗(x)D^_{G'}(x),那么,求解最优 G∗G^ 的过程为:
argminGV(G,DG′∗)=argminG[KL(pg∥pdata+pg′2)−KL(pg∥pg′)]arg \min_G V(G,D^*{G'})=arg \min_G [KL(p_g | \frac{p{data}+p_{g'}}{2})-KL(p_g | p_{g'})]
由此可以得出两个结论:
- 优化 GG 的过程是让 GG 远离前一步的 G′G',同时接近分布 pdata+pg′2\frac{p_{data}+p_{g'}}{2}
- 达到均衡点时 pg′=pdatap_{g'}=p_{data},有 argminGV(G,DG′∗)=argminG0arg \min_G V(G,D^*{G'})=arg \min_G 0,如果用这时的判别器去训练一个新的生成器 GnewG{new},理论上可能训练不出来。
1.4 GANs 总结
(1)GANs 本质上式在最小化生成分布与真实数据分布的 JS 距离,当算法收敛时生成器刻画的分布就是真实数据的分布。
(2)发明 GANs 的初衷是为了更好地解决概率生成模型的估计问题
传统概率生成模型方法(如:马尔可夫随机场、 贝叶斯网络)会涉及大量难以完成的概率推断计算,而 GANs 可以避开这类计算。
如果随机变量 ZZ 和 XX 之间满足某种映射关系 X=f(Z)X=f(Z),那么它们的概率分布 pX(X)p_X(X) 和 pZ(Z)p_Z(Z) 也存在某种映射关系。当 Z,X∈RZ,X\in R 都是一维随机变量时,pX=df(Z)dXpZp_X=\frac{df(Z)}{dX}p_Z;当 Z,XZ,X 都是高维随机变量时,导数变成雅克比矩阵 pX=JpZp_X=Jp_Z。 因此,已知 ZZ 的分布,我们对随机变量间的转换函数 ff 直接建模,就唯一确定了 XX 的分布。
这样,不仅避开了大量复杂的概率计算,而且给 ff 更大的发挥空间,我们可以用神经网络来训练 ff。
1.5 GANs 存在的问题
在实际训练中,早期阶段生成器 GG 很差,生成的模拟样本很容易被判别器 DD 识别,使得 DD 回传给 GG 的梯度极小,达不到训练的目的,这个现象称为 优化饱和 。
原因分析
这里将 DD 的 Sigmoid 输出层的前一层记为 oo,那么 D(x)D(x) 就可以表示成 D(x)=Sigmoid(o(x))D(x)=Sigmoid(o(x)),此时有:
∇D(x)=∇Sigmoid(o(x))=D(x)(1−D(x))∇o(x)\nabla D(x)= \nabla Sigmoid(o(x)) = D(x)(1-D(x))\nabla o(x)
因此训练 GG 的梯度为:
∇log(1−D(G(z;θg)))=−D(G(z;θg))∇o(G(z;θg))\nabla \log(1-D(G(z;\theta_g))) = -D(G(z;\theta_g))\nabla o(G(z;\theta_g))
当 DD 能很好的分类样本时,意味着认错假样本的概率几乎为零,即 D(G(z;θg))→0D(G(z;\theta_g)) \rightarrow 0,假定 ∣o(G(z;θg))∣<C|o(G(z;\theta_g))|<C(CC 为一个常数),则可推出:
limD(G(z;θg))→0∇log(1−D(G(z;θg)))=−limD(G(z;θg))→0D(G(z;θg))∇o(G(z;θg))=0\lim_{D(G(z;\theta_g)) \rightarrow 0} \nabla \log(1-D(G(z;\theta_g)))=-\lim_{D(G(z;\theta_g)) \rightarrow 0} D(G(z;\theta_g))\nabla o(G(z;\theta_g))=0
故 GG 获得的梯度基本为零,因此 DD 强大后对 GG 的帮助反而很小。
解决方法
解决方案是将 log(1−D(G(z;θg)))\log(1-D(G(z;\theta_g))) 变为 log(D(G(z;θg))\log(D(G(z;\theta_g)),形式上有一个负号的差别,故让后者最大等效于让前者最小,二者在最优解相同。
更改后的目标函数的梯度为:
log(D(G(z;θg)))=(1−D(G(z;θg)))∇o(G(z;θg))limD(G(z;θg))→0∇log(D(G(z;θg)))=∇o(G(z;θg))
因此,更改后即使 D(G(z;θg))→0D(G(z;\theta_g)) \rightarrow 0,∇log(D(G(z;θg)))\nabla \log(D(G(z;\theta_g))) 也不会消失,仍能给生成器提供有效的梯度。
(GAN 的变种算法以后再继续补充)
2 WGAN
原始 GAN 的判别器是最小化生成分布与真实数据分布的 JS 距离,WGAN算法的改进在于它使用的是 Wasserstein 距离 ,也称 推土机距离(Earth Mover Distance)
W(P,Q)=infγ∼∏(P,Q)E(x,y)∼γ[∥x−y∥]W(P,Q)=\inf_{\gamma \sim \prod(P,Q)} E_{(x,y) \sim \gamma}[|x-y|]
3 DCGAN
使用卷积神经网络的GAN。
4 ALI(Adversarially Learned Inference)
将生成网络和推断网络一起放到 GANs 的框架下,进而联合训练生成模型和推断模型。
5 IRGAN(Information Retrieval GAN)
利用 GANs 框架生成离散样本数据
6 SeqGAN(Sequence GAN)
利用 GANs 框架生成文本序列
