译:《生成对抗网络(GAN)》
论文地址:《Generative Adversarial Nets》
Motivation
如今,深度学习中最引人注目的涉及到判别模型的,通常是那些将高维、丰富的感官输入映射到类标签上的模型。并且这些成功主要是基于反向传播和dropout算法,使用具有特别良好的梯度分段线性单元。而在深度生成模型上则还表现较差,因为在最大化似然函数时,需要对概率分布进行很多近似,这些近似带来了很大的计算困难。
而这篇文章提出的方法则不再去做这些近似了,而是用其它方法得到一个计算上更好的模型。
方法简介
论文提出生成对抗网络,其中生成模型可以类比造假团伙,他们需要制造假币并在不被发现的情况下使用,而判别模型则类比警察,需要检测假币。这个游戏中的竞争使得两队都不断改进它们的方法,直到假币和真币无法区分。
对抗网络
对抗模型最简单的情况就是当生成模型和判别模型都是多层感知机时,生成模型的任务是要在数据\(x\)上学习分布\(p_g\),在输入的噪音变量\(z\)上定义先验分布\(p_z(z)\),则生成模型可以表示为\(G(z;\theta_g)\),\(\theta_g\)表示可学习的参数,换句话说就是:生成模型就是输入为\(z\),输出为目标结果(如一张图片),学习参数为\(\theta_g\)的MLP。而判别模型则可以表示为\(D(x;\theta_d)\),其中的\(x\)表示的是与生成模型输出类似的(如一张图片),输出则是一个标量,用于判断输入\(x\)是采样训练数据中的还是生成器生成的。
然后在训练\(D\)的同时也会训练\(G\),\(G\)用来最小化\(\log (1-D(G(z)))\)
对于\(\log (1-D(G(z)))\),\(G(z)\)表示生成的图片,如果\(D\)判断正确,则\(D(G(z))\)会等于\(0\),那么结果就是\(\log (1-0)=0\);反之\(\log (1-大于等于0小于1的数)=[-\infty, 0)\)
总而言之,需要训练两个模型,\(G\)和\(D\),而目标函数则是: \[ \min_G \max_D V(D, G) = \mathbb E_{x\sim p_{data}(x)}[\log D(x)]+\mathbb E_{z \sim p_z(z)}[\log (1-D(G(z)))] \] 其对应的优化目标就是要使得\(D\)尽可能大的同时\(G\)近可能小。此外,在实际工作中,公式的后面一项会存在一定的问题,即:在早期时,\(G\)比较弱,生成数据和真实数据相关较远,则会很容易就将\(D\)训练的很好,就会导致\(1-D(G(z))\)变成0,这时再去求梯度,更新\(G\)则会发现无法更新,因此,论文建议在更新\(G\)时将目标函数换成最大化\(\log D(G(z))\)。
理论解
理论上,如图,真实图片是\(x\),\(G\)的输入噪音是\(z\),真实的\(x\)的分布是图中黑色虚线,生成的分布是绿色实线,蓝色虚线表示判别器\(D\),最开始\((a)\)中表现一般,在\((b)\)中更新了判别器\(D\)去尽可能将两种分布区分开,在\((c)\)中再更新生成器\(G\)使得生成的分布对应的峰值左移以误导判别器\(D\),以此类推,最后使得生成的分布与原分布一样,而判别器分辨不出两种分布了。
具体算法流程如下:
数学理论
全局最优解:\(p_g=p_{data}\)
命题1:理论上,模型存在全局最优解,即\(p_g=p_{data}\),表示\(G\)生成的数据分布和样本分布一样了,而此时: \[ D_G^*(x) = \frac{p_{data}(x)}{p_{data}(x)+p_g(x)} = \frac{1}{2} \] 证明: \[ \begin{align} E_{x\sim p}f(x) &= \int_x p(x)f(x)dx \\ V(G, D)&=\int_xp_{data}(x)\log(D(x))dx+\int_zp_z(z)\log(1-D(g(z)))dz \ (x=g(z)) \\ &=\int_xp_{data}(x)\log(D(x))+p_g(x)\log(1-D(x))dx \\ & 令y=D(x),a=p_{data}(x),b=p_g(x) \\ & 则 [a\log(y)+b\log(1-y)]'=\frac{a}{y}-\frac{b}{1-y}=0 \\ & y = \frac{a}{a+b} \end{align} \]
将关于\(D\)的最优解代回价值函数得: \[ \begin{align} C(G) & = \max_D V(G,D) \\ &= \mathbb E_{x\sim p_{data}}[\log D_G^*(x)]+\mathbb E_{z\sim p_z[\log (1-D_G^*(G(z)))]} \\ &= \mathbb E_{x\sim p_{data}}[\log D_G^*(x)]+\mathbb E_{x\sim p_g[\log (1-D_G^*(x))]} \\ &= \mathbb E_{x\sim p_{data}}[\log \frac{p_{data}(x)}{p_{data}(x)+p_g(x)}]+\mathbb E_{x\sim p_g}[\log \frac{p_g(x)}{p_{data}(x)+p_g(x)}] \end{align} \] 定理1:当且仅当\(p_g=p_{data}\)时,\(C(G)\)取得全局最小值
证明:
前置知识:KL散度 \[ KL(p||q)=E_{x\sim p} \log \frac{p(x)}{q(x)} \] 表示在知道\(p\)的情况下,至少需要多少个比特可以将\(q\)描述出来
\[ \begin{align} C(G) &= \mathbb E_{x\sim p_{data}}[\log \frac{p_{data}(x)}{p_{data}(x)+p_g(x)}]+\mathbb E_{x\sim p_g}[\log \frac{p_g(x)}{p_{data}(x)+p_g(x)}] \\ &= \mathbb E_{x\sim p_{data}}[\log \frac{p_{data}(x)}{\frac{1}{2}p_{data}(x)+p_g(x)}\frac{1}{2}]+\mathbb E_{x\sim p_g}[\log \frac{p_g(x)}{p_{data}(x)+\frac{1}{2}p_g(x)}\frac{1}{2}] \\ &= -\log(4) + KL(p_{data}||\frac{p_{data}+{p_g}}{2}) + KL(p_g||\frac{p_{data}+{p_g}}{2}) \ (此时情况也叫JS散度) \end{align} \]
由于\(KL(p||q) \ge 0\),当\(KL(p||q)=0\)的情况下,一定有\(p=q\),即: \[ p_{data} = \frac{p_{data}+{p_g}}{2} \\ p_g = \frac{p_{data}+{p_g}}{2} \\ 即:p_{data}=p_g \]
算法1的收敛
命题2:如果\(G\)和\(D\)有足够的容量,且在算法1中允许每一步\(D\)可以达到它的最优解,则如果对\(G\)的优化为:\(\mathbb E_{x\sim p_{data}}[\log D^*_G(x)]+\mathbb E_{x\sim p_g}[\log (1-D_G^*(x))]\)则最终\(p_g\)会收敛到\(p_{data}\)
证明:
将\(V(G,D)\)看成\(U(p_g, D)\)进行简单证明,则原式等于\(\mathbb E_{x\sim p_{data}}[\log D^*_G(x)]+\int p_g(x)\dots\),这是一个凸函数,而又在每一步将\(D\)求到了最优,而凸函数的上限函数还是一个凸函数,所以对其梯度下降时会得到一个最优解。