机器学习和人工智能入门人工智能/模式识别/机器学习精华专题

GAN:Generative Adversarial Nets论

2020-02-05  本文已影响0人  山雾幻华


[toc]

1. Generative Adversarial Nets

arXiv:1406.2661 [stat.ML]
tensorflow2代码:https://github.com/zhangkaihua88/ML_Paper


1.1. 摘要

通过对抗过程估计生成模型的框架,同时训练两个模型:
生成模型G用来获取数据分布
判别模型D估计样本来自训练数据而不是G的概率
G的训练目标是为了最大化D产生错误的概率
在任意函数G和D的空间中存在唯一的解,其中G恢复训练数据分布,并且D处处都等于\frac{1}{2}


1.2. 介绍

最成功的的模型之一就是判别式模型
通常它们将高维丰富的感知器输入映射到类标签上。
主要是基于反向传播和丢弃算法来实现的,特别是具有特别良好梯度的分段线性单元。

对抗网络

  1. 生成模型通过将随机噪声传输到多层感知机来生成样本的特例
  2. 判别模型通过多层感知机去判别一个样本是来自模型分布还是数据分布
  3. 生成模型和判别模型互相对抗

可以仅使用非常成熟的反向传播和丢弃算法训练两个模型,生成模型在生成样本时只使用前向传播算法。并且不需要近似推理和马尔可夫链作为前提。


1.3. 对抗网络

对抗模型框架是最直接的应用是多层感知机

1.3.1. 符号定义

x \rightarrow 真实数据
z \rightarrow 噪音(生成器的输入数据)
p_x \rightarrow 真实数据的分布
p_{z}(z) \rightarrow 原始噪音数据的分布
p_g \rightarrow 经过生成器后数据的分布
G() \rightarrow 生成映射函数(可微),结构为多层感知机,参数\theta_{g}
D() \rightarrow 判别映射函数(可微),结构为多层感知机,参数\theta_{d}
G(z;\theta_{g}) \rightarrow 将噪音z映射到新的数据空间
D(x ; \theta_{d}) \rightarrow x来自真实数据而不是生成数据的概率(真=1,假=0)

1.3.2. 极大似然估计

对于真实数据x和生成数据G(z),经过判别器判别后的,D认为x是真样本的概率为D(x)D认为G(z)是假样本的概率为1-D(G(z)),那么对于Dlog似然函数为:
L=log[D(x)*(1-D(G(z)))] \tag{1}

1.3.3. 目标函数

\min _{G}\max _{ D } V(D,G)={ \mathbb{E} }_{ x ~ { p }_ { data } (x) }[logD(x)] + { \mathbb{E} }_{ z ~ { p }_{ z }(z) }[log(1-D(G(z)))] \tag{2}
D(x)D(G(z))分别表示xG(z)经过判别器D的判别后,D认为输入样本是真样本的概率,则1-D(G(z))表示D将假样本判断为假的概率;那么,真实的概率分布与D判断出来的情况列表如下:

D D将真样本x判断为真的概率:D(x) D将假样本G(z)判断为假的概率:1-D(G(z))
真实情况 真样本x为真的概率:1 假样本G(z)为假的概率:1
用交叉熵作为目标函数 1*log[D(x)]对应第一项 1*log[1-D(G(z))]对应第二项

Note:D输出的是概率,那么D的输出层的激活函数必须是sigmoid

1.3.4. 对抗

判别器D的目标

  1. 要尽可能把真的样本判断为真,对应最大化第一项:{ E }_{ x ~ { p }_ { data } (x) }[logD(x)]
  2. 把假的样本判断为假,对应最大化第二项:{ E }_{ z ~ { p }_{ z }(z) }[log(1-D(G(z)))]

生成器G的目标

  1. 要尽可能的让D将生成的假样本判断为真,对应最小化第二项:{ E }_{ z ~ { p }_{ z }(z) }[log(1-D(G(z)))]

总的来说,这是一个MinMax Game
Note:实际训练当中,训练G的时候D的参数是固定的,G并不干扰D对真实数据的判断,G需要D的正确引导,G只是不断提升自己生成数据的能力。

1.3.5. Loss Function

D的损失函数(最小化):
Loss_D = -[1*logD(x) + 1*log(1-D(G(z)))] \tag{3}
G的损失函数(最小化):
Loss_G = 0*logD(x) + 1*log(1-D(G(z)))=log(1-D(G(z))) \tag{4}

1.3.6. 具体算法过程

20190816181118.png

Note:

  1. 生成对抗网络的minibatch随机梯度下降训练
  2. 先更新D,再更新G,只有D有了正确的判断能力,G才能按照D的指示来更新;
  3. 可以设置一个超参数k来协调DG两者之间更新的次数比例,在实验中k=1,使消耗最小;
  4. 在训练G的时候D的参数要固定,在训练D的时候G的参数要固定;

1.4. 改进

1.4.1. G替代版的Loss Function

由于G(z)是从噪声中生成的样本,所以在最开始G生成的样本非常假,很容易被D抓出来,也就是说D(G(z))非常小,那么Loss_G = log(1-D(G(z)))就非常接近0,在反向传播的时候就不能够传播足够的梯度给G来更新参数,所以我们从Heuristic的角度来理解:我们本身是要最小化D抓出来假样本的概率,现在我们可以换成最大化D抓不出来的概率(\log D(G(z))),也就是将G的损失函数换成:
Loss_G=-logD(G(z))
由于D是按照:
Loss_G = log(1-D(G(z)))
训练的,那么如果损失函数更换,这两项不是等价的,所以D给出的值就能够提供足够的梯度。

Note:
Loss_G =log(1-D(G(z)))对应的GAN叫做MMGAN
Loss_G=-logD(G(z))对应的GAN叫做NSGAN
改进后的仍然存在些许问题,见与定理1:全局最优的Note3

从函数图像上,可以直观的看出,两种损失函数的梯度变化趋势:


损失函数图像

1.5. 补充知识

1.5.1. 信息量

I(x) = -\log {p(x)} = \log { \frac { 1}{ p (x) } }
一个事件发生的概率越大,这件事情发生所包含的信息量就越小,比如说一个高富帅追求一个白富美,追到手了没有什么稀奇的,因为这是一件概率很高的事情,但是如果一个矮穷矬追求一个白富美,追到手了,这种事情发生的概率很低,其中一定有其他的原因:比如这个矮穷矬救过白富美的命或者这个矮穷矬器大活好不黏人,所以概率低的事情发生所包含的信息量大;两个相互独立的事情同时发生的信息量是两者单独发生的信息量之和。

1.5.2. 信息熵

信息量的均值
H(x) = - \sum _{ x } p(x)log p(x)

1.5.3. 交叉熵

H(P, Q) = - \sum _{ x } p(x)log q(x)
用估计编码q(x)近似真实编码p(x)需要的平均编码长度

1.5.4. KL散度(Kullback–Leibler散度,相对熵)

统计中的一个概念,时衡量两种概率分布的相似程度,其越小,表示两种概率分布越接近。(当P(x)和Q(x)的相似度越高,KL散度越小)
对于离散的概率分布定义如下:
D_{KL}(P||Q)=- \sum _{ x } p(x)log q(x) + \sum _{ x } p(x)log p(x) =H(P, Q)-H(P)
对于连续的概率分布定义如下:
D_{K L}(P \| Q)=\int_{-\infty}^{\infty} p(x) \log \frac{p(x)}{q(x)} d x
想要将一个随机高斯噪声z通过一个生成网络G得到一个和

1.5.5. JS散度(Jensen-Shannon散度)

D_{JS}(P||Q)={\frac{1}{2}} KL(P||M) + {\frac{1}{2}} KL(Q||M) \quad \quad M = {\frac{1}{2}}(P+Q)


1.6. 理论结果

1.6.1. 最优判别器D:D^{*}(x) =\frac{P_{\text {data}}(x)}{P_{\text {data}}(x)+P_{G}(x)}

对于给定生成器G,最大化V(D,G)而得出最优判别器D。原论文中价值函数可写为在x上的积分,即将数学期望展开为积分形式:

\begin{aligned} \max _{ D } V(D,G)&={ E }_{ x ~ { p }_ { data } (x) }[logD(x)] + { E }_{ z ~ { p }_{ z }(z) }[log(1-D(G(z)))]\\ &=\int_{x} p_{d a t a}(x) \log D(x) \mathrm{d} x+\int_{z} p(z) \log (1-D(G(z))) \mathrm{d} z\\ &=\int_{x} p_{d a t a}(x) \log D(x)+p_{G}(x) \log (1-D(x)) \mathrm{d} x \end{aligned}
取函数,求偏导数
(对于任意的(a, b) \in \mathbb{R}^{2} \backslash\{0,0\},函数y \rightarrow a \log (y)+b \log (1-y)[0,1]中的\frac{a}{a+b}处达到最大值)
\begin{aligned} f(D) &=a \log (D)+b \log (1-D) \\ \frac{d f(D)}{d D}&= a \times \frac{1}{D}+b \times \frac{1}{1-D} \times(-1)=0 \\ a \times \frac{1}{D^{*}} &= b \times \frac{1}{1-D^{*}} \\ \Leftrightarrow a \times & (1-D^{*}) =b \times D^{*} & \\ \text{得到最优判别器}&{ D }^{ * }(x):\\ D^{*}(x) &=\frac{P_{\text {data}}(x)}{P_{\text {data}}(x)+P_{G}(x)} \end{aligned}

1.6.2. 最优生成器:p_{g}=p_{\text {data }}

我们知道对于G来说,最好的G是让:
{ P }_{ r }(x) = { P }_{ g }(x)
此时,有:
{ D }^{ * }(x)=1/2
也就是说最好的生成器使最好的判别器无法判别出来样本是生成样本还是真实样本。

1.6.3. 定理1:全局最优

定理1:当且仅当p_{g}=p_{\text {data }}时,C(G)达到全局最小。此时,C(G)的值为−log4
注意到,判别器D的训练目标可以看作为条件概率P(Y=y | x)的最大似然估计,当y=1时,x来自于p_{\text {data }};当y=0时,x来自p_{g}。公式1中的极小化极大问题可以变形为:
\begin{aligned} C(G) &=\max _{D} V(G, D) \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}}\left[\log \left(1-D_{G}^{*}(G(\boldsymbol{z}))\right)\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \left(1-D_{G}^{*}(\boldsymbol{x})\right)\right] \\ &=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log \frac{p_{\text {data }}(\boldsymbol{x})}{P_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \frac{p_{g}(\boldsymbol{x})}{p_{\text {data }}(\boldsymbol{x})+p_{g}(\boldsymbol{x})}\right] \\ &=\int_{x} p_{\text {data}}(x) \log \left(\frac{p_{\text {data}}(x)}{p_{\text {data}}(x)+p_{g}(x)}\right)+p_{g}(x) \log \left(\frac{p_{g}(x)}{p_{\text {data}}(x)+p_{g}(x)}\right) d x\\&=\int_{x} p_{d a t a}(x) \log \left(\frac{p_{d a t a}(x)}{\frac{p_{d a t a}(x)+p_{g}(x)}{2}}\right)+p_{g}(x) \log \left(\frac{p_{g}(x)}{\frac{p_{d a t a}(x)+p_{g}(x)}{2}}\right) d x-\log (4)\\ &=\underbrace{K L\left(p_{\text {data}}(x) \| \frac{p_{\text {data}}(x)+p_{g}(x)}{2}\right)}_{\geq 0}+\underbrace{K L\left(p_{g}(x) \| \frac{p_{\text {data}}(x)+p_{g}(x)}{2}\right)}_{\geq 0}-\log (4)\\&=2\underbrace{\cdot JSD(p_{data}\|p_{g})}_{\geq 0}-log(4)\\\min _{G} C(G)&=0+0-\log (4)=-\log (4) \end{aligned}
当且仅当p_{\text {data}}(x)=\frac{p_{\text {data}}(x)+p_{g}(x)}{2}p_{g}=p_{\text {data }}时成立,此时C(G)达到全局最小,C(G)的值为−log4
Note1
KL散度:KL({ P }_{ 1 }||{ P }_{ 2 })={ P }_{ 1 }\log { \frac { { P }_{ 1 } }{ { P }_{ 2 } } }
JS散度:JS({ P }_{ 1 }||{ P }_{ 2 })=\frac { 1 }{ 2 } KL({ P }_{ 1 }||\frac { { P }_{ 1 }+{ P }_{ 2 } }{ 2 } )+\frac { 1 }{ 2 } KL({ P }_{ 2 }||\frac { { P }_{ 1 }+{ P }_{ 2 } }{ 2 } )
Note2(MMGAN)Loss_G =log(1-D(G(z)))
当判别器D最优的时候,生成器G是在减小真实分布与生成分布之间的JS散度
<span id="1">Note3(NSGAN)</span>Loss_G=-logD(G(z))
\begin{aligned} KL({ P }_{ g }(x)||{ P }_{ r }(x)) &={ P }_{ g }(x)*\log { \frac { { P }_{ g }(x) }{ { P }_{ r }(x) } } \\ &={ P }_{ g }(x)*\log { \frac { { P }_{ g }(x)/({ P }_{ r }(x)+{ P }_{ g }(x)) }{ { P }_{ r }(x)/({ P }_{ r }(x)+{ P }_{ g }(x)) } } \\ &={ P }_{ g }(x)*\log \frac { 1-D^{ * }(x) }{ D^{ * }(x) } \\ &={ P }_{ g }(x)log[1-D^{ * }(x)]-{ P }_{ g }(x)logD^{ * }(x)\\ -{P}_{g}(x)*logD^*(x)&=KL({ P }_{ g }(x)||{ P }_{ r }(x))-{ P }_{ g }(x)log[1-D^{ * }(x)]\\ Loss_{ G }&=KL({ P }_{ g }(x)||{ P }_{ r }(x))-{ P }_{ g }(x)log[1-D^{ * }(x)]\\ \because {P}_{r}(x)*log[D^*(x)] &+ {P}_{g}(x)*log[1-D^*(x)]=2JS({ P }_{ r }||{ P }_{ g })-2log2\\ \therefore Loss_{ G }=KL({ P }_{ g }(&x)||{ P }_{ r }(x))-2JS({ P }_{ r }||{ P }_{ g })+{P}_{r}(x)*log[D^*(x)]+2log2[1-D^{ * }(x)] \end{aligned}
从上面的式子可以看出KL散度和JS散度同时存在且方向相反,而JS散度和KL散度都是衡量两个分布距离的度量,且是单调性同步的函数,这样的话就会导致梯度的方向不稳定,一会儿上升一会儿下降,所以这个替代版的损失函数也不是一个好的选择。

1.6.4. 算法的收敛性

命题:如果GD有足够的性能,对于算法1中的每一步,给定G时,判别器能够达到它的最优,并且通过更新p_g来提高这个判别准则。
\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}}\left[\log D_{G}^{*}(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{x} \sim p_{g}}\left[\log \left(1-D_{G}^{*}(\boldsymbol{x})\right)\right]
p_g收敛为p_{data}

Note
优化θ_g而不是p_g本身


1.7. 优势和劣势

1.7.1. 优势

1.7.2. 劣势


1.8. 结论和未来研究方向

该框架允许许多直接的扩展:


1.9. 参考资料

Paper---Generative Adversarial Nets
知乎---GAN入门理解及公式推导
CSDN---GAN论文阅读——原始GAN(基本概念及理论推导)
CSDN---KL散度、JS散度以及交叉熵对比
CSDN---Generative Adversarial Nets论文笔记+代码解析
CSDN---Generative Adversarial Nets(译)
Github---andyhujinzhao/Generative_Adversarial_Nets


上一篇下一篇

猜你喜欢

热点阅读