zoukankan      html  css  js  c++  java
  • GAN网络之入门教程(二)之GAN原理

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

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

    概率分布

    生成器

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

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

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

    判别器

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

    目标函数

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

    [egin{equation}min _{G} max _{D} V(D, G)=mathbb{E}_{oldsymbol{x} sim p_{ ext {data }}(oldsymbol{x})}[log D(oldsymbol{x})]+mathbb{E}_{oldsymbol{z} sim p_{oldsymbol{z}}(oldsymbol{z})}[log (1-D(G(oldsymbol{z})))]end{equation} ]

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

    (D^*)

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

    [egin{equation}max _{D} V(D, G)=mathbb{E}_{oldsymbol{x} sim p_{ ext {data }}(oldsymbol{x})}[log D(oldsymbol{x})]+mathbb{E}_{oldsymbol{z} sim p_{oldsymbol{z}}(oldsymbol{z})}[log (1-D(G(oldsymbol{z})))]end{equation} ]

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

    (G^*)

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

    [egin{equation}max _{G} V(D, G)=mathbb{E}_{oldsymbol{z} sim p_{oldsymbol{z}}(oldsymbol{z})}[log (D(G(oldsymbol{z})))]end{equation} ]

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

    [egin{equation}min _{G} V(D, G)=mathbb{E}_{oldsymbol{z} sim p_{oldsymbol{z}}(oldsymbol{z})}[log (1-D(G(oldsymbol{z})))]end{equation} ]

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

    [egin{equation}min _{G} max _{D} V(D, G)=mathbb{E}_{oldsymbol{x} sim p_{ ext {data }}(oldsymbol{x})}[log D(oldsymbol{x})]+mathbb{E}_{oldsymbol{z} sim p_{oldsymbol{z}}(oldsymbol{z})}[log (1-D(G(oldsymbol{z})))]end{equation} ]

    证明存在全局最优解

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

    D最优解

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

    (egin{equation} V(G, D)=mathbb{E}_{oldsymbol{x} sim p_{ ext {data }}(oldsymbol{x})}[log D(oldsymbol{x})]+mathbb{E}_{oldsymbol{z} sim p_{oldsymbol{z}}(oldsymbol{z})}[log (1-D(G(oldsymbol{z})))]end{equation})

    我们可以写做:

    [egin{equation}egin{aligned} V(G, D) &=int_{oldsymbol{x}} p_{ ext {data }}(oldsymbol{x}) log (D(oldsymbol{x})) d x+int_{oldsymbol{z}} p_{oldsymbol{z}}(oldsymbol{z}) log (1-D(g(oldsymbol{z}))) d z \ &=int_{oldsymbol{x}} [ p_{ ext {data }}(oldsymbol{x}) log (D(oldsymbol{x}))+p_{g}(oldsymbol{x}) log (1-D(oldsymbol{x}))] d x end{aligned}end{equation} ]

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

    [f(D) = P_{data}(x) log D + P_G(x)log(1-D) ]

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

    [egin{equation}D^{*}=frac{P_{d a t a}(x)}{P_{d a t a}(x)+P_{G}(x)}end{equation} ]

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

    G最优解

    同理,我们可以求(underset{D}{max} V(G,D)),我们将前面的得到的(D^{*}=frac{P_{d a t a}(x)}{P_{d a t a}(x)+P_{G}(x)})带入可得:

    [% <![CDATA[ egin{align} & underset{D}{min} V(G,D) \ & = V(G,D^{* })\ & = E_{x sim P_{data} } left [ log D^{* }(x) ight ] + E_{x sim P_{G} } left [ log (1-D^{* }(x)) ight ] \ & = E_{x sim P_{data} } left [ log frac{P_{data}(x)}{P_{data}(x)+P_G(x)} ight ] + E_{x sim P_{G} } left [ log frac{P_{G}(x)}{P_{data}(x)+P_G(x)} ight ]\ & = int_{x} P_{data}(x) log frac{P_{data}(x)}{P_{data}(x)+P_G(x)} dx+ int_{x} P_G(x)log(frac{P_{G}(x)}{P_{data}(x)+P_G(x)})dx \ & = int_{x} P_{data}(x) log frac{frac{1}{2}P_{data}(x)}{frac{P_{data}(x)+P_G(x)}{2} } dx+ int_{x} P_{G}(x) log frac{frac{1}{2}P_{G}(x)}{frac{P_{data}(x)+P_G(x)}{2} } dx \ & = int_{x}P_{data}(x)left ( log frac{1}{2}+log frac{P_{data}(x)}{frac{P_{data}(x)+P_G(x)}{2} } ight ) dx \ & + int_{x}P_{G}(x)left ( log frac{1}{2}+log frac{P_{G}(x)}{frac{P_{data}(x)+P_G(x)}{2} } ight ) dx \ & = int_{x}P_{data}(x) log frac{1}{2} dx + int_{x}P_{data}(x) log frac{P_{data}(x)}{frac{P_{data}(x)+P_G(x)}{2} } dx \ & + int_{x}P_{G}(x) log frac{1}{2} dx + int_{x}P_{G}(x) log frac{P_{G}(x)}{frac{P_{data}(x)+P_G(x)}{2} } dx \ & = 2 log frac{1}{2} + int_{x}P_{data}(x) log frac{P_{data}(x)}{frac{P_{data}(x)+P_G(x)}{2} } dx + int_{x}P_{G}(x) log frac{P_{G}(x)}{frac{P_{data}(x)+P_G(x)}{2} } dx\ & = 2 log frac{1}{2} + 2 imes left [ frac{1}{2} KLleft( P_{data}(x) || frac{P_{data}(x)+P_{G}(x)}{2} ight ) ight ] \ & + 2 imes left [ frac{1}{2} KLleft( P_{G}(x) || frac{P_{data}(x)+P_{G}(x)}{2} ight ) ight ] \ & = -2 log 2 + 2 JSD left ( P_{data}(x) || P_G(x) ight) end{align} %]]> ]

    其中(JSD ( P_{data}(x) || P_G(x)))的取值范围是从 (0)(log2),其中当(P_{data} = P_G)是,(JSD)取最小值0。也就是说$ V(G,D)$的取值范围是(0)(-2log2),也就是说$ V(G,D)(存在最小值,且此时)P_{data} = P_G$。

    算法流程

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

    [ ilde V = frac{1}{m}sum_{i=1}^{m} log D(x^i) + frac{1}{m}sum_{i=1}^{m} log (1-D( ilde x^i)) ]

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

    总结

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

    参考

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/xiaohuiduan/p/13246139.html
Copyright © 2011-2022 走看看