GAN的理论讲解

Theory behind GAN

本文是在李宏毅老师机器学习课堂讲解的基础上总结的GAN的原理推导。

Generation

理解GAN生成图像的背后是在做什么工作。


例如一张64 × \times × 64的图片 x x x,可以看做是64 × \times × 64维空间中的一个点。在这个64 × \times × 64维的Image Space中,存在一个固定的分布 P P P, 只有 P P P 中采样出的点(高维空间中的点,即是一幅图像),才会高概率是有意义的图像(比如要生成人脸,那么只有 P P P 中的点是人脸图像)。那么图像生成实际上就是让机器通过“看”大量的某一类图像,找出这个分布。

Before GAN

在GAN出现之前,完成上述目标是通过最大似然估计来完成的。


所谓最大似然估计,在这里就是对每一个真实数据分布的采样点 { x 1 , x 2 , . . . , x m } \{x^1,x^2,...,x^m\} {x1,x2,...,xm},计算模型参数 θ \theta θ 下,从我们的分布 P G ( x ; θ ) P_G(x;\theta) PG(x;θ) 中得到这个 x i x^i xi 的似然。所以对于所有的采样点,可以得到一个total likelihood:
L = ∏ i = 1 m P G ( x i ; θ ) L = \prod_{i=1}^{m}{P_G(x^i;\theta)} L=i=1mPG(xi;θ)
L L L 越大,说明我们创建的分布 P G ( x ; θ ) P_G(x;\theta) PG(x;θ) 越接近真实分布 P d a t a ( x ) P_{data}(x) Pdata(x) ,因此,目标就是找到使 L L L 最大的模型参数 θ ∗ \theta^* θ
另一个解释:最大似然估计等同于最小KL散度


需要注意图中约等于号的意思,简单来说就是maximize ∑ i = 1 m l o g P G ( x i ; θ ) \sum_{i=1}^{m}{logP_G(x^i;\theta)} i=1mlogPG(xi;θ) 的过程近似等于maximize l o g P G ( x i ; θ ) logP_G(x^i;\theta) logPG(xi;θ) 的期望。图中剩下的部分都是简单的数学推导。但是实际上,复杂一点的情况下likelihood是很难计算的,早期生成工作(80年代就在做了。。。)都是用高斯分布来作为 P G ( x ; θ ) P_G(x;\theta) PG(x;θ),效果不尽人意。

Generator


生成器就是为了解决上述问题,通过一个网络,把一个正态分布或者均匀分布转换为 P G P_G PG, 然后最小化 P G P_G PG P d a t a P_{data} Pdata 的divergence。但是存在一个很关键的问题,无论是 P G P_G PG 还是 P d a t a P_{data} Pdata ,它们的formulation是不知道的,所以更不可能计算divergence。(否则直接计算divergence再用gradient descent就好了)

Discriminator

GAN的高明之处就是引入了一个 Discriminator,通过Discriminator的存在,巧妙的转换了求解divergence的问题,先简单讲解一下Discriminator做了什么 。


首先在 P G P_G PG P d a t a P_{data} Pdata 采样,如上图所示。得到的真实samples和生成samples用来训练discriminator。


在训练discriminator的时候,generator是固定住的。discriminator可以看作是一个二分类器,其目的就是对于生成的图像(即 P G P_G PG 的采样)输出越小越好,反过来对于真实图像(即 P d a t a P_{data} Pdata 的采样)输出越大越好。 V ( G , D ) V(G,D) V(G,D)就是目标函数,而这个目标函数是和前面说的无法计算的divergence有相关的。直观理解就是,如下图第一行中的两种星星,当两个分布的divergence很小时,discriminator很难区分,也就意味着目标函数也达不到很大的值;反过来就是,如果目标函数的值小,代表devergence小。那么,生成器中的 D i v Div Div就可以通过 max ⁡ D V ( D , G ) \max_{D}V(D,G) maxDV(D,G)来替换。再通俗的说,用判别器来检测生成器生成的图像,当判别器无法分辨原始图像和真实图像时( max ⁡ D V ( D , G ) \max_{D}V(D,G) maxDV(D,G)的值很小),就代表生成器生成的分布已经很接近真实图像分布( D i v Div Div)小,这就间接解决了上面说的 D i v Div Div无法计算的问题。具体过程可以结合下面的公式推导理解。


接下来是数学推导,这里我一步步给出公式,方便理解。
首先从判别器的目标函数 V V V 开始:
V = E x ∼ P d a t a [ l o g D ( x ) ] + E x ∼ P G [ l o g ( 1 − D ( x ) ) ] V = E_{x \sim P_{data}}[logD(x)]+E_{x \sim P_{G}}[log(1-D(x))] V=ExPdata[logD(x)]+ExPG[log(1D(x))]
求期望改成积分形式:
V = ∫ x P d a t a ( x ) l o g D ( x ) d x + ∫ x P G ( x ) l o g ( 1 − D ( x ) ) d x V = \int_{x}{P_{data}(x)logD(x)dx} + \int_{x}{P_{G}(x)log(1-D(x))dx} V=xPdata(x)logD(x)dx+xPG(x)log(1D(x))dx
积分合并:
V = ∫ x [ P d a t a ( x ) l o g D ( x ) + P G ( x ) l o g ( 1 − D ( x ) ) ] d x V = \int_{x}{[P_{data}(x)logD(x) + P_{G}(x)log(1-D(x))]dx} V=x[Pdata(x)logD(x)+PG(x)log(1D(x))]dx
首先做一个假设, D ( x ) D(x) D(x) 可以是任意函数(实际上假设是不成立的,除非神经元无穷多)。有了这个假设,每个 x x x 的值都可以分开算,然后再求和(积分的过程),因此maximize V V V,就变成了对于每一个 x x x ,找出一个 D ∗ D^* D, 使得上式积分中的值最大, P G P_G PG P d a t a P_{data} Pdata是固定的,令 P d a t a = a P_{data} = a Pdata=a, P G = b P_G = b PG=b,则有:
f ( D ) = a l o g ( D ) + b l o g ( 1 − D ) f(D) = alog(D) + blog(1-D) f(D)=alog(D)+blog(1D)
于是就变成很简单的求极值问题,对 f ( D ) f(D) f(D)求微分:
d f ( D ) d D = a × 1 D + b × 1 1 − D × ( − 1 ) = 0 \frac {df(D)}{dD} = a \times \frac 1D + b \times \frac 1{1 - D} \times (-1) = 0 dDdf(D)=a×D1+b×1D1×(1)=0
a × 1 D ∗ = b × 1 1 − D ∗ a \times \frac1D^* = b \times \frac 1{1-D^*} a×D1=b×1D1
a × ( 1 − D ∗ ) = b × D ∗ a \times (1-D^*) = b \times D^* a×(1D)=b×D
D ∗ = a a + b D^* = \frac a{a + b} D=a+ba
D ∗ = P d a t a ( x ) P d a t a ( x ) + P G ( x ) D^* = \frac {P_{data}(x)}{P_{data}(x) + P_G(x)} D=Pdata(x)+PG(x)Pdata(x)
那么:
max ⁡ D V ( G , D ) = V ( G , D ∗ ) \max_{D}V(G,D) = V(G, D^*) DmaxV(G,D)=V(G,D)
接下来,把上面求出的 D ∗ D^* D代入:
V ( G , D ∗ ) = ∫ x P d a t a ( x ) l o g P d a t a ( x ) P d a t a ( x ) + P G ( x ) d x + ∫ x P G ( x ) l o g P G ( x ) P d a t a ( x ) + P G ( x ) d x V(G,D^*) = \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} V(G,D)=xPdata(x)logPdata(x)+PG(x)Pdata(x)dx+xPG(x)logPdata(x)+PG(x)PG(x)dx
分子分母同乘一个 1 2 \frac 12 21,并把分子的 1 2 \frac 12 21提出来:
V ( G , D ∗ ) = − 2 l o g 2 + ∫ x P d a t a ( x ) l o g P d a t a ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 d x + ∫ x P G ( x ) l o g P G ( x ) ( P d a t a ( x ) + P G ( x ) ) / 2 d x V(G,D^*) = -2log2 + \int_{x}{P_{data}(x)log \frac {P_{data}(x)}{(P_{data}(x) + P_G(x))/2}dx} + \int_{x}{P_{G}(x)log \frac {P_{G}(x)}{(P_{data}(x) + P_G(x))/2}dx} V(G,D)=2log2+xPdata(x)log(Pdata(x)+PG(x))/2Pdata(x)dx+xPG(x)log(Pdata(x)+PG(x))/2PG(x)dx
那么,两个积分项便是两个KL divergence:
V ( G , D ∗ ) = − 2 l o g 2 + K L ( P d a t a ∣ ∣ P d a t a + P G 2 ) + K L ( P G ∣ ∣ P d a t a + P G 2 ) V(G,D^*) = -2log2 + KL(P_{data}|| \frac {P_{data}+P_G}2) + KL(P_{G}|| \frac {P_{data}+P_G}2) V(G,D)=2log2+KL(Pdata2Pdata+PG)+KL(PG2Pdata+PG)
后面两项又是一个叫 Jensen-Shannon divergence的东西:
V ( G , D ∗ ) = − 2 l o g 2 + 2 J S D ( P d a t a ∣ ∣ P G ) V(G,D^*) = -2log2 + 2JSD(P_{data}||P_G) V(G,D)=2log2+2JSD(PdataPG)
最终得到的结论就是,我们maximize 目标函数 V V V,其实就得到了 P G P_G PG P d a t a P_{data} Pdata之间的JS散度。所以,训练discriminator的过程,就是为了得到上述的 D ∗ D^* D
回顾一下生成器和判别器:
G ∗ = a r g   min ⁡ G D i v ( P G , P d a t a ) G^* = arg\,\min_{G} Div(P_G, P_{data}) G=argGminDiv(PG,Pdata)
D ∗ = a r g   max ⁡ D V ( D , G ) D^* = arg\,\max_{D} V(D,G) D=argDmaxV(D,G)
刚刚的推导得到, max ⁡ D ( D , G ) \max_D(D,G) maxD(D,G) D i v Div Div是相关的,那么 D i v ( P G , P d a t a ) Div(P_G, P_{data}) Div(PG,Pdata),就可以通过判别器中 max ⁡ D V ( D , G ) \max_{D} V(D,G) maxDV(D,G)来替换,即:
G ∗ = a r g   min ⁡ G max ⁡ D V ( D , G ) G^* = arg\,\min_{G} \max_{D} V(D,G) G=argGminDmaxV(D,G)
这个公式是不是很熟悉!
好了先到这里,第一次尝试深入理解GAN的原理,有错误欢迎指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值