在一篇博客GAN网络从入门教程(一)之GAN网络介绍中,简单的对GAN网络进行了一些介绍,介绍了其是什么,然后大概的流程是什么。
在这篇博客中,主要是介绍其数学公式,以及其算法流程。当然数学公式只是简单的介绍,并不会设计很复杂的公式推导。如果想详细的了解GAN网络的原理,推荐去看李宏毅老师的课程。B站和Youtube上面都有。
概率分布
生成器
首先我们是可以知道真实图片的分布函数pdata(x),同时我们把假的图片也看成一个概率分布,称之为pg=(x,θ)。那么我们的目标是什么呢?我们的目标就是使得pg(x,θ)尽量的去逼近pdata(x)。在GAN中,我们使用神经网络去逼近pg=(x,θ)。
在生成器中,我们有如下模型:

其中z∼Pz(z),因此G(z)也是一个针对于z概率密度分布函数。
判别器
针对于判别器,我们有D(x,θ),其代表某一张z图片x为真的概率。
目标函数
在Generative Adversarial Nets论文中给出了以下的目标函数,也就是GAN网络需要优化的东西。
minGmaxDV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](1)
公式看起来很复杂,但是我们分开来看还是比较简单的。
D∗
D网络的目标是什么?能够辨别真假,也就是说,给定一张真的图片x,D网络能够给出一个高分,也就是D(x)尽量大一点。而针对于生成器G生成的图片G(z),我们希望判别器D尽量给低分,也就是D(G(z))尽量的小一点。因此D网络的目标函数如下所示:
maxDV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](2)
在目标函数中,x代表的是真实数据(也就是真的图片),G(z)代表的是生成器生成的图片。
G∗
G网络的目标就是使得D(G(z))尽量得高分,因此其目标函数可以写成:
maxGV(D,G)=Ez∼pz(z)[log(D(G(z)))](3)
D(G(z))尽量得高分(分数在[0,1]之间),等价于1−D(G(z))尽量的低分,因此,上述目标函数等价于:
minGV(D,G)=Ez∼pz(z)[log(1−D(G(z)))](4)
因此我们优化D∗和优化G∗结合起来,也就是变成了论文中的目标函数:
minGmaxDV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))](5)
证明存在全局最优解
上面的公式看起来很合理,但是如果不存在最优解的话,一切也都是无用功。
D最优解
首先,我们固定G,来优化D,目标函数为:
V(G,D)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
我们可以写做:
V(G,D)=∫xpdata (x)log(D(x))dx+∫zpz(z)log(1−D(g(z)))dz=∫x[pdata (x)log(D(x))+pg(x)log(1−D(x))]dx(6)
我们设(D代表D(x),可以代表任何函数):
f(D)=Pdata(x)logD+PG(x)log(1−D)
对于每一个固定的x而言,为了使V最大,我们当然是希望f(D)越大越好,这样积分后的值也就越大。因为固定了G,因此pg(x)是固定的,而Pdata是客观存在的,则值也是固定的。我们对f(D)求导,然后令f′(D)=0,可得:
D∗=Pdata(x)Pdata(x)+PG(x)(7)
下图表示了,给定三个不同的 G1,G3,G3 分别求得的令 V(G,D)最大的那个$ D^∗,横轴代表了P_{data}$,蓝色曲线代表了可能的 PG,绿色的距离代表了 V(G,D):

G最优解
同理,我们可以求maxD V(G,D),我们将前面的得到的D∗=Pdata(x)Pdata(x)+PG(x)带入可得:
minD V(G,D)=V(G,D∗)=Ex∼Pdata[ log D∗(x) ]+Ex∼PG[ log (1−D∗(x)) ]=Ex∼Pdata[ log Pdata(x)Pdata(x)+PG(x) ]+Ex∼PG[ log PG(x)Pdata(x)+PG(x) ]=∫xPdata(x)logPdata(x)Pdata(x)+PG(x)dx+∫xPG(x)log(PG(x)Pdata(x)+PG(x))dx=∫xPdata(x)log12Pdata(x)Pdata(x)+PG(x)2dx+∫xPG(x)log12PG(x)Pdata(x)+PG(x)2dx=∫xPdata(x)⎛⎝log12+logPdata(x)Pdata(x)+PG(x)2⎞⎠dx +∫xPG(x)⎛⎝log12+logPG(x)Pdata(x)+PG(x)2⎞⎠dx=∫xPdata(x)log12dx+∫xPdata(x)logPdata(x)Pdata(x)+PG(x)2dx +∫xPG(x)log12dx+∫xPG(x)logPG(x)Pdata(x)+PG(x)2dx=2log12+∫xPdata(x)logPdata(x)Pdata(x)+PG(x)2dx+∫xPG(x)logPG(x)Pdata(x)+PG(x)2dx=2log12+2×[12KL(Pdata(x)||Pdata(x)+PG(x)2)] +2×[12KL(PG(x)||Pdata(x)+PG(x)2)]=−2log2+2JSD(Pdata(x)||PG(x))(8)(9)(10)(11)(12)(13)(14)(15)(16)(17)(18)(19)(20)(21)
其中JSD(Pdata(x)||PG(x))的取值范围是从 0到log2,其中当Pdata=PG是,JSD取最小值0。也就是说V(G,D)的取值范围是0到−2log2,也就是说$ V(G,D)存在最小值,且此时P_{data} = P_G$。
算法流程
上述我们从理论上讨论了全局最优值的可行性,但实际上样本空间是无穷大的,也就是我们没办法获得它的真实期望(Ex∼pdata (x)和Ez∼pz(z)是未知的),因此我们使用估测的方法来进行。
~V=1mm∑i=1logD(xi)+1mm∑i=1log(1−D(~xi))
算法流程图如下所示(来自生成对抗网络——原理解释和数学推导):

总结
上述便是GAN网络的数学原理,以及推导流程还有算法。我也是刚开始学,参考了如下的博客,其中生成对抗网络——原理解释和数学推导非常值得一看,里面非常详细的对GAN进行了推导,同时,bilibili——【机器学习】白板推导系列(三十一) ~ 生成对抗网络(GAN)中的视频也不错,手把手白板的对公式进行了推导。如有任何问题,或文章有任何错误,欢迎在评论区下方留言。
参考
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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代理 了,记录一下