GAN网络经常会见到或用到,但感觉对其理解不够深入,写此博客记录一下,方便今后查阅。只看笔记估计很难看懂,推荐两个视频:
晟腾CANN训练营
GAN论文精读
#pic_center =x250)
GAN的整个训练对抗过程可以由下式表示出来:
min G max D V ( D , G ) = E x ∼ p data ( x ) [ log D ( x ) ] + E z ∼ p z ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \min _G \max _D V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data }}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{z} \sim p_{\boldsymbol{z}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))] minGmaxDV(D,G)=Ex∼pdata (x)[logD(x)]+Ez∼pz(z)[log(1−D(G(z)))]
其中G(generator)是想让整个式子的值V尽可能小,而D(discriminator)想让V尽可能大。

简单来说其训练过程如下:

观察G和D都有的损失项:
J
(
G
)
=
1
2
E
z
log
(
1
−
D
(
G
(
z
)
)
)
J^{(G)}=\frac{1}{2} \mathbb{E}_{\boldsymbol{z}} \log (1-D(G(\boldsymbol{z})))
J(G)=21Ezlog(1−D(G(z)))
图中Minimax(零和博弈)线是该损失项关于D(G(z))的曲线,在网络训练初期,G所生成的图像很好判断,D会给他很低的置信度,这时梯度是很小的,网络的学习很慢,只有当后期时D较难判断时,更新梯度才会较大。
但我们肯定希望是G生成较差时(训练初期)会有较大梯度进行更新才对。
所以实际使用中,我们选择非饱和启发式博弈(Non-saturating heuristic):
J
(
G
)
=
−
1
2
E
z
log
D
(
G
(
z
)
)
J^{(G)}=-\frac{1}{2} \mathbb{E}_{\boldsymbol{z}} \log D(G(\boldsymbol{z}))
J(G)=−21EzlogD(G(z))
观察它的梯度,是更合适的:初期训练时梯度较大,后期较小。
P
data
(
x
)
P_{\text {data }}(\mathrm{x})
Pdata (x) :真实图片分布,
P
G
(
x
,
θ
)
:
G
P_G(x, \theta): G
PG(x,θ):G 生成的图片分布,
θ
\theta
θ是生成器G的参数,
在真实分布中取一些数据
{
x
1
,
x
2
,
…
,
x
m
}
\left\{x^1, x^2, \ldots, x^m\right\}
{x1,x2,…,xm},
生成模型的最大似然估计:
L
=
∏
i
=
1
m
P
G
(
x
i
;
θ
)
L=\prod_{i=1}^m P_G\left(x^i ; \theta\right)
L=∏i=1mPG(xi;θ)
θ
∗
=
arg
max
θ
∏
i
=
1
P
G
(
x
i
;
θ
)
=
arg
max
θ
log
∏
i
=
1
m
P
G
(
x
i
;
θ
)
=
arg
max
θ
∑
i
=
1
m
log
P
G
(
x
i
;
θ
)
≈
arg
max
θ
E
z
∼
P
data
[
log
P
G
(
x
;
θ
)
]
=
arg
max
θ
∫
z
P
data
(
x
)
log
P
G
(
x
;
θ
)
d
x
−
∫
x
P
data
(
x
)
log
P
data
(
x
)
d
x
=
arg
max
θ
∫
x
P
data
(
x
)
(
log
P
G
(
x
;
θ
)
−
log
P
data
(
x
)
)
d
x
=
arg
min
θ
∫
x
P
data
(
x
)
log
P
data
(
x
)
P
G
(
x
;
θ
)
d
x
=
arg
min
θ
K
L
(
P
data
(
x
)
∥
P
G
(
x
;
θ
)
)
最后可推得:求 θ ∗ \theta^* θ∗就是求使得 P data ( x ) P_{\text {data }}(x) Pdata (x) 与 P G ( x ; θ ) P_G(x ; \theta) PG(x;θ)的KL散度最小(两者相等时)时 θ \theta θ的取值。
基于GAN的对抗过程:
min
G
max
D
V
(
D
,
G
)
=
E
x
∼
p
data
(
x
)
[
log
D
(
x
)
]
+
E
x
∼
p
x
(
z
)
[
log
(
1
−
D
(
G
(
z
)
)
)
]
\min _G \max _D V(D, G)=\mathbb{E}_{\boldsymbol{x} \sim p_{\text {data}}(\boldsymbol{x})}[\log D(\boldsymbol{x})]+\mathbb{E}_{\boldsymbol{x} \sim p_{\boldsymbol{x}}(\boldsymbol{z})}[\log (1-D(G(\boldsymbol{z})))]
minGmaxDV(D,G)=Ex∼pdata(x)[logD(x)]+Ex∼px(z)[log(1−D(G(z)))]

那么固定G,且由上图的定律,那么V就可以由下式的结果表达
V
=
E
x
∼
P
data
[
log
D
(
x
)
]
+
E
x
∼
P
G
[
log
(
1
−
D
(
x
)
)
]
=
∫
x
P
data
(
x
)
log
D
(
x
)
d
x
+
∫
x
P
G
(
x
)
log
(
1
−
D
(
x
)
)
d
x
=
∫
x
[
P
data
(
x
)
log
D
(
x
)
+
P
G
(
x
)
log
(
1
−
D
(
x
)
)
]
d
x
接下来解
D
∗
(
x
)
D^*(x)
D∗(x):

将解得的
D
∗
(
x
)
D^*(x)
D∗(x)带入原式中,得到下式:

最后V推导成了Jensen-Shannon散度与一个常数的和。
其中Jensen-Shannon散度如下式定义,是一个对称量。

所以可以这么说:
在优化判别器D时,其实是在学习如何度量JS散度(度量得更准)。
在优化生成器G时,其实是在最小化JS散度。
有些理论目前看不懂,先记下来吧

上面这个结论大概的意思就是JS散度容易为0,有点类似于坏死不起作用的情况。

前面有提到具体使用时一般使用非饱和启发式博弈替代零和博弈:

最小化KL散度和最大化JS散度是相反的两个任务。所以不好训练。

回顾全程:
我们由对抗博弈的过程推导出其实GAN网络的优化过程和KL和JS散度有关,由于这最小化两个散度有各种问题,也就解释了GAN不好训练。

JS散度问题很多,作者尝试换个指标去衡量:

上图 CD和AB两个分布,其KL,JS散度以及Wasserstein距离如下:
K
L
⟨
P
1
∥
P
2
)
=
K
L
(
P
1
∥
P
2
)
=
{
+
∞
if
θ
≠
0
0
if
θ
=
0
J
S
(
P
1
∥
P
2
)
=
{
log
2
if
θ
≠
0
0
if
θ
−
0
W
(
P
0
,
P
1
)
=
∣
ϕ
˙
∣
(क्ष)
此时JS散度可以说是坏死的,但W距离仍能工作。
我们看如何使GAN去优化W距离:

所以对GAN做了如下修改:
GAN不好训练的问题得到了很好的解决。

给GAN个标签,让其只生成这一类别的标签。


暂时没时间去了解,先放着吧