在看这一篇文章之前,希望熟悉掌握熵的知识,可看我写的跟熵相关的一篇博客https://blog.csdn.net/m0_59156726/article/details/138128622
1. GAN
原始论文:https://arxiv.org/pdf/1406.2661.pdf
 放一张GAN的结构,如下:我们有两个网络,生成网络G和判别网络D。生成网络接收一个(符合简单分布如高斯分布或者均匀分布的)随机噪声输入,通过这个噪声输出图片,记做G(z)。判别网络的输入是x,x代表一张图片,输出D(x)代表x为真实图片的概率。最终的目的式能够生成一个以假乱真的图片,使D无法判别真假,D存在的意义是不断去督促G生成的质量

先拿出论文中的优化公式,后面在详解由来。
  
      
       
        
         
          
           
           
             m 
            
           
             i 
            
           
             n 
            
           
          
            G 
           
          
         
         
          
           
           
             m 
            
           
             a 
            
           
             x 
            
           
          
            D 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
          = 
         
         
         
           E 
          
          
          
            x 
           
          
            ∼ 
           
           
           
             p 
            
            
            
              d 
             
            
              a 
             
            
              t 
             
            
              a 
             
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          ] 
         
        
          + 
         
         
         
           E 
          
          
          
            z 
           
          
            ∼ 
           
           
           
             p 
            
           
             z 
            
           
          
            ( 
           
          
            z 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          D 
         
        
          ( 
         
        
          G 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
          ] 
         
        
       
         \underset{G}{min} \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] 
        
       
     GminDmaxV(G,D)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
 这里 
     
      
       
        
        
          p 
         
         
         
           d 
          
         
           a 
          
         
           t 
          
         
           a 
          
         
        
       
         ( 
        
       
         x 
        
       
         ) 
        
       
      
        p_{data}(x) 
       
      
    pdata(x) 表示真实数据的分布,z是生成器G输入的噪声,  
     
      
       
        
        
          p 
         
        
          z 
         
        
       
         ( 
        
       
         z 
        
       
         ) 
        
       
      
        p_{z}(z) 
       
      
    pz(z)是噪声的分布,乍一看这个公式是不是很难理解。没关系,接下来,我们慢慢分析由来。
2 GAN的优化函数
2.1 判别器D
我们先看判别器D,作用是能够对真实数据 
     
      
       
       
         x 
        
       
         ∼ 
        
       
           
        
        
        
          p 
         
         
         
           d 
          
         
           a 
          
         
           t 
          
         
           a 
          
         
        
       
         ( 
        
       
         x 
        
       
         ) 
        
       
      
        x\sim~p_{data}(x) 
       
      
    x∼ pdata(x)其能够准确分辨是真,对生成的假数据G(z)能够分辨是假,那么实际上这就是一个二分类的逻辑回归问题,还记得交叉熵吗?没错这也等价于交叉熵,只不过交叉熵是负对数,优化最小交叉熵必然等价于优化以下最大值:
  
      
       
        
         
          
           
           
             m 
            
           
             a 
            
           
             x 
            
           
          
            D 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
          = 
         
         
         
           E 
          
          
          
            x 
           
          
            ∼ 
           
           
           
             p 
            
            
            
              d 
             
            
              a 
             
            
              t 
             
            
              a 
             
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          ] 
         
        
          + 
         
         
         
           E 
          
          
          
            z 
           
          
            ∼ 
           
           
           
             p 
            
           
             z 
            
           
          
            ( 
           
          
            z 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          D 
         
        
          ( 
         
        
          G 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
          ] 
         
        
       
         \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] 
        
       
     DmaxV(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为上一次迭代优化后的结果,因此可简写成:
  
      
       
        
         
         
           D 
          
         
           G 
          
         
           ∗ 
          
         
        
          = 
         
         
          
           
           
             m 
            
           
             a 
            
           
             x 
            
           
          
            D 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
       
         D_G^*= \underset{D}{max}V(G,D) 
        
       
     DG∗=DmaxV(G,D)
2.2 生成器G
在来看看生成器,对于生成器来说,我不想判别器D能够识别我是真假,我希望判别器识别不出来最好,理想极端情况下:D(x)=0,D(G(z))=1,也就是真的识别成假,假的识别成真。反应在优化函数上就是,是不是很好理解了
  
      
       
        
         
          
           
           
             m 
            
           
             i 
            
           
             n 
            
           
          
            G 
           
          
         
        
          = 
         
         
         
           E 
          
          
          
            x 
           
          
            ∼ 
           
           
           
             p 
            
            
            
              d 
             
            
              a 
             
            
              t 
             
            
              a 
             
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          ] 
         
        
          + 
         
         
         
           E 
          
          
          
            z 
           
          
            ∼ 
           
           
           
             p 
            
           
             z 
            
           
          
            ( 
           
          
            z 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          D 
         
        
          ( 
         
        
          G 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
          ] 
         
        
       
         \underset{G}{min} = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(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为上一次迭代优化后的结果,因此可简写成:
  
      
       
        
         
         
           G 
          
         
           D 
          
         
           ∗ 
          
         
        
          = 
         
         
          
           
           
             m 
            
           
             i 
            
           
             n 
            
           
          
            G 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
       
         G_D^*= \underset{G}{min}V(G,D) 
        
       
     GD∗=GminV(G,D)
2.3 互相博弈
3 训练过程

 对于判别器D优化,因为这是个二分类,ylogq + (1-y)log(1-q):对于x,标签只会为1,因此只有log(D(x))这一项;对于g(z),其标签只会为0,因此只有log(1-D(G(z)))这一项,在损失函数上, 
      
       
        
        
          l 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          = 
         
        
          c 
         
        
          r 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          E 
         
        
          n 
         
        
          t 
         
        
          r 
         
        
          y 
         
        
          L 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          ( 
         
        
          1 
         
        
          , 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          ) 
         
        
          + 
         
        
          c 
         
        
          r 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          E 
         
        
          n 
         
        
          t 
         
        
          r 
         
        
          y 
         
        
          L 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          ( 
         
        
          0 
         
        
          , 
         
        
          D 
         
        
          ( 
         
        
          G 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
       
         loss=crossEntryLoss(1,D(x)) + crossEntryLoss(0,D(G(z))) 
        
       
     loss=crossEntryLoss(1,D(x))+crossEntryLoss(0,D(G(z)))
 对于生成器G优化:因为D(x)这一项,并不包含生成器的优化参数,因此在求梯度的时候D(x)这一项为0,因此只有log(1-D(G(z)))这一项,损失函数: 
      
       
        
        
          l 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          = 
         
        
          c 
         
        
          r 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          E 
         
        
          n 
         
        
          t 
         
        
          r 
         
        
          y 
         
        
          L 
         
        
          o 
         
        
          s 
         
        
          s 
         
        
          ( 
         
        
          1 
         
        
          , 
         
        
          D 
         
        
          ( 
         
        
          G 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
       
         loss=crossEntryLoss(1,D(G(z))) 
        
       
     loss=crossEntryLoss(1,D(G(z)))
4 在看优化
4.1 D的最优解
还记得完美的优化结果是D=0.5吗?这到底是怎么来的呢。我们先看一下对于D的优化,去求D的最优解
 
      
       
        
         
          
           
           
             m 
            
           
             a 
            
           
             x 
            
           
          
            D 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
          = 
         
         
         
           E 
          
          
          
            x 
           
          
            ∼ 
           
           
           
             p 
            
            
            
              d 
             
            
              a 
             
            
              t 
             
            
              a 
             
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          ] 
         
        
          + 
         
         
         
           E 
          
          
          
            z 
           
          
            ∼ 
           
           
           
             p 
            
           
             z 
            
           
          
            ( 
           
          
            z 
           
          
            ) 
           
          
         
        
          [ 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          D 
         
        
          ( 
         
        
          G 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
          ] 
         
        
       
         \underset{D}{max}V(G,D) = E_{x\sim p_{data}(x)}[logD(x)] + E_{z\sim p_{z}(z)}[log(1 - D(G(z)))] 
        
       
     DmaxV(G,D)=Ex∼pdata(x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
 写成积分形式:不知道怎么来的可以补一下概率论均值的计算。
  
      
       
        
         
          
           
           
             m 
            
           
             a 
            
           
             x 
            
           
          
            D 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
          = 
         
         
         
           ∫ 
          
         
           x 
          
         
         
         
           p 
          
          
          
            d 
           
          
            a 
           
          
            t 
           
          
            a 
           
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          d 
         
        
          x 
         
        
          + 
         
         
         
           ∫ 
          
         
           x 
          
         
         
         
           p 
          
         
           z 
          
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          D 
         
        
          ( 
         
        
          g 
         
        
          ( 
         
        
          z 
         
        
          ) 
         
        
          ) 
         
        
          ) 
         
        
          d 
         
        
          z 
         
        
       
         \underset{D}{max}V(G,D) = \int_{x}p_{data}(x)logD(x)dx + \int_{x}p_{z}(z)log(1-D(g(z)))dz 
        
       
     DmaxV(G,D)=∫xpdata(x)logD(x)dx+∫xpz(z)log(1−D(g(z)))dz
 我们考虑在优化D的时候G是不变的,并且假设,通过G生成的g(z)满足的分布为 
     
      
       
        
        
          p 
         
        
          g 
         
        
       
      
        p_g 
       
      
    pg,因此上式子可写为:
  
      
       
        
         
          
           
           
             m 
            
           
             a 
            
           
             x 
            
           
          
            D 
           
          
         
        
          V 
         
        
          ( 
         
        
          G 
         
        
          , 
         
        
          D 
         
        
          ) 
         
        
          = 
         
         
         
           ∫ 
          
         
           x 
          
         
         
         
           p 
          
          
          
            d 
           
          
            a 
           
          
            t 
           
          
            a 
           
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          + 
         
         
         
           p 
          
         
           g 
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          l 
         
        
          o 
         
        
          g 
         
        
          ( 
         
        
          1 
         
        
          − 
         
        
          D 
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          d 
         
        
          x 
         
        
       
         \underset{D}{max}V(G,D) = \int_{x}p_{data}(x)logD(x) + p_{g}(x)log(1-D(x)dx 
        
       
     DmaxV(G,D)=∫xpdata(x)logD(x)+pg(x)log(1−D(x)dx
 上式什么时候取得最大结果呢, 
     
      
       
       
         a 
        
       
         l 
        
       
         o 
        
       
         g 
        
       
         ( 
        
       
         y 
        
       
         ) 
        
       
         + 
        
       
         b 
        
       
         l 
        
       
         o 
        
       
         g 
        
       
         ( 
        
       
         1 
        
       
         − 
        
       
         y 
        
       
         ) 
        
       
      
        alog(y) + blog(1-y) 
       
      
    alog(y)+blog(1−y)在[0,1]上最大值是y=a/(a+b),因此上式最大值是
 
      
       
        
         
         
           D 
          
         
           G 
          
         
           ∗ 
          
         
        
          ( 
         
        
          x 
         
        
          ) 
         
        
          = 
         
         
          
           
           
             p 
            
            
            
              d 
             
            
              a 
             
            
              t 
             
            
              a 
             
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
          
           
           
             p 
            
            
            
              d 
             
            
              a 
             
            
              t 
             
            
              a 
             
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
            + 
           
           
           
             p 
            
           
             g 
            
           
          
            ( 
           
          
            x 
           
          
            ) 
           
          
         
        
       
         D_G^*(x)= \cfrac{p_{data}(x)}{p_{data}(x)+p_g(x)} 
        
       
     DG∗(x)=pdata(x)+pg(x)pdata(x)
 以上我们得到D的最优解,但是别忘了,我们目标是G能够生成的分布pg能和pdata一致,让D真假难辨,那么此时pg = pdata,D=0.5,判别器已经模棱两可了。然而这一结果只是我们的猜测。
4.2 G的最优解
备注
参考:
 https://blog.csdn.net/sallyxyl1993/article/details/64123922
 https://www.cnblogs.com/LXP-Never/p/9706790.html










