GAN论文:https://arxiv.org/abs/1406.2661
sigmoid
sigmoid/tanh作为映射函数,很好的把输出限制到目标区间,但是随之带来的问题是反向传播的收敛问题——梯度消失。
f ( x ) = s i g m o i d ( x ) f(x) = sigmoid(x) f(x)=sigmoid(x)
∇ f ( x ) = s i g m o i d ( x ) [ 1 − s i g m o i d ( x ) ] \nabla f(x) = sigmoid(x)[1-sigmoid(x)] ∇f(x)=sigmoid(x)[1−sigmoid(x)]
∇ f ( x ) = f ( x ) [ 1 − f ( x ) ] \nabla f(x) =f(x)[1-f(x)] ∇f(x)=f(x)[1−f(x)]
GAN
以生成对抗网络为例。
在论文中,对算法的伪代码描述如下:
如果在
G
G
G和
D
D
D中使用sigmoid激活函数,那在训练的收敛会出现问题。
以辨别器
D
D
D为例:
辨别器 D D D:
假设 D D D的最后一层激活函数为 s i g m o i d sigmoid sigmoid。未经过激活时的值为 D u a c t D_{uact} Duact,即
D a c t = s i g m o i d ( D u a c t ) D_{act}=sigmoid(D_{uact}) Dact=sigmoid(Duact)
设最终
l
o
s
s
loss
loss对某参数
x
x
x的反向传播梯度为
D
a
c
t
(
x
)
′
D'_{act(x)}
Dact(x)′
进一步可写成
D
a
c
t
(
u
a
c
t
)
′
∗
D
u
a
c
t
(
x
)
′
D'_{act(uact)}*D'_{uact(x)}
Dact(uact)′∗Duact(x)′
D a c t ( u a c t ) ′ ∗ D u a c t ( x ) ′ = s i g m o i d ′ ( D u a c t ) ∗ D u a c t ( x ) ′ D'_{act(uact)}*D'_{uact(x)}=sigmoid'(D_{uact})*D'_{uact(x)} Dact(uact)′∗Duact(x)′=sigmoid′(Duact)∗Duact(x)′
D a c t ( u a c t ) ′ ∗ D u a c t ( x ) ′ = s i g m o i d ( D u a c t ) ∗ ( 1 − s i g m o i d ( D u a c t ) ) ∗ D a c t ( x ) ′ D'_{act(uact)}*D'_{uact(x)}=sigmoid(D_{uact})*(1-sigmoid(D_{uact}))*D'_{act(x)} Dact(uact)′∗Duact(x)′=sigmoid(Duact)∗(1−sigmoid(Duact))∗Dact(x)′
当D对输入图像的识别结果趋紧于0或者1时
lim D → 1 / 0 s i g m o i d ( D u a c t ) ∗ ( 1 − s i g m o i d ( D u a c t ) ) = 0 \lim_{D\to1/0}sigmoid(D_{uact})*(1-sigmoid(D_{uact}))=0 D→1/0limsigmoid(Duact)∗(1−sigmoid(Duact))=0
即
lim D → 1 / 0 s i g m o i d ( D u a c t ) ∗ ( 1 − s i g m o i d ( D u a c t ) ) ∗ D a c t ( x ) ′ = 0 \lim_{D \to 1/0}sigmoid(D_{uact})*(1-sigmoid(D_{uact}))*D'_{act(x)}=0 D→1/0limsigmoid(Duact)∗(1−sigmoid(Duact))∗Dact(x)′=0
lim D → 1 / 0 D a c t ( x ) ′ = 0 \lim_{D \to 1/0}D'_{act(x)}=0 D→1/0limDact(x)′=0
在训练GAN的过程中,生成器和辨别器的损失函数应该是震荡的,考虑
- case1:生成器的能力很强,辨别器能力较弱,不能很好的识别,从而得到 D ( G ( z ) ) D(G(z)) D(G(z))趋紧于1,此时我们希望通过较大的梯度调整辨别器,因为他识别错误,但是由于上文中讨论的结果,梯度经过 s i g m o i d sigmoid sigmoid的导数影响使得参数调整幅度较小。不能很好的改进。
- case2:生成器的能力很弱,辨别器能力较强,此时 D ( G ( z ) ) D(G(z)) D(G(z))趋紧于0,但是我们希望能使用较大的梯度改进生成器,但是和case1的情况一样,梯度很小,无法显著改进生成器。
- case3:生成器和辨别器的能力都已经达到较优值,辨别器不能区分是否是真实图片和伪造图片,此时 D ( G ( z ) ) D(G(z)) D(G(z))和 D ( z ) D(z) D(z)都趋紧0.5,我们应该希望此时反向传播梯度不要太大,但是0.5*(1-0.5)是a*(1-a)中最大的情况。即网络会以较大的梯度改变已经较优的局面。这显然与我们的初衷相悖。
Summary
PS:loss使用交叉熵的话,
l
o
g
(
D
(
x
)
)
=
l
o
g
(
s
i
g
m
o
i
d
(
x
)
)
log(D(x))=log(sigmoid(x))
log(D(x))=log(sigmoid(x)),其导数为
1
s
i
g
m
o
i
d
(
x
)
∗
s
i
g
m
o
i
d
(
x
)
∗
(
1
−
s
i
g
m
o
i
d
(
x
)
)
=
1
−
s
i
g
m
o
i
d
(
x
)
\frac {1}{sigmoid(x)}*sigmoid(x)*(1-sigmoid(x))=1-sigmoid(x)
sigmoid(x)1∗sigmoid(x)∗(1−sigmoid(x))=1−sigmoid(x),就不会出现以上讨论的那种情况了~
当然在把激活函数换成ELU/RELU之流就更棒了~