sigmoid+交叉熵为什么更好,这是困扰了我大半天的问题,网上所有的教程都直接给出了最后一步的结果,我手推了好久,终于醒悟,下面附上详细的推导过程:
我们定义并简化一下公式:
1、网络的最后一层输出为:
z
=
(
W
x
+
b
)
z=(Wx^{}+b)
z=(Wx+b)其中W为权重,b为偏置,严格来说里面的参数都是矩阵,不过我们计算就当作单独的参数,过程是一样的。
2、我们需要在输出后面加上sigmoid损失函数:
a
=
g
(
z
)
=
S
i
g
m
o
i
d
(
z
)
=
1
1
+
e
−
z
a = g(z)=Sigmoid(z)=\frac{1}{1+e^{-z}}
a=g(z)=Sigmoid(z)=1+e−z1
3、上式的a就是我们最终的输出值,与期望的输出值y,也就是真实值,共同计算损失函数。这里我们使用交叉熵损失函数:
L
=
C
E
(
a
,
y
)
=
−
[
y
ln
a
+
(
1
−
y
)
ln
(
1
−
a
)
]
L=CE(a,y)=-[y\ln a+(1-y)\ln(1-a)]
L=CE(a,y)=−[ylna+(1−y)ln(1−a)]
好了,这就是正向传播的一个输出,我们目的是反向传播得到W和b的梯度 ∂ L ∂ W \frac{\partial L}{\partial W} ∂W∂L, ∂ L ∂ b \frac{\partial L}{\partial b} ∂b∂L由于 ∂ L ∂ W = ∂ L ∂ z ∗ x \frac{\partial L}{\partial W}=\frac{\partial L}{\partial z}*x ∂W∂L=∂z∂L∗x , ∂ L ∂ b = ∂ L ∂ z \frac{\partial L}{\partial b}=\frac{\partial L}{\partial z} ∂b∂L=∂z∂L,所以我们就直接求 ∂ L ∂ z \frac{\partial L}{\partial z} ∂z∂L。
首先,把z代入最后的损失函数里面,式中g(z)就是sigmoid激活函数:
L
=
C
E
(
g
(
z
)
,
y
)
=
−
[
y
ln
g
(
z
)
+
(
1
−
y
)
ln
(
1
−
g
(
z
)
)
]
L=CE(g(z),y)=-[y\ln g(z)+(1-y)\ln(1-g(z))]
L=CE(g(z),y)=−[ylng(z)+(1−y)ln(1−g(z))]
对z求偏导:
∂
L
∂
z
=
−
[
y
∗
g
′
(
z
)
g
(
z
)
+
−
(
1
−
y
)
∗
g
′
(
z
)
(
1
−
g
(
z
)
)
]
\frac{\partial L}{\partial z}=-[\frac{y*g'(z)}{g(z)}+\frac{-(1-y)*g'(z)}{(1-g(z))}]
∂z∂L=−[g(z)y∗g′(z)+(1−g(z))−(1−y)∗g′(z)]
里面两项合并:
∂
L
∂
z
=
−
[
y
∗
g
′
(
z
)
∗
(
1
−
g
(
z
)
)
−
(
1
−
y
)
∗
g
′
(
z
)
∗
g
(
z
)
)
g
(
z
)
∗
(
1
−
g
(
z
)
)
]
\frac{\partial L}{\partial z}=-[\frac{y*g'(z)*(1-g(z))-(1-y)*g'(z)*g(z))}{g(z)*(1-g(z))}]
∂z∂L=−[g(z)∗(1−g(z))y∗g′(z)∗(1−g(z))−(1−y)∗g′(z)∗g(z))]
展开,合并之后,得到:
∂
L
∂
z
=
(
g
(
z
)
−
y
)
∗
g
′
(
z
)
g
(
z
)
∗
(
1
−
g
(
z
)
)
\frac{\partial L}{\partial z}=\frac{(g(z)-y)*g'(z)}{g(z)*(1-g(z))}
∂z∂L=g(z)∗(1−g(z))(g(z)−y)∗g′(z)
之前推到这一步,就进展不下去了。但是sigmoid还有一个重要的性质,那就是sigmoid函数的导数,
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
)
)
Sigmoid'(x)=Sigmoid(x)*(1-Sigmoid(x))
Sigmoid′(x)=Sigmoid(x)∗(1−Sigmoid(x)),我们这里的g(z)函数就是Sigmoid,仔细看一下,这个式子的分母,
g
(
z
)
∗
(
1
−
g
(
z
)
)
=
g
′
(
z
)
g(z)*(1-g(z))=g'(z)
g(z)∗(1−g(z))=g′(z)
所以最后得到的公式为:
∂
L
∂
z
=
g
(
z
)
−
y
\frac{\partial L}{\partial z}=g(z)-y
∂z∂L=g(z)−y
使用sigmoid+交叉熵的计算过程,就可以完全省去计算Sigmoid梯度这一步,从而避免了Sigmoid本身弥散的致命缺点。