AIGC入门之生成对抗网络


✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨

🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。

我是Srlua小谢,在这里我会分享我的知识和经验。🎥

希望在这里,我们能一起探索IT世界的奥妙,提升我们的技能。🔮

记得先点赞👍后阅读哦~ 👏👏

📘📚 所属专栏:传知代码论文复现

欢迎访问我的主页:Srlua小谢 获取更多信息和资源。✨✨🌙🌙

​​

​​

目录

1. GAN

2 GAN的优化函数

2.1 判别器D

2.2 生成器G

2.3 互相博弈

3 训练过程

4 在看优化

4.1 D的最优解

4.2 G的最优解

5. 主要代码结构

5.1 模型结构(以DCGAN为例)

5.2 训练代码(以DCGAN为例)

5.3 生成结果


  本文所有资源均可在该地址处获取。

1. GAN

原始论文:https://arxiv.org/abs/1406.2661
放一张GAN的结构,如下:我们有两个网络,生成网络G和判别网络D。生成网络接收一个(符合简单分布如高斯分布或者均匀分布的)随机噪声输入,通过这个噪声输出图片,记做G(z)。判别网络的输入是x,x代表一张图片,输出D(x)代表x为真实图片的概率。最终的目的式能够生成一个以假乱真的图片,使D无法判别真假,D存在的意义是不断去督促G生成的质量

先拿出论文中的优化公式,后面在详解由来。

minGmaxDV(G,D)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]Gmin​Dmax​V(G,D)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]

这里pdata(x)pdata​(x) 表示真实数据的分布,z是生成器G输入的噪声, pz(z)pz​(z)是噪声的分布,乍一看这个公式是不是很难理解。没关系,接下来,我们慢慢分析由来。

2 GAN的优化函数

2.1 判别器D

我们先看判别器D,作用是能够对真实数据x∼ pdata(x)x∼ pdata​(x)其能够准确分辨是真,对生成的假数据G(z)能够分辨是假,那么实际上这就是一个二分类的逻辑回归问题,还记得交叉熵吗?没错这也等价于交叉熵,只不过交叉熵是负对数,优化最小交叉熵必然等价于优化以下最大值:

maxDV(G,D)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]Dmax​V(G,D)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]

看过我前面写的熵的问题,公式由来很容易懂。我们现在单独从公式来看,这个函数要想取得最大值,必然当真实数据来的时候D(x)=1,当假数据G(z)来的时候D(x)=0。这也满足我们的初衷:能够分辨真假。实际上是一个二分类。
这一步目标是优化D,G是固定的不做优化,G为上一次迭代优化后的结果,因此可简写成:

DG∗=maxDV(G,D)DG∗​=Dmax​V(G,D)

2.2 生成器G

在来看看生成器,对于生成器来说,我不想判别器D能够识别我是真假,我希望判别器识别不出来最好,理想极端情况下:D(x)=0,D(G(z))=1,也就是真的识别成假,假的识别成真。反应在优化函数上就是,是不是很好理解了

minG=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]Gmin​=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]

当理想情况下D(x)=0,D(G(z))=1,必然是最小值优化。
同样这一步优化是优化G,D不做优化,D为上一次迭代优化后的结果,因此可简写成:

GD∗=minGV(G,D)GD∗​=Gmin​V(G,D)

2.3 互相博弈

作者习惯上把分开的两个优化写道一起,就变成了我们最初看到的论文中的公式:

minGmaxDV(G,D)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]Gmin​Dmax​V(G,D)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]

但是实际上,D和G在迭代过程中是分开优化的。
上面说了,我生成器又要能够准确判断真假,又要不能够判断,作为判别器他说他好难啊,怎么办呢,干脆判别器最终输出0.5,这也是理想优化结果,谁也不偏向。这也是整个GAN优化的终极目的。

3 训练过程


对于判别器D优化,因为这是个二分类,ylogq + (1-y)log(1-q):对于x,标签只会为1,因此只有log(D(x))这一项;对于g(z),其标签只会为0,因此只有log(1-D(G(z)))这一项,在损失函数上,$$loss=crossEntryLoss(D(x),1) + crossEntryLoss(D(G(z)),0)$$
对于生成器G优化:因为D(x)这一项,并不包含生成器的优化参数,因此在求梯度的时候D(x)这一项为0,因此只有log(1-D(G(z)))这一项,损失函数:$$ loss=crossEntryLoss(D(G(z)),1)$$

4 在看优化

4.1 D的最优解

还记得完美的优化结果是D=0.5吗?这到底是怎么来的呢。我们先看一下对于D的优化,去求D的最优解

maxDV(G,D)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]Dmax​V(G,D)=Ex∼pdata​(x)​[logD(x)]+Ez∼pz​(z)​[log(1−D(G(z)))]

写成积分形式:不知道怎么来的可以补一下概率论均值的计算。

maxDV(G,D)=∫xpdata(x)logD(x)dx+∫xpz(z)log(1−D(g(z)))dzDmax​V(G,D)=∫x​pdata​(x)logD(x)dx+∫x​pz​(z)log(1−D(g(z)))dz

我们考虑在优化D的时候G是不变的,并且假设,通过G生成的g(z)满足的分布为pgpg​,因此上式子可写为:

maxDV(G,D)=∫xpdata(x)logD(x)+pg(x)log(1−D(x)dxDmax​V(G,D)=∫x​pdata​(x)logD(x)+pg​(x)log(1−D(x)dx

上式什么时候取得最大结果呢,alog(y)+blog(1

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值