前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >知识干货 | GAN的原理和数学推导

知识干货 | GAN的原理和数学推导

作者头像
集智书童公众号
发布2021-05-28 15:10:57
1.1K0
发布2021-05-28 15:10:57
举报
文章被收录于专栏:集智书童集智书童

1 简介

我们都知道可以通过最大似然估计的方式来获得一个模型

P_G(x;\theta)

以用于生成图像,之所以它可以用来生成图像是因为最大似然估计可以获得一个

\theta

,可以让

P_G(x;\theta)

你和真实数据的分布情况。

上述的最大似然估计的方法虽然可行,但是有比较大的约束,即

P_G(x;\theta)

模型不能够过于复杂;例如

P_G(x;\theta)

服从正态分布,那么最大似然估计的方法就可以计算出

P_G(x;\theta)

,但如果

P_G(x;\theta)

是一个非常复杂的分布,那么使用这种方式难以获得一个比较理想的模型。这种强制性的约束会带来各种限制,而我们则是希望

P_G(x;\theta)

可以拟合任何分布,于是这里便引出了GAN了。

2 生成器拟合分布

在GAN中有2个主要的组成部分,分别是生成器判别器

2.1 生成器

因为通过最大似然估计的方式计算复杂的分布

P_G(x;\theta)

,所以GAN的方法就是使用一个神经网络来完成数据分布拟合的事情,而这个神经网络就是生成器,因为神经网络理论上可以拟合任意的分布,所以生成器可以代替最大似然估计来拟合数据的分布。

对于GAN中的生成器而言,它会接收一个随机噪声输入,这个噪声可能来自于正态分布、均匀分布或其他任意分布,经过生成器的转换,输出的数据可以组成一种复杂的分布,最小化这个分布于真实数据分布之间的差异。

对于输入给生成器的数据分布不用太在意,因为生成器是一个复杂的神经网络,它有能力将输入的数据“改造”成各种各样的数据分布。

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

G^*=argmin_GDiv(P_G,P_data)

即最小化生成分布

P_G

与真实数据分布

P_{data}

之间的距离

Div(P_G,P_{data})

因为我们无法准确的知道生成分布

P_G

与真实分布

P_{data}

的具体的分布情况,所以依旧使用采样的方式来解决这个问题,即从数据集中抽取一个样本,将抽出的样本的分布看成是

P_G

P_{data}

的分布。这种做法的思想其实是大数定律,知道2个分布后,就可以通过训练生成器来最小化两个分布之间的差异。

2.2 判别器

通过前面的描述我们可以知道生成器可以最小化生成分布

P_G

与真实分布

P_{data}

之间的距离,但是如何定义这个距离呢?即生成器目标函数中的

Div(P_G,P_{data})

如何定义呢?

GAN可以通过判别器来定义这两个分布的距离,如下图所示:

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

V(G,D)=E_{x~P_{data}}[logD(x)]+
E_{x~P_{G}}[log(1-D(x))]

对于从真实分布

P_{data}

中抽样的样本

x

就打高分,即最大化

logD(x)

;对于从生成分布

P_G

中抽样的样本

x

就打低分,即最大化

log(1-D(x))

,那么判别器D的目标函数是:

D^*=argmax_DV(D,G)

2.3 目标函数

回到一开始的话题,生成器在训练的时候需要先定义生成分布

P_G

与真实分布

P_{data}

之间的距离

Div(P_G,P_{data})

,而两个分布之间的距离可以由判别器来进行定义:

D^*=argmax_DV(D,G)

从而生成器可以获得新的目标函数公式:

G^*=argmin_gDiv(P_G,P_{data})
\Downarrow
G^*=argmin_Gmax_DV(G,D)

3 GAN的数学推导

通过前面的讨论,我想大家应该已经明白生成器用来拟合真实数据分布,而判别器用来度量真实分布与生成分布之间的距离,接下来就来推导一下

G^*=argmin_Gmax_DV(G,D)

因为在训练生成器之前,先要由两个分布之间距离的定义,所以这里就来推导

max_DV(G,D)

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

V=E_{x\sim P_{data}}[logD(x)]
+E_{x\sim P_{G}}[log(1-D(x))]
\Downarrow
V=\int _xP_{data}[logD(x)]dx
+\int _xP_{G}[log(1-D(x))]dx
\Downarrow
V=\int _xP_{data}[logD(x)]
+P_{G}[log(1-D(x))]dx

因为判别器希望

V(G,D)

最大,其实就是要求上式的中间部分最大,即

P_{data}[logD(x)]+P_{G}[log(1-D(x))]

最大,为了简化计算,这里将

P_{data}

记为

a

,将

D(x)

记为

D

,将

P_{G}

记为

b

,则

P_{data}[logD(x)]+P_{G}[log(1-D(x))]

可以变换为如下的形式:

f(D)=alog(D)+blog(1-D)

要找到一个

D

使得

f(D)

函数最大,求其导数为0的值即可:

\frac{df(D)}{dD}=a\frac{1}{D}-b\frac{1}{1-D}=0

将上式进行简单的简化的变化可以求得:

D=\frac{a}{a+b}

这里将

a

b

替换为原来的值,获得如下的公式:

D^*(x)=\frac{P_{data}(x)}{P_{data}(x)+P_{G}(x)}

推导出

max_DV(G,D)

,就可以得到将推导出来的结果代入生成器的目标函数中:

V(G,D^*)=E_{x\sim P_{data}}\left(log\frac{P_{data}}{P_{data}+P_{G}}\right)
+\left(E_{x\sim P_{G}}log\frac{P_{G}}{P_{data}+P_{G}}\right)

将其变换为积分的形式可以得到如下:

V(G,D^*)=\int _x P_{data}\left(log\frac{P_{data}}{P_{data}+P_{G}}\right)dx
+\left(\int _x P_{G}log\frac{P_{G}}{P_{data}+P_{G}}\right)dx

这里做一些简单的变换可以得到:

V(G,D^*)=\int _x P_{data}\left(log\frac{\frac{P_{data}}{2}}{\frac{P_{data}+P_{G}}{2}}\right)dx
+\left(\int _x P_{G}log\frac{\frac{P_{G}}{2}}{\frac{P_{data}+P_{G}}{2}}\right)dx
\Downarrow
V(G,D^*)=
-2log2
+\int _x P_{data}\left(log\frac{\frac{P_{data}}{2}}{\frac{P_{data}+P_{G}}{2}}\right)dx
+\left(\int _x P_{G}log\frac{\frac{P_{G}}{1}}{\frac{P_{data}+P_{G}}{1}}\right)dx

其实通过上面的推导可以看出来,上面的公式就是JS散度,这里再回忆一下JS散度公式:

M=\frac{1}{2}(P+Q)
JS(P||Q)=\frac{1}{2}D(P||M)+\frac{1}{2}D(Q||M)

通过上式可以看出

V(G,D^*)

用于类似的样式,所以可以将

V(G,D^*)

简化为下式:

V(G,D^*)=
-2log2
+KL\left(P_{data}||\frac{P_{data+P_G}}{2}\right)
+KL\left(P_{G}||\frac{P_{data+P_G}}{2}\right)
\Downarrow
V(G,D^*)=-2log2+2JS\left(P_{data}||P_G\right)

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 集智书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2 生成器拟合分布
    • 2.1 生成器
      • 2.2 判别器
        • 2.3 目标函数
        • 3 GAN的数学推导
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档