Generative Adversarial Nets - GAN
介绍
Goodfellow 的这篇paper发布于2014年,提出了一种新的模型——生成对抗模型。这个模型其实就是训练两个相互对抗的网络,一个是训练一个生成器(Generator),另一个是训练一个判别(Discriminator)。
- 生成器G(Generator):通过给生成器网络输入一个噪声向量来生成一个对象(要学习生成的那个对象)。
- 判别器D(Discriminator):通过给判别器网络输入一个对象,输出有个 scalar(标量)来衡量输入的这个对象是真实的对象,还是由生成器生成的对象。
这两个网络是相互对抗相互博弈的。生成器的目的是尽量生成接近真实的对象,把这个生成的对象输入到判别器网络D中,用判别器的输出(0到1之间的一个实数)来衡量生成器生成的对象接近真实对象的程度。生成器会朝着使判别器输出比较大的数的方向上调节生成器的网络参数,此时判别器网络参数固定不便。生成器的目的是尽量分辨出输入的对象是不是真实的对象,其输出越大表示这个输出的对象越可能是真实的。判别器对真实的对象来说会朝着输出较大的方向上去调节判别器的网络参数,此时生成器网络参数固定,对于输入假的对象(生成器生成的对象),判别器会朝着输出较小的方向上去调节判别器的网络参数。
描述
整个过程我们可以理解成老师教学生画一只猫的过程。老师也不是一开始就知道什么样的图片是猫,所以老师也要学习(判别器),第第一次去训练判别器的过程就相当于是老师学习认识猫的过程,但是老师只是看了一个batch的真实的猫的照片,所以他只记住了猫是有耳朵的。此时生成器根据初始化的参数生成了一张图片,把这个图片输入到判别器中得到一个结果,这个过程相当于学生随便画了一幅图,然后去问老师这个图片是不是猫,老师说猫是有耳朵的,然后学生画的下一个图片就是有耳朵的(这就是训练生成器G的过程),然后老师又去看真实猫的图片又从中学习到猫是有尾巴的(第二次训练判别器)。然后学生画了一张有耳朵的猫给老师看(生成器生成了一张比上一次要接近猫的图片输入判别器),老师告诉学生“你已经画对了一部分,但是猫是有尾巴”。…就这样循环往复,直到最后学生就能画出一张很接近猫的图片。
数学表示
用数学语言描述整个博弈过程
- 生成模型 G G G用数学符合表示为 G ( z ∣ θ g ) G \left( z | \theta _ { g } \right) G(z∣θg),其中 z z z 是一个随机噪声表示模型的输入, θ g \theta _ { g } θg表示生成模型中参数(生成器网络里的参数),模型的输出用 x ~ \tilde { x } x~来表示,这里的 x ~ \tilde { x } x~是一个假的对象是生成器生成的。
- 判别模型 D D D用数学符号表示为 D ( x ∣ θ d ) D \left( x | \theta _ { d } \right) D(x∣θd),其中 x x x为模型的输入, θ d \theta _ { d } θd表示生成模型中参数(判别器网络里的参数),模型的输出是0-1范围内的一个实数用来判断这个图片是一个真实图片的概率是多大。
训练过程
优化判别器
- 当把一个真实的对象输入判别器时,我们希望判别器输出的数接近于1的,也就是最大化判别器 D ( x ) D \left( x\right) D(x)。
- 当把一个由生成器生成的对象输入到判别器时,我们希望判别器输出的数接近于0的,也就是最小化 D ( x ~ ) D \left( \tilde { x }\right) D(x~)。
把上面的两个步骤合并在一起公式如下
正向传播
结合上面指出的两点,把这两项整合成数学公式如下,
V
~
\tilde { V }
V~为此时相对于判别器的损失函数
V
~
=
1
m
∑
i
=
1
m
log
D
(
x
i
)
+
1
m
∑
i
=
1
m
log
(
1
−
D
(
x
~
i
)
)
\tilde { V } = \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \log D \left( x ^ { i } \right) + \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \log \left( 1 - D \left( \tilde { x } ^ { i } \right) \right)
V~=m1i=1∑mlogD(xi)+m1i=1∑mlog(1−D(x~i))
反向优化 注意此时只优化判别器的参数
朝着使损失函数
V
~
\tilde { V }
V~最大化的方向优化
θ
d
←
θ
d
+
η
∇
V
~
(
θ
d
)
\theta _ { d } \leftarrow \theta _ { d } + \eta \nabla \tilde { V } \left( \theta _ { d } \right)
θd←θd+η∇V~(θd)
优化生成器
当把一个由生成器生成的对象输入到判别器时,我们希望判别器输出的数接近于1的,也就是最大化
D
(
x
~
)
D \left( \tilde { x }\right)
D(x~)或者是最小化
1
−
D
(
x
~
)
1-D \left( \tilde { x }\right)
1−D(x~)。
正向传播
V
~
\tilde { V }
V~为此时相对于生成器的损失函数
V
~
=
1
m
∑
i
=
1
m
log
(
D
(
G
(
z
i
)
)
)
\tilde { V } = \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \log \left( D \left( G \left( z ^ { i } \right) \right) \right)
V~=m1i=1∑mlog(D(G(zi)))
或者是
V
~
=
1
m
∑
i
=
1
m
log
(
1
−
D
(
G
(
z
i
)
)
)
\tilde { V } = \frac { 1 } { m } \sum _ { i = 1 } ^ { m } \log \left( 1-D \left( G \left( z ^ { i } \right) \right) \right)
V~=m1i=1∑mlog(1−D(G(zi)))
反向优化 注意此时只优化生成器的参数
对于正向传播的第一个函数来说朝着使损失函数
V
~
\tilde { V }
V~最大化的方向优化。对于正向传播的第二个函数来说朝着使损失函数
V
~
\tilde { V }
V~最小化的方向优化。
θ
g
←
θ
g
−
η
∇
V
~
(
θ
g
)
\theta _ { g } \leftarrow \theta _ { g } - \eta \nabla \tilde { V } \left( \theta _ { g } \right)
θg←θg−η∇V~(θg)
算法的训练过程如下图(图中给出的是,优化生成器时正向传播使用的第一个公式)
参考文档
Generative Adversarial Nets 论文
论文阅读——《Generative Adversarial Nets》