入门学习生成对抗网络

以最大似然估计的方式来获得生成图像模型的方法,这种方法是可行的,但有比较大的约束,即模型不能太复杂,比如服从正态分布,那么通过最大似然估计的方式就可以计算出,但如果是一个非常复杂的分布,那么使用这种方式难以获得一个理想的模型,这种强制性的约束就会造成各种限制,而我们希望的是可以为任意分布,这就需要引出GAN了。

 1 生成器来拟合分布 

在GAN中有两个主要的组成部分,分别是生成器与判别器,这里先讨论生成器,因为通过最大似然估计的方式能以计算复杂分布的,所以GAN的方法就是直接使用一个神经网络来完成这个事情,而这个神经网络就是生成器,因为神经网络可以拟合任意的分布,所以生成器不存在最大似然估计会遇到的问题。

对于GAN中的生成器而言,它会接收一个噪音输入,这个噪音输入可以来自于正态分布、均匀分布或其他任意分布,经过生成器复杂的神经网络变换,输出的数据就可以组成一种复杂的分布,最小化这个分布与真实分布的差异则可。输入给生成器的数据其分布不用太在意,因为生成器是一个复杂的神经网络,它有能力将输入的数据“改造”成各式各样的数据分布,直观如图1所示。

图1生成器

那么对生成器而言,它的目标函数就为:

即最小化生成分布与真实分布的距离

因为我们依旧无法准确的知道生成分布与真实分布具体的分布情况,所以依旧使用采样的方式来解决这个问题,即从数据集中抽取一下样本将抽取出的样本的分布看成是的分布,这种做法的背后思想其实是大数定理,知道了两个分布后,就可以通过训练生成器来最小化两分布的距离了。

 2 判别器计算分布的差异 

生成器可以最小化生成分布真实分布之间的距离了,但如何定义这个距离,即生成器目标函数中的如何定义?

GAN可以通过判别器来定义这两个分布的距离,简单回顾一下判别器,如图2所示。

图2  判别器

使用真实数据与生成数据来训练判别器,训练的目标是让判别器可以分辨出那些数据是真实数据那些数据是判别器数据,即对真实数据打高分,给生成数据打低分,其公式为如下:

对于从真实分布抽样的样本就打高分,即最大化,对于从生成分布抽样的样本就打低分,即最大化,那么判别器D的目标函数就为:

训练判别器就像训练一个二元分类器,其实质就是可以识别出真实数据与生成数据,如图3所示.

图3  二元分类器

从图可以看出,一开始,生成器还不会生成与真实图像很接近的生成图像,此时判别器做二分类就可以轻易的识别出输入的数据是真实数据还是生成数据,此时两种分布直接的相隔距离较大,但随着训练加多,生成数据与真实数据的分布越来越接近,此时判别器就无法将生成数据会真实数据完全区分开了,两分布的距离相隔较小。

回到一开始的话题,生成器在训练时需要先定义出生成分布与真实分布的距离,而两分别的距离可以有判别器来定义,即,生成器从而可以获得新的目标公式,如下:

 3 GAN的数学推导 

通过前面的讨论,已经明白了生成器用于拟合真实分布,判别器用来测量真实分布与生成分布之间的距离,接着我们就来推导一下

因为训练生成器先要有两分布距离的定义,所以这里就先来推导,推导如下:

将判别器的目标函数变换成积分的形式:

因为判别器希望最大,其实就是要求上式的中间部分最大,即最大,为了简化计算,我们将记为a,将记为D,将记为b,将变换成如下形式:

要找到一个D使得函数最大,求其导数为0的值则可,公式为:

将上式进行简单的变化,如下:

将a与b替换会原来的值,获得如下公式:

推导出了,就可以将推导出的值代入到生成器的目标函数中,如下:

将其变换为积分形式,如下:

做一些简单的变换,如下:

上面推导出的这个公式其实就是JS散度,回忆一下JS散度的公式,如下:

可以看出用于类似的样式,所以可以将简化一下,其公式如下:

推导到这里就可以得出,生成器最小化GAN的目标函数其实就是最小化真实分布与生成分布之间的JS散度,即最小化两个分布的相对熵。

直观的展示一下上面的公式推导,这里使用简单的二维的函数图像来简化复杂分布的表示,如图4所示.

图4 V(G,D*)

首先对判别器而言,其目标函数为,即找到函数的最高点,如图中的红点就是该分布的最高点,接着将该点代入生成器的目标函数就可以获得一个高度,该高度就是生成分布与真实分布的JS散度,生成器的目标就是最小化这个JS散度,而判别器的目标就是尽力测量出生成分布与真实分布的JS散度。

 4 GAN的本质  

通过上面对GAN目标函数的推导,最终发现GAN的目标函数其实就是JS散度,那么GAN做的事情简单而言就是通过判别器找到当前生成分布与真实分布的JS散度,然后在通过生成器生成数据构成新的生成分布,从而减小生成分布与真实分布之间的JS散度。

从生成器的角度看,它其实即使最小化,将记为,那么生成器要做的就是对函数做微分运算,计算出生成器参数要更新的值,然后通过梯度下降算法更新生成器的参数则可,如下:

一个值得思考的问题是,可微分吗?其实是可微的,具体例子,比如现在有函数,对求微分,其实就是对中最大的那个函数求微分,其直观形式如图5所示。

图5   求微分

因为是有多个函数组成的,所有对求微分其实也就是对不同函数求微分,因为只选择函数中最大的,那么对于某个区域,就对该区域最大的函数求导则可,如上图。

同理,对于GAN中的也是一样的,该函数求微分与普通函数求微分相似,用数学语言描述GAN的训练过程如下:

  • 固定生成器G,训练判别器D,获得

  • 固定判别器D,对做微分,从而计算出生成器参数要更新的值。

  • 往返上面两步,直到GAN收敛。

图6 V(G,D)发生变化

一开始,判别器计算出在的位置,将该位置的值代入可以获得生成分布与真实分布的JS散度,即   ,然后再通过训练生成器来减少两分布之间的JS散度,训练生成器其实就是更新生成器上的各种参数,而更新生成器的参数就会导致目标函数   发生变化,发生变化后的函数其   可能不在   所在的位置了,上图中变化后的函数其   获得的值应该为    ,但训练时因为固定这判别器,所以依旧使用的是   ,那么就无法获得生成分别与真实分布的JS散度了,既然有这个问题,为什么依旧这样训练呢?

通过上面的分布,可以知道每次改变生成器G,整个函数就会改变,此时固定的判别器D不一定再表示最大值   ,即无法获得两分布的JS散度,但在实际上,依旧可以将当前判别器获得的值看成与JS散度非常相近的值,因为生成器G在每次训练时,不会相对于上一次有一个较大的变动,从而导致函数   变化过大,此时就依旧可以近似将   看为是变动后函数   最大值的近似值,当生成器G经过一定次数训练后,函数变化可能比较大了,此时再训练判别器D,即找出新函数的JS散度。

在理论推导上,判别器D可以推导计算出   ,但在实际实现上,该值不一定是最大值,判别器D本身其实也是一个神经网络,我们训练该网络,希望可以找到   表示该函数最大的值,但因为函数   可能会比较复杂,判别器通常无法获得该函数的全局最优,而是获得该函数的局部最优,实际上在训练GAN网络时,并不会强制要求判别器D要找到   全局最大值,只要获得一个可以接受的局部最优解则可。

值得一提的是,因为我们无法确切的获得真实分布   与生成分布   的值,所以通过抽样的方式来获得样本,以样本的分布来近似的表示真实分布与生成分布,即   、   ,那么判别器的目标函数就可以改变成如下形式:

   

换个角度看,判别器其实就是一个二元分类器,使用sigmoid激活函数作为最后一层的输出(sigmoid输出的值在0~1之间),   是该二元分类器的积极样本,而   是该二元分类的消极样本,通过两种不同的数据来训练该分类器,从而最小化两分布的交叉熵损失,最小化两分布的交叉熵损失等价于最大化   ,即   。

现在再回头来看GAN的算法,用数学语言描述如下:

  • 获得样本,真实样本   ,噪音样本   ,生成样本   

  • 固定生成器G,训练判别器D

判断器目标函数:

   

更新判别器的参数:

   

   通常无法获得最大值,局部最优则可

  • 固定判别器D,循生成器G

生成器目标函数:

   

因为前面一项与生成器没有关系,所以可以将   简化为:

   

更新生成器的参数:

   

  • 通常我们会训练多次判别器D后才训练一次生成器,因为生成器参数更新太多,就会让函数发生较大的变化,从而导致生成器减小的不再是两分布的JS散度。

    本文摘自于《深入浅出GAN生成对抗网络》,经出版方授权发布。

推荐阅读

深入浅出GAN生成对抗网络


***粉丝福利时间***

评论区留言,点赞数前4可获得此书!!!

48个小时计!

注:若是在活动截止日期后24小时内无法取得用户回复或联系,将按照留言点赞排名顺延。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值