GAN & WGAN Review

关于GAN的简要介绍

这部分其实是直接把草稿贴上来了,很有可能会有不少错误,组会讲的时候我是对着PDF讲的,直接纠正了却没有体现在这里,后面有时间我会去修正的。

一点背景

算了还是不讲了,有点懒。

GAN是什么

首先,GAN要解决的最基本的问题形式是:给定一个数据集,这个数据集会对应一个概率分布,我们先称作P_data,然后我们需要构建一个网络G,让这个网络学习一个概率分布P_z,使其能够根据输入的噪声z生成一个符合P_data这一分布的数据G(z),学到的概率分布我们命名为P_g。
顾名思义,Generative Adversarial Network是要包含生成和对抗两部分网络结构的。负责生成的那部分就是Generator,是要学习P_data这个部分的网络。为了学习这个P_data,我们先定义一个在输入的噪声z上的先验P_z(z),然后定义一个G,G是一个可微的函数,它有一组参数theta_g,这个函数的输出就可以表示为G(z,theta_g)。生成网络就是这个函数的一个表示。对抗那部分实际上是一个Discriminator,我们定义一个函数D,这个函数同样是可微的,它有一组参数theta_d,这个函数的输入是图像x,包括真实数据集中的图像和Generator的输出结果。它的输出表示为D(x,theta_d),含义是输入图像x是来自真实数据集的概率,或者说x是由概率分布P_data生成而不是由概率分布P_g生成的概率。Discriminator的网络就是对这个函数的一种表示。

既然是对抗网络,我们就需要让Generator学到的P_g逐渐接近P_data,同时,也需要让每次迭代后Discriminator求解D(x)的精度更高。我们可以用这样一个值函数去表示我们的优化目标。

为什么是这个函数呢?我试图去理解这个过程。首先Generator是会有极值点的,就是真实数据的概率分布P_data,这里需要证明一下 P_g==P_data 是全局最优,我们要去优化Generator使其error最小,优化Generator的目标是让P_g和P_data尽可能一致,当P_g == P_data时,Discriminator的识别能力就是1/2,也就达到了训练目标。在这里引入对数似然的原因是这样可以保证Discriminator的优化过程是可以收敛的,依旧是可以完成maximizing的过程,最简单的例子就是假设G已经完全学习到P_data的时候,G(z)==x,然后对theta_d求导可以得到d(D(x))/(D(x)dtheta_d)-(d(D(x))/((D(x)-1)dtheta_d)),显然这个函数是有极值点的,我们就可以迭代求解极值点。

那么这个迭代过程是什么样的呢?如果是两个网络同时进行梯度下降去优化参数显然是不可取的,因为涉及到两个独立的网络,梯度是没办法只通过求解一次梯度从Discriminator反向传播回到Generator的。所以我们可以采取以下的方法进行迭代。对于每一次迭代,首先固定Generator的参数,然后输入一组m个噪声z获得Generator的输出G(z),然后获取一组m个数据集中的图像x,先将这一组xx输入Discriminator获得D(x),再将G(z)输入Discriminator获得D(G(z)),然后根据下图的公式计算Discriminator对theta_d的梯度,然后更新theta_d。

下一步,我们固定Discriminator,然后准备一组m个噪声z,计算Generator的输出G(z),然后将这m个G(z)输入到Discriminator里,求解输出,然后求解如下图所示的对theta_g梯度,然后更新theta_g。这一步由于真实数据不是由Generator产生的,所以对theta_g梯度为0,对优化过程没有贡献,所以可以不用计算。

当然这个迭代过程也有一个trick,就是要先简单地初始化Discriminator使其足以分辨初始状态下的真实数据和生成数据。为了初始化,我们可以再一开始多执行几次迭代第一步即可。

我的感受就是GAN本质上就是生成网络和分类网络两个网络的博弈,每个网络都采取最优策略,即Generator在多次迭代中逐步生成出更加符合P_data分布的数据,Discriminator在多次迭代中逐步提高对P_g和P_data的鉴别能力。最终达到的平衡点是 P_g == P_data。

补充:关于Pg==Pdata的全局最优的证明

这一步的证明是建立在G固定的基础上,前半部分的式子是我们可以基于此推导出这个值函数会收敛在Pdata(x)/(Pg(x)+Pdata(x))的位置。有了这一条,我们可以重新定义一个函数C(G),同样是建立在G固定这一假设的基础上,那么求解C(G)等价为最大化Discriminator的问题。

定义了C(G)之后我们课可以证明全局最小出现在Pg==Pdata,并且可以得出此时C(G)==-log4。证明如下,我们可以将C(G)整理成Eq.4最后所对应的形式,然后对每一部分式子的分母除一个2,就可以展成log(1/4)+E(log(2Pdata(x)/(Pg(x)+Pdata(x))))+E(log(2Pg(x)/(Pg(x)+Pdata(x))))。进而可以整理成C(G)=-log4+KL(Pdata(x)||(Pg(x)+Pdata(x))/2)KL(Pg(x)||(Pg(x)+Pdata(x))/2)。也就是C(G)=−log4+2*JSD(Pdata||Pg)。显然在Pdata==Pg的时候取最小值-log4。全局最优得证。

补充:关于迭代算法收敛性的证明

将V(G,D)改写为关于Pg的凸函数U(Pg,D),通过说明凸函数的次导数包含了导数,等价于在给定理想的D的情况下更新相应的G对应的Pg的梯度,说明凸函数的优化过程最终能收敛到上面定理1已经证明的唯一全局最优解Pdata上。

一个实践:DCGAN

用DCNN实现的Generator和Discriminator。

一个缺陷

最初版本的GAN有一个很大的问题是训练太难,具体一点的话体现在训练时Discriminator的性能不能太好也不能太差。

原因是这样的。我们从最优判别器的一个公式入手,D(x)=Pdata(x)/(Pg(x)+Pdata(x)),我们可以这么理解,对于这个最优判别器,如果输入的是真实图像,Pg(x)=0,如果输入的是生成图像,Pdata(x)=0,当然可能存在极少数恰好在分界部分的图像,稍后会进行讨论。我们重新去看整理成JS散度形式的价值函数V(G,D)=-log4+2*JSD(Pdata||Pg),当输入的是生成图像时,JS散度为log2;输入的是真实图像时,也是log2。可能也会存在鉴别器分不清的图像,那么这些图像分布在哪呢?我们假定有一个全部的图像空间,其中我们选取的数据集是其中的一个子空间上的分布,也就是Pdata对应的分布是这个图像空间的一个低维流形,同理,Generator学到的Pg也是一个类似的低维流形。这两个流形重叠的概率甚至相交的概率其实是很小的,所以即使存在相交的情况,由于两个等维度的流形相交得到的流形测度为0,所以当处在最优鉴别器条件下时,这一部分难以区分的数据对价值函数和梯度的贡献是很小的,所以我们可以得出结论,在最优鉴别器条件下价值函数梯度为0,也就是没法进行下降。当然我们也不能拿着效果很差的鉴别器去学习,这样会使得梯度极不稳定。
以上就是原始GAN中的一个缺陷。有两个解决方案会在下文提到。

一些解决思路

第一个方法是换一个定义生成器loss的方式。其中一个方法是使用Wasserstein距离。这个距离定义如下。

Pi(Pdata,Pg)是Pdata和Pg组合起来所有可能的联合分布的集合。对于每一个可能的联合分布γ,可以从γ~(x,y)中得到真实图像x和生成图像y,并算出这对样本的距离||x-y||。所以期望为E_{(x,y)~γ}[||x-y||],然后我们在所有可能的联合分布中对这个期望取得下界,就定义为Wasserstein距离。

直观上可以把\mathbb{E}_{(x, y) \sim \gamma} [||x – y||]理解为在\gamma这个“路径规划”下把P_r这堆“沙土”挪到P_g“位置”所需的“消耗”,而W(P_r, P_g)就是“最优路径规划”下的“最小消耗”,所以才叫Earth-Mover(推土机)距离。

Wasserstein距离相比KL散度、JS散度的优越性在于,即便两个分布没有重叠,Wasserstein距离仍然能够反映它们的远近。

但是下确界是没法直接求解的,所以作者应用了一个定理把原式转换成下式。

好像应用的是Kantorovich-Rubinstein duality。

进而由于Lipchitz连续我们可以近似变换成如下形式。

根据这个式子,我们就可以构建模型了。第一点,我们只需要构建一个带参数ω的网络,然后通过多次迭代去近似sup_{||f||<=K>};第二点,我们需要暴力地把所有参数在每轮迭代更新过后限制在一个特定的范围[-c,c],就是一个简单的clip操作。到此为止,我们可以构造一个含参数w、最后一层不是非线性激活层的判别器网络fw,在限制w不超过某个范围的条件下,使得L=E{x~Pdata}[fw(x)]-E{x~Pg}[fw(x)]。尽可能取到最大,此时L就会近似真实分布与生成分布之间的Wasserstein距离(忽略常数倍数K)。注意原始GAN的判别器做的是真假二分类任务,所以最后一层是sigmoid,但是现在WGAN中的判别器fw做的是近似拟合Wasserstein距离,属于回归任务,所以要把最后一层的sigmoid拿掉。
接下来生成器要近似地最小化Wasserstein距离,可以最小化L,由于Wasserstein距离的优良性质,我们不需要担心生成器梯度消失的问题。再考虑到L的第一项与生成器无关,就得到了WGAN的两个loss,分别是-E{x~Pg}[fw(x)]和-E{x~Pdata}[fw(x)]+E{x~Pg}[fw(x)]。

补充:Lipchitz连续

Lipchitz连续其实就是在一个连续函数f上面额外施加了一个限制,要求存在一个常数K>=0,使得定义域内的任意两个元素x1和x2都满足|f(x1)-f(x2)|<=K|x1-x2|,也就是任意函数定义域上任意两点斜率有界。

我自己做过的实验

WGAN,使用CIFAR-10数据集进行的实验,关注的是不同迭代次数下生成图片的主观效果。

另外我自己写了一个稍微改动一下的,加入了几个Kernel大小为3*3,步长为1的卷积层用于增强拟合效果,然后用在了一个动漫头像数据集上。效果也还好。

发表评论

电子邮件地址不会被公开。

This site uses Akismet to reduce spam. Learn how your comment data is processed.