GAN网络之入门教程(二)之GAN原理

在一篇博客GAN网络从入门教程(一)之GAN网络介绍中,简单的对GAN网络进行了一些介绍,介绍了其是什么,然后大概的流程是什么。

在这篇博客中,主要是介绍其数学公式,以及其算法流程。当然数学公式只是简单的介绍,并不会设计很复杂的公式推导。如果想详细的了解GAN网络的原理,推荐去看李宏毅老师的课程。B站和Youtube上面都有。

概率分布

生成器

首先我们是可以知道真实图片的分布函数pdata(x),同时我们把假的图片也看成一个概率分布,称之为pg=(x,θ)。那么我们的目标是什么呢?我们的目标就是使得pg(x,θ)尽量的去逼近pdata(x)。在GAN中,我们使用神经网络去逼近pg=(x,θ)

在生成器中,我们有如下模型:

其中zPz(z),因此G(z)也是一个针对于z概率密度分布函数。

判别器

针对于判别器,我们有D(x,θ),其代表某一张z图片x为真的概率。

目标函数

Generative Adversarial Nets论文中给出了以下的目标函数,也就是GAN网络需要优化的东西。

(1)minGmaxDV(D,G)=Expdata (x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

公式看起来很复杂,但是我们分开来看还是比较简单的。

D

D网络的目标是什么?能够辨别真假,也就是说,给定一张真的图片xD网络能够给出一个高分,也就是D(x)尽量大一点。而针对于生成器G生成的图片G(z),我们希望判别器D尽量给低分,也就是D(G(z))尽量的小一点。因此D网络的目标函数如下所示:

(2)maxDV(D,G)=Expdata (x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

在目标函数中,x代表的是真实数据(也就是真的图片),G(z)代表的是生成器生成的图片。

G

G网络的目标就是使得D(G(z))尽量得高分,因此其目标函数可以写成:

(3)maxGV(D,G)=Ezpz(z)[log(D(G(z)))]

D(G(z))尽量得高分(分数在[0,1]之间),等价于1D(G(z))尽量的低分,因此,上述目标函数等价于:

(4)minGV(D,G)=Ezpz(z)[log(1D(G(z)))]

因此我们优化D和优化G结合起来,也就是变成了论文中的目标函数:

(5)minGmaxDV(D,G)=Expdata (x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

证明存在全局最优解

上面的公式看起来很合理,但是如果不存在最优解的话,一切也都是无用功。

D最优解

首先,我们固定G,来优化D,目标函数为:

V(G,D)=Expdata (x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

我们可以写做:

(6)V(G,D)=xpdata (x)log(D(x))dx+zpz(z)log(1D(g(z)))dz=x[pdata (x)log(D(x))+pg(x)log(1D(x))]dx

我们设(D代表D(x),可以代表任何函数):

f(D)=Pdata(x)logD+PG(x)log(1D)

对于每一个固定的x而言,为了使V最大,我们当然是希望f(D)越大越好,这样积分后的值也就越大。因为固定了G,因此pg(x)是固定的,而Pdata是客观存在的,则值也是固定的。我们对f(D)求导,然后令f(D)=0,可得:

(7)D=Pdata(x)Pdata(x)+PG(x)

下图表示了,给定三个不同的 G1G3G3 分别求得的令 V(G,D)最大的那个$ D^∗P_{data}$,蓝色曲线代表了可能的 PG,绿色的距离代表了 V(G,D)

G最优解

同理,我们可以求maxD V(G,D),我们将前面的得到的D=Pdata(x)Pdata(x)+PG(x)带入可得:

(8)minD V(G,D)(9)=V(G,D)(10)=ExPdata[ log D(x) ]+ExPG[ log (1D(x)) ](11)=ExPdata[ log Pdata(x)Pdata(x)+PG(x) ]+ExPG[ log PG(x)Pdata(x)+PG(x) ](12)=xPdata(x)logPdata(x)Pdata(x)+PG(x)dx+xPG(x)log(PG(x)Pdata(x)+PG(x))dx(13)=xPdata(x)log12Pdata(x)Pdata(x)+PG(x)2dx+xPG(x)log12PG(x)Pdata(x)+PG(x)2dx(14)=xPdata(x)(log12+logPdata(x)Pdata(x)+PG(x)2)dx(15)                     +xPG(x)(log12+logPG(x)Pdata(x)+PG(x)2)dx(16)=xPdata(x)log12dx+xPdata(x)logPdata(x)Pdata(x)+PG(x)2dx(17)                     +xPG(x)log12dx+xPG(x)logPG(x)Pdata(x)+PG(x)2dx(18)=2log12+xPdata(x)logPdata(x)Pdata(x)+PG(x)2dx+xPG(x)logPG(x)Pdata(x)+PG(x)2dx(19)=2log12+2×[12KL(Pdata(x)||Pdata(x)+PG(x)2)](20)                     +2×[12KL(PG(x)||Pdata(x)+PG(x)2)](21)=2log2+2JSD(Pdata(x)||PG(x))

其中JSD(Pdata(x)||PG(x))的取值范围是从 0log2,其中当Pdata=PG是,JSD取最小值0。也就是说V(G,D)的取值范围是02log2,也就是说$ V(G,D)P_{data} = P_G$。

算法流程

上述我们从理论上讨论了全局最优值的可行性,但实际上样本空间是无穷大的,也就是我们没办法获得它的真实期望(Expdata (x)Ezpz(z)是未知的),因此我们使用估测的方法来进行。

V~=1mi=1mlogD(xi)+1mi=1mlog(1D(x~i))

算法流程图如下所示(来自生成对抗网络——原理解释和数学推导):

总结

上述便是GAN网络的数学原理,以及推导流程还有算法。我也是刚开始学,参考了如下的博客,其中生成对抗网络——原理解释和数学推导非常值得一看,里面非常详细的对GAN进行了推导,同时,bilibili——【机器学习】白板推导系列(三十一) ~ 生成对抗网络(GAN)中的视频也不错,手把手白板的对公式进行了推导。如有任何问题,或文章有任何错误,欢迎在评论区下方留言。

参考

posted @   渣渣辉啊  阅读(4436)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示