对抗生成网络GAN

GAN简介#

论文:Generative Adversarial Nets

参考资料:


对抗生成网络 GAN 的英文全称为 Generative Adversarial Network,

  • 生成器(Generator, G

    • Generator是一个函数,输入是随机向量(随机噪声)z,输出是 x
  • 判别器(Discriminator, D

    • Discriminator也是一个函数,输入是 x,输出是一个标量;

GAN的训练流程#

我们需要借助一个高水平的判别器来训练我们的生成器,举个不恰当的例子,比如我们是做工艺品的,我们期望的目标是制造出的工艺品能够达到以假乱真的地步,这个时候我们需要一个鉴赏专家来告诉我们,我们制造出的工艺品是否逼真,因为专家给我们的反馈是十分重要的,我们可以借助专家给我们的反馈信息,来提升自己的工艺技术

那么我们如何训练判别器呢?事实上,我们从上帝视角来看,其实我们是知道哪些是真的,哪些是假的,所以我们可以直接将古董和工艺品混合在一起,去给鉴赏专家,告诉鉴赏专家哪些是真的,哪些是假的,让鉴赏专家从带标签的样本中去学习、去提升鉴别能力。

判别器的学习#

首先我们初始化生成器 G ,然后输入一组随机向量(Randomly sample a vactor),生成器会根据输入的向量产生一些图片,我们把这些图片标注成 0(假图片)。同时把已有训练集中真实的图片标注成 1(真图片)。两者同时丢进判别器 D 中,以此来训练判别器 D 。使得当输入是真图片的时候,判别器给高分(分数接近于1),而输入假图片的时候,判别器给低分(接近于0)。

此时,我们便可以用监督学习的方式来对判别器进行训练。

生成器的学习#

针对于 D 我们有标记为10的数据,因此我们可以对其进行训练。那么对于生成器,有 x(也就是随机噪声 z),那么他的标签 y 在哪里呢?

事实上,我们在训练生成器的时候可以做出假设“判别器能够做出准确可靠的判断”,在这个假设下,我们可以通过判别器来产生生成器的标签 y

  1. 我们通过随机向量(噪声数据)经由生成网络产生一组假图片,我们将这些假图片都标记为 1(也就是说,人为的把假的图片当作真实的);

  2. 将这些假图片输入到判别器中,判别器在对这些图片进行判别的时候,会发现这些图片是假的图片,然后给出低分,这样就产生了误差(因为标记的为1,但是判别器给了低分);

  3. 由于在训练生成器的时候,这个网络是串接的,所以一个很重要的操作就是保持判别器网络的参数不发生改变,只是把误差一直方向传播,传到生成网络那块后更新生成网络的参数,这样就完成了生成网络的训练了。

在完成生成器的训练之后,我们又可以产生新的假的图片去对判别器进行训练。我们把这个过程称作为单独交替训练。同时要定义一个迭代次数,交替迭代到一定次数后停止即可。

数学表示#

  1. 我们有一组含有 n 个样本的数据集 X={x(1),x(2),,x(n)},假设这些样本数据从一个概率分布 Pdata中产生;

  2. 假设 G 的概率分布为 Pg(x;θg),实际上我们所生成的样本也是从这个概率分布中抽样而得出的;

  3. 假定噪声 z 从一个简单的分布中产生(如高斯分布),即 zPz(z)

  4. 我们将判别器认为 x 是真样本的概率记为 D(X;θd)

需要注意的是:

  1. 我们不对生成器 G 的概率分布 Pg 进行建模,而是使用神经网络来逼近生成器 G 的概率分布 Pg

  2. 我们有 zG(Z;θg)x ,其中 z 是输入噪声, G(Z;θg)生成器的神经网络,x 是生成的样本;

判别器#

我们所希望判别器 D 能达到的效果是:

{D(x),if x is from pdata(1D(G(z))),if x is from pg

为了方便计算,我们将上式进行改写:

{logD(x),if x is from pdatalog(1D(G(z))),if x is from pg

所以,判别器的目标函数为:

maxDExpdata[logD(x)]+Ezpz[log(1D(G(z)))]

为了便于初学者理解,这里说明一下 Expdata[f(x)] 所代表的含义:Expdata[f(x)]=1Ni=1Nf(xi),xipdata

生成器#

我们所希望生成器 G 生成的样本能够使判别器 D 尽可能地以为是真样本,即生成器所期望达到的效果是:D(G(z)),即log(1D(G(z)))

所以,生成器 G 的目标函数为:

minGEzpz[log(1D(G(z)))]

综上所述,总目标为:

minGmaxDExpdata[logD(x)]+Ezpz[log(1D(G(z)))]

算法推导#

在开始进行推导之前,我们介绍一下传统的生成器(这里除去GAN)方法:

首先再次明确一下我们的目标:我们所期望生成器生成的样本尽可能逼真,换句话说,我们所期望生成器生成的样本尽可能与真实的样本相似,即:PgPdata

对于常规的生成模型(这里除去GAN)来说,我们直接将生成器 G 的概率分布进行 Pg 建模:Pg(θg) ,那么我们有:

(1)θg=argmaxθgi=1Nlogpg(xi)(2)=argminθgKL(Pdata∣∣Pg)

上式 (1) 为极大似然估计的推导,上式 (2) 为 KL 散度的推导。

我们获得参数 θg 之后,便可以得到生成器的概率分布 Pg(θg),所以生成器生成的样本可以从 Pg(θg) 中采样得到 XPg(θg)

我们记生成器的目标函数为 V(D,G)=ExPdata[logD(x)]+ExPg[log(1D(x))],那么对于固定的 G 来说

V(D,G)=xPdata(x)log(D(x))dx+xPg(x)log(1D(x))dx=x[Pdata(x)log(D(x))+Pg(x)log(1D(x))]dx

我们探讨是否存在最优的 DG使得V(DG,G)最大化,很自然地会想到对 V(D,G)D 的偏导,即:

V(D,G)D=xD[Pdata(x)log(D(x))+Pg(x)log(1D(x))]dx=x[Pdata(x)1D(x)+Pg(x)11D(x)]0DG=Pdata(x)Pdata(x)+Pg(x)

所以,对于固定的 G 来说,最优的判别器 D 是:

DG(x)=Pdata(x)Pdata(x)+Pg(x)

DG 代入生成器 G 的目标函数 V(D,G),则有:

minGmaxDV(D,G)=minGV(DG,G)=minGExPdata[log(Pdata(x)Pdata(x)+Pg(x))]+ExPg[log(1Pdata(x)Pdata(x)+Pg(x))]=minGExPdata[log(Pdata(x)Pdata(x)+Pg(x))]+ExPg[log(Pg(x)Pdata(x)+Pg(x))]=minGExPdata[log(Pdata(x)[Pdata(x)+Pg(x)]/212)]+ExPg[log(Pg(x)[Pdata(x)+Pg(x)]/212)]=minGKL(Pdata(x)Pdata(x)+Pg(x)2)+KL(Pg(x)Pdata(x)+Pg(x)2)log4log4

Pdata(x)=Pg(x)=[Pdata(x)+Pg(x)]/2 时,"="成立。

所以 Pg(x)=Pg(x),此时 GG=Pdata(x)/[Pdata(x)+Pg(x)]=12

GAN目前的问题#

训练不稳定#

待更新

Model Collapse#

待更新

工程上的技巧#

待更新


如果觉得这篇文章对您有用的话,请点推荐或者关注,这对我来说是十分宝贵的鼓励!

posted @   HeyRay_Yang  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
主题色彩