最近一直在消化、吸收大神的输出,在这里主要把思路捋顺,试着增加自己的理解和扩展。 首先,上链接,还有我的膝盖,拜王峰大神,可以直接看大神的文字! 从最优化的角度看待Softmax损失函数 Softmax理解之Smooth程度控制
一、优化的目标函数
做分类的都知道,softmax交叉熵,是常用的分类损失函数,那么,它是怎么来的呢? 用CNN提取n维特征之后,我们想要拿这个n维特征,去预测,是狗,是猫,还是人?怎么预测呢,总不能直接拿n维特征吧,我们想要只想知道,是狗,是猫,还是人。为了解决这个问题,我们将n维特征经过一个线性变换,让cnn网络输出3分数,论文里面常叫做logit,来告诉我们,是猫多少分,是狗多少分,是人多少分。如果真实类别是狗,那么我们的目标函数希望,狗的分数,要比猫和人的分数都高,可以这么说,输出C个分数,时目标分数比最大的非目标分数更大:
l
o
s
s
=
max
?
(
max
?
i
≠
y
z
i
?
z
y
,
0
)
(1)
loss = \max(\max_{i \neq y}{z_i} - z_y, 0)\tag{1}
loss=max(i?=ymax?zi??zy?,0)(1) 其中,
z
y
z_y
zy?是我们的目标分数,即是狗的分数。当然,这个目标函数之前,还有一些其他的,可自己去看王峰大神的博客。 注意看,公式(1),每次都从非目标中挑出一个最大值参与目标函数,那么,也就是说,每次,最多只有一个正梯度(因为只有一个非目标分数)和一个负梯度(只有一个目标分数),那这优化起来也太慢了吧,于是,max的smooth版本就出来了。
二、目标函数的第一次smooth:LogSumExp
LogSumExp函数如下:
L
S
E
=
l
o
g
∑
i
n
e
x
p
(
x
i
)
LSE = log \sum_{i}^nexp(x_i)
LSE=logi∑n?exp(xi?) 二者的关系是:
L
S
E
>
=
m
a
x
LSE >= max
LSE>=max 至于为啥,这个真的是非常数学的东西了,感兴趣的,可以自行去google,这里再次膜拜一下数学,学好数学,称霸天下! 用上LSE,就会发现,非目标分数的最大值,不管选择了谁,都和其他非目标分数扯上了关系,这样,其他非目标分数的分支,也会有梯度了。 smooth之后的目标函数如下:
l
o
s
s
l
s
e
=
max
?
(
l
o
g
∑
i
=
1
,
i
≠
y
C
e
z
i
?
z
y
,
0
)
loss_{lse} = \max(log \sum_{i=1,i \neq y}^Ce^{z_i} - z_y,0)
losslse?=max(logi=1,i?=y∑C?ezi??zy?,0)
不懂之处:峰神说,使用LogSumExp函数相当于变相地加了一定的m???
三、目标函数的第二次smooth:softmax交叉熵
峰神说了,接着smooth,Relu函数
max
?
(
x
,
0
)
\max(x,0)
max(x,0)也有一个smooth版本,即softplus函数,
l
o
g
(
1
+
e
x
)
log(1+e^x)
log(1+ex),那么用这个函数,接着smooth
L
s
o
f
t
m
a
x
=
l
o
g
(
1
+
e
l
o
g
(
∑
i
=
1
,
i
≠
y
C
e
z
i
)
?
z
y
)
=
l
o
g
(
1
+
∑
i
=
1
,
i
≠
y
C
e
z
i
e
z
y
)
=
l
o
g
∑
i
=
1
C
e
z
i
e
z
y
=
?
l
o
g
e
z
y
∑
i
=
1
C
e
z
i
\begin{aligned} L_{softmax} & = log(1 + e^{log (\sum_{i=1,i \neq y}^Ce^{z_i}) - z_y}) \\ &=log(1+ \frac{\sum_{i=1,i \neq y}^Ce^{z_i}}{e^{z_y}}) \\ &= log{\frac{\sum_{i=1}^Ce^{z_i}}{e^{z_y}}} \\ &= -log{\frac{e^{z_y}}{\sum_{i=1}^Ce^{z_i}}} \end{aligned}
Lsoftmax??=log(1+elog(∑i=1,i?=yC?ezi?)?zy?)=log(1+ezy?∑i=1,i?=yC?ezi??)=logezy?∑i=1C?ezi??=?log∑i=1C?ezi?ezy??? 这个就是我们熟知的softmax交叉熵。
所以我们常用的softmax,其实不是max的smooth版本,max函数输出的是一个最大值,而softmax更倾向的是argmax,类似[1,0,0]。
|