在上一篇我们探讨了分类问题的基本概念,同时介绍了熵的概念,并解释了交叉熵和最大似然之间的关系。分类问题可以理解将两个类别 p , q p,q p,q的所属分布接近,就是最小化交叉熵
在多分类任务中输出的是目标属于每个类别的概率,所有类别的概率和为1,其中概率最大的类别就是目标所属的分类
多分类使用softmax
函数将向量的每一个分量映射到[0,1]
区间,并且将向量进行归一化,保证所有分量的输出和为1,因此在多分类任务中提取的特征最后都要经过softmax
函数,输出是每个类别的概率,然后使用交叉熵
作为损失函数
softmax
函数定义如下
S
i
=
e
z
i
∑
i
=
1
n
e
z
i
S_{i} = \frac{e^{zi}}{\sum_{i=1}^{n}e^{zi}}
Si=∑i=1neziezi
其中,输入的向量为
z
i
(
i
=
1
,
2
,
.
.
.
,
n
)
z_{i}(i=1,2,...,n)
zi(i=1,2,...,n),由此我们可以得到目标属于每个类别的概率,概率最大的就是预测得到的目标的类别
使用softmax
函数可以将特征向量映射为所属类别的概率,可以看作是预测类别的概率分布
q
(
c
i
)
q(c_{i})
q(ci),有
q
(
c
i
)
=
e
z
i
∑
i
=
1
n
e
z
i
q(c_{i}) = \frac{e^{zi}}{\sum_{i=1}^{n}e^{zi}}
q(ci)=∑i=1neziezi
其中
c
i
c_{i}
ci为某个类别,设训练数据中类别的概率分布为
p
(
c
i
)
p(c_{i})
p(ci)和预测概率分布
q
(
c
i
)
q(c_{i})
q(ci)的交叉熵为
H
(
p
,
q
)
=
−
∑
i
p
(
c
i
)
log
q
(
c
i
)
H(p,q)=-\sum_{i}p(c_{i})\log q(c_{i})
H(p,q)=−i∑p(ci)logq(ci)
每个训练样本所属的类别是已知的,并且每个样本只会属于一个类别(概率为1),属于其他类别的概率为0,具体的,可以假设有个三分类任务,分别是:猫猪狗,现有一个训练样本为猫,则
p
(
c
a
t
)
=
1
p
(
p
i
g
)
=
0
p
(
d
o
g
)
=
0
假设通过预测得到的三个类别的概率分别为:
q
(
c
a
t
)
=
0.6
,
q
(
p
i
g
)
=
0.2
,
q
(
d
o
g
)
=
0.2
q(cat)=0.6, q(pig)=0.2, q(dog)=0.2
q(cat)=0.6,q(pig)=0.2,q(dog)=0.2,计算
p
,
q
p,q
p,q的交叉熵为
H
(
p
,
q
)
=
−
[
p
(
c
a
t
)
log
q
(
c
a
t
)
+
p
(
p
i
g
)
log
q
(
p
i
g
)
+
p
(
d
o
g
)
log
q
(
d
o
g
)
]
=
−
[
1
⋅
log
0.6
+
0
⋅
log
0.2
+
0
⋅
log
0.2
]
=
−
log
0.6
=
−
log
q
(
c
a
t
)
可以看到对于猫的分类最后计算只与
q
(
c
a
t
)
q(cat)
q(cat)有关,利用这种特性可以将样本的类别进行重新编码,进而简化交叉熵的计算,这种编码方式就是one-hot
编码,以上面例子为例
c
a
t
=
(
100
)
p
i
g
=
(
010
)
d
o
g
=
(
001
)
通过这种编码,计算交叉熵熵时,只需要计算和训练样本对应类别预测概率的值,其他项都是
0
⋅
log
q
(
c
i
)
=
0
0\cdot \log q(c_{i})=0
0⋅logq(ci)=0,即
C
o
r
s
s
E
n
t
r
o
p
h
y
(
p
,
q
)
=
−
log
q
(
c
i
)
Corss~Entrophy(p,q) = -\log q(c_{i})
Corss Entrophy(p,q)=−logq(ci)
其中
c
i
c_{i}
ci为训练样本对应的类别,上式也被称为负对数似然(negative log-likelihood, nll)
多分类使用softmax
函数将最后的输出映射为每个类别的概率,在二分类中使用sigmoid
将输出映射为正样本的概率,这是因为在二分类中,只有两个类别(正样本,负样本),只需要求得正样本的概率
q
q
q,则1-q
就是负样本的概率
sigmoid
函数的表达式如下
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z) = \frac{1}{1+e^{-z}}
σ(z)=1+e−z1
sigmoid
的输入为z
,输出为(0,1)
,可以表示分类为正样本的概率,二分类的交叉熵是多分类的一个特列
C
o
r
s
s
E
n
t
r
o
p
h
y
(
p
,
q
)
=
−
∑
i
m
p
(
x
i
)
log
q
(
x
i
)
Corss~Entrophy(p,q) = -\sum_{i}^{m}p(x_{i})\log q(x_{i})
Corss Entrophy(p,q)=−i∑mp(xi)logq(xi)
因为有两个类别
x
∈
x
1
,
x
2
x\in x_{1}, x_{2}
x∈x1,x2,则有
C
o
r
s
s
E
n
t
r
o
p
h
y
(
p
,
q
)
=
−
∑
i
m
p
(
x
i
)
log
q
(
x
i
)
=
−
[
p
(
x
1
)
log
q
(
x
1
)
+
p
(
x
2
)
log
q
(
x
2
)
]
=
−
[
p
log
q
+
(
1
−
p
)
log
(
1
−
q
)
]
softmax
和sigmoid
函数的区别在于是否互斥
假设输出10类,输出通道是10
sigmoid
表示这十类互不相关,得到的10个概率值中每个值代表输入这类的概率和不属于这类的概率,都属于
[
0
,
1
]
[0,1]
[0,1],比如第一个类的概率为0.2,表示属于这个类的概率为0.2,不属于这个类的概率为0.8,并且这个概率与其他九个类没有关系。经过sigmoid
输出的10个值互不影响,只关注某一类的可能性概率有多大,每一类都是二分类,所以加起来也不等于1,可以使第一类的概率为0.9,第二个为0.8softmax
综合考虑10个类,属于每个类的概率,这10个类相互影响,和为1进一步理解
softmax
函数,而不是sigmoid
函数sigmoid
用到10分类中相当于10个分类器,10个人分别判断自己负责的类别,且相互独立。softmax
是10分类中使用1个分类器,1个人判断10个类sigmoid
函数,只不过效果较差简单来说
softmax
适用于预测结果互斥的情况,也就是label是one-hot
的情况,例如
[
0
,
0
,
1
]
[0,0,1]
[0,0,1],
[
1
,
0
,
0
]
[1,0,0]
[1,0,0]sigmoid
适用于结果不互斥的情况,就是说label是
[
1
,
1
,
0
]
,
[
1
,
1
,
1
]
[1,1,0],[1,1,1]
[1,1,0],[1,1,1]的情况