面试的时候讨论过这个问题,我觉得这个问题可以深度思考一下,顺便回顾一下梯度的计算方法
1、softmax+cross_entroy
这里只考虑后面的损失函数,前面的卷积输出,由模拟数据代替,这里
z
1
,
z
2
,
z
3
z_1, z_2,z_3
z1,z2,z3是网络最后一层的输出,这里我给出了虚假数据
z
1
=
−
1.4694
,
z
2
=
−
2.2030
,
z
3
=
2.4750
z_1= -1.4694,z_2 = -2.2030,z_3 = 2.4750
z1=−1.4694,z2=−2.2030,z3=2.4750,
z
1
,
z
2
,
z
3
z_1, z_2,z_3
z1,z2,z3经过softmax之后得到概率值
p
1
=
0.0188
,
p
2
=
0.0090
,
p
3
=
0.9721
p_1=0.0188,p_2 = 0.0090,p_3 = 0.9721
p1=0.0188,p2=0.0090,p3=0.9721,得到的概率,在进入到cross_entroy,计算得到loss值,loss的计算公式如下:
L
o
s
s
=
−
∑
i
3
y
i
∗
l
o
g
(
p
i
)
Loss = -\sum_i^3{y_i*log(p_i)}
Loss=−i∑3yi∗log(pi)
其中,输入标签y=0类别,因此转换为one_hot y = [1,0,0]
1.2、softmax+cross_entroy下,计算 z i z_i zi处的梯度值
下图是计算
z
1
,
z
2
,
z
3
z_1, z_2, z_3
z1,z2,z3处的梯度值,梯度计算完,总结下来是:
φ
L
o
s
s
φ
z
i
=
{
p
i
−
1
,
i = y
p
i
,
i
≠
y
\frac{\varphi Loss}{\varphi z_i} = \begin{cases} p_i - 1, & \text {i = y} \\ p_i, & \text{i $\neq$y} \end{cases}
φziφLoss={pi−1,pi,i = yi =y
这里关于梯度值性质的分析,请看这里王峰大神的知乎Softmax理解之二分类与多分类,超级醍醐灌顶,需要反复去看,理解!
2、sigmoid + binary_cross_entroy
这里我们用三个sigmoid + binary_cross_entroy来替换softmax,输入数据
z
1
=
−
1.4694
,
z
2
=
−
2.2030
,
z
3
=
2.4750
z_1= -1.4694,z_2 = -2.2030,z_3 = 2.4750
z1=−1.4694,z2=−2.2030,z3=2.4750是一样的,经过sigmoid之后,得到的概率,变为
p
1
=
0.1870
,
p
2
=
0.0995
,
p
3
=
0.9224
p_1=0.1870,p_2 = 0.0995,p_3 = 0.9224
p1=0.1870,p2=0.0995,p3=0.9224,binary_cross_entroy的公式为
−
[
y
∗
l
o
g
(
p
)
+
(
1
−
y
)
∗
l
o
g
(
1
−
p
)
]
-[y*log(p)+(1-y)*log(1-p)]
−[y∗log(p)+(1−y)∗log(1−p)],最后loss的是三个loss求平均值:
L
o
s
s
=
−
1
3
∑
i
3
−
[
y
i
∗
l
o
g
(
p
i
)
+
(
1
−
y
i
)
∗
l
o
g
(
1
−
p
i
)
]
Loss = -\frac{1}{3}\sum_i^3{-[y_i*log(p_i)+(1-y_i)*log(1-p_i)]}
Loss=−31i∑3−[yi∗log(pi)+(1−yi)∗log(1−pi)]
2.2、sigmoid+binary_cross_entroy下,计算 z i z_i zi处的梯度值
下图是计算
z
1
,
z
2
,
z
3
z_1, z_2, z_3
z1,z2,z3处的梯度值,梯度计算完,总结下来是:
φ
L
o
s
s
φ
z
i
=
{
(
p
i
−
1
)
/
3
,
i = y
p
i
/
3
,
i
≠
y
\frac{\varphi Loss}{\varphi z_i} = \begin{cases} (p_i - 1)/3, & \text {i = y} \\ p_i /3, & \text{i $\neq$y} \end{cases}
φziφLoss={(pi−1)/3,pi/3,i = yi =y
上面计算时,发现梯度都除以了3,为了和softmax + cross_entroy的梯度做比较,那么我们可以把loss值由平均值改为求和:
L
o
s
s
=
−
∑
i
3
−
[
y
i
∗
l
o
g
(
p
i
)
+
(
1
−
y
i
)
∗
l
o
g
(
1
−
p
i
)
]
Loss = -\sum_i^3{-[y_i*log(p_i)+(1-y_i)*log(1-p_i)]}
Loss=−i∑3−[yi∗log(pi)+(1−yi)∗log(1−pi)]
3、两种方式的计算梯度的公式
那么我们计算的sigmoid + binary_cross_entroy的梯度如下:
φ
L
o
s
s
φ
z
i
=
{
p
i
−
1
,
i = y
p
i
,
i
≠
y
\frac{\varphi Loss}{\varphi z_i} = \begin{cases} p_i - 1, & \text {i = y} \\ p_i , & \text{i $\neq$y} \end{cases}
φziφLoss={pi−1,pi,i = yi =y
φ
L
o
s
s
φ
z
1
=
−
0.813
,
φ
L
o
s
s
φ
z
2
=
0.0995
,
φ
L
o
s
s
φ
z
3
=
0.9224
\frac{\varphi Loss}{\varphi z_1} = -0.813, \frac{\varphi Loss}{\varphi z_2} = 0.0995, \frac{\varphi Loss}{\varphi z_3} = 0.9224
φz1φLoss=−0.813,φz2φLoss=0.0995,φz3φLoss=0.9224
我们也得到了softmax + cross_entroy计算的梯度如下:
φ
L
o
s
s
φ
z
i
=
{
p
i
−
1
,
i = y
p
i
,
i
≠
y
\frac{\varphi Loss}{\varphi z_i} = \begin{cases} p_i - 1, & \text {i = y} \\ p_i , & \text{i $\neq$y} \end{cases}
φziφLoss={pi−1,pi,i = yi =y
φ
L
o
s
s
φ
z
1
=
−
0.9812
,
φ
L
o
s
s
φ
z
2
=
0.0090
,
φ
L
o
s
s
φ
z
3
=
0.9721
\frac{\varphi Loss}{\varphi z_1} = -0.9812, \frac{\varphi Loss}{\varphi z_2} = 0.0090, \frac{\varphi Loss}{\varphi z_3} = 0.9721
φz1φLoss=−0.9812,φz2φLoss=0.0090,φz3φLoss=0.9721
可以看到,两种方法,计算梯度的方式都是一样的,那么唯一影响梯度的值,输入的网络估计值 z i z_i zi是一样的,那么,二者唯一的区别点就是softmax和sigmoid这两个函数了。
3.2、softmax和sigmoid
softmax函数如下:
s
o
f
t
m
a
x
(
z
i
)
=
e
z
i
∑
i
k
e
z
k
\begin{aligned} softmax(z_i) & = \frac{e^{z_i}}{\sum_i^k{e^{z_k}}} \end{aligned}
softmax(zi)=∑ikezkezi
sigmoid函数如下:
s
i
g
m
o
i
d
(
z
i
)
=
1
1
+
e
−
z
i
sigmoid(z_i) = \frac{1}{1 + e^{-z_i}}
sigmoid(zi)=1+e−zi1
3.2、两类时,softmax和sigmoid完全等价
当softmax为二类时,softmax公式可以简化为:
s
o
f
t
m
a
x
(
z
1
)
=
1
1
+
e
z
2
−
z
1
softmax(z_1) = \frac{1}{1 + e^{z_2-z_1}}
softmax(z1)=1+ez2−z11
s
i
g
m
o
i
d
(
z
1
)
=
1
1
+
e
−
z
1
sigmoid(z_1) = \frac{1}{1 + e^{-z_1}}
sigmoid(z1)=1+e−z11
可以看到,二者的不同是在 − z 1 和 z 2 − z 1 -z1和z_2-z_1 −z1和z2−z1,二者是一种线性变换,-z1完全可以替代z2-z1,完全可以由z1替代,因此,softmax为二类时,softmax和sigmoid是完全相同的。
3.3、两类时,softmax的梯度关系
那么我们来计算一下softmax二分类时的梯度值:
我们知道,不管是softmax还是sigmoid,梯度的计算方式都是一样的,即
φ
L
o
s
s
φ
z
i
=
{
p
i
−
1
,
i = y
p
i
,
i
≠
y
\frac{\varphi Loss}{\varphi z_i} = \begin{cases} p_i - 1, & \text {i = y} \\ p_i , & \text{i $\neq$y} \end{cases}
φziφLoss={pi−1,pi,i = yi =y
当y = [1, 0]
φ L o s s φ z 1 = p 1 − 1 , φ L o s s φ z 2 = p 2 \frac{\varphi Loss}{\varphi z_1} = p_1 - 1, \frac{\varphi Loss}{\varphi z_2} = p_2 φz1φLoss=p1−1,φz2φLoss=p2
因为softmax中 p 2 + p 1 = 1 , 即 p 2 = 1 − p 1 p_2 + p_1 = 1,即 p_2 = 1 - p_1 p2+p1=1,即p2=1−p1,因此:
φ
L
o
s
s
φ
z
1
=
p
1
−
1
,
φ
L
o
s
s
φ
z
2
=
1
−
p
1
\frac{\varphi Loss}{\varphi z_1} = p_1 - 1, \frac{\varphi Loss}{\varphi z_2} = 1 - p_1
φz1φLoss=p1−1,φz2φLoss=1−p1
所以,softmax二分类时
z
1
z_1
z1和
z
2
z_2
z2处的导数是梯度方向相反,幅度相等。
3.4、多类时,softmax其实是多个二分类器的线性组合
请看这里王峰大神的知乎Softmax理解之二分类与多分类
从上面的例子可以得到:
φ L o s s φ z 1 = − 0.9812 , φ L o s s φ z 2 = 0.0090 , φ L o s s φ z 3 = 0.9721 \frac{\varphi Loss}{\varphi z_1} = -0.9812, \frac{\varphi Loss}{\varphi z_2} = 0.0090, \frac{\varphi Loss}{\varphi z_3} = 0.9721 φz1φLoss=−0.9812,φz2φLoss=0.0090,φz3φLoss=0.9721
发现目标分数
z
1
z_1
z1可以拆分为:
−
0.9812
=
−
0.0090
−
0.9721
-0.9812 = -0.0090 - 0.9721
−0.9812=−0.0090−0.9721
-0.0090与 z 2 z_2 z2处的梯度是一对正负梯度, - 0.9721与 z 3 z_3 z3处的梯度是一对正负梯度,我们上面说过,二分类时, z 1 和 z 2 z_1和z_2 z1和z2处的梯度是正负梯度,因此我们可以这样理解,对于每一个类别,Softmax实际上是训练了C-1个二分类器的线性组合,而这 C-1个二分类器的权重恰好等于非目标概率 ,那么对于这个类别来说,只需要训练 C ∗ ( C − 1 ) 2 \frac{C*(C-1)}{2} 2C∗(C−1)个分类器,对于3个类别来说,是三个分类器,即1vs2,2vs3,3vs1。
3.5、多类时,softmax与sigmoid的区别
例如3类时,softmax其实是3个二元分类器的线性组合,即1vs2,2vs3,3vs1。
而3类时,sigmoid也是3个二元分类器,即1vs非1,2vs非2,3vs非3