线性分类器的分类函数是
f
(
X
)
=
W
X
+
B
f(X) = WX+B
f(X)=WX+B
其中
X
X
X是特征,
W
W
W是权重矩阵,其行数等于类别数,B是偏置,如果定义
X
′
=
(
X
,
1
)
X'=(X,1)
X′=(X,1),分类函数可以写成
f
(
X
′
)
=
W
X
′
f(X')= WX'
f(X′)=WX′
所以以下讨论忽略偏置B。线性分类器输出是一个向量,维度等于类别数目,每个元素的取值范围
(
−
inf
,
inf
)
(-\inf, \inf)
(−inf,inf),X被判定为数值最大的维度对应的类别
线性分类器的形式很简单,但用途广泛,下面按照cost 函数不同一一列举
L2 loss
欧式距离损失函数,这个loss历史应该最为悠久
L
=
1
N
∑
i
(
s
i
−
s
i
′
)
2
L = \frac{1}{N} \sum_i{(s_i - s'_i)^2}
L=N1i∑(si−si′)2
神经网络也使用过L2 loss
hinge loss
先看一个例子,下表是3分类问题的输出结果,表格中的数值是分类器输出,不是概率值,但越大的值表示越可能属于对应类别。所以这个例子中,前两行正确分类,最后一行真实类别是car,但被错误分类成dog。
dog | cat | car | |
---|---|---|---|
dog | 2.2 | -9 | 1 |
cat | 0.3 | 3 | 2 |
car | 4 | 0.1 | 3 |
第一行表示真实类别是dog,分类器输出对应dog的值是2.2,对应cat的值是-9,对应car的值是1。则这个样本对应的hinge loss就是
L
(
d
o
g
)
=
m
a
x
(
0
,
1
+
(
−
9
)
−
2.2
)
+
m
a
x
(
0
,
1
+
1
−
2.2
)
=
7.8
+
0
=
7.8
L(dog) = max(0, 1+(-9)-2.2) + max(0, 1+1-2.2) = 7.8 + 0 = 7.8
L(dog)=max(0,1+(−9)−2.2)+max(0,1+1−2.2)=7.8+0=7.8
同理第二行对应的样本的loss是
L
(
c
a
t
)
=
m
a
x
(
0
,
1
+
0.3
−
3
)
+
m
a
x
(
0
,
1
+
2
−
3
)
=
0
+
0
=
0
L(cat) = max(0, 1+0.3-3) + max(0, 1+2-3) = 0 + 0 = 0
L(cat)=max(0,1+0.3−3)+max(0,1+2−3)=0+0=0
hinge loss的公是如下
L
(
x
i
)
=
∑
j
≠
i
m
a
x
(
0
,
m
a
r
g
i
n
+
s
j
−
s
i
)
L(x_i) = \sum_{j \neq i} max(0, margin+s_j - s_i)
L(xi)=∑j̸=imax(0,margin+sj−si)
其中
s
i
s_i
si和
s
j
s_j
sj是分类器的输出,
x
i
x_i
xi是输入样本,
s
i
s_i
si是真实类别对应的输出,
s
j
s_j
sj是错误类别对应的输出,margin是一个超参,上面的例子里
m
a
r
g
i
n
=
1
margin=1
margin=1。考虑下hinge loss什么时候不等于0?
- s j ≤ s i − m a r g i n s_j \leq s_i - margin sj≤si−margin时,分类正确,对应的hinge loss = 0
- s i − m a r g i n < s j < s i s_i - margin < s_j < s_i si−margin<sj<si时,分类正确,但是hinge loss 大于0
- s j ≥ s j s_j \geq s_j sj≥sj 时,分类错误,hinge loss大于0
使用hinge loss最具代表的就是SVM。
交叉熵损失函数
交叉熵可以描述两个分布之间的差异,对于两个分布
{
a
i
}
\{a_i\}
{ai}和
{
b
i
}
\{b_i\}
{bi},其中
i
=
0
,
1
,
.
.
.
,
N
i=0,1,...,N
i=0,1,...,N,二者之间的交叉熵定义为
C
E
(
a
,
b
)
=
−
∑
i
=
0
N
a
i
l
o
g
b
i
CE(a,b) = -\sum_{i=0}^{N}{a_i log{b_i}}
CE(a,b)=−i=0∑Nailogbi
交叉熵描述两个分布之间差异,交叉熵越大,差异越大。
PS:为什么交叉熵描述分布之间的差异? 相对熵,又称KL散度才是描述两个分布的差异,而交叉熵是KL散度的一项,在给定两个分布的前提下,另一项是固定的,所以此时交叉熵就可以用来表示两个分布的差异了
使用交叉熵损失函数最具代表性的就是神经网络,另外逻辑回归也是用的交叉熵损失函数
softmax函数
分类问题中使用的one-hot编码可以看作是一种概率分布,其每个元素满足[0,1],如果要利用交叉熵loss,则要求分类器输出的也是概率分布,虽然可以min-max方式归一化,但更常用的是softmax函数,因为softmax和交叉熵组合后的导数有不少优势,这个在以后涉及求导时再解释。
如前面的例子,第一行对应样本softmax loss
L
(
d
o
g
)
=
e
2.2
e
2.2
+
e
−
9
+
e
1
L(dog) = \frac{e^{2.2}}{e^{2.2} + e^{-9} + e^{1}}
L(dog)=e2.2+e−9+e1e2.2
第二行对应样本的softmax loss
L
(
c
a
t
)
=
e
0.3
e
0.3
+
e
3
+
e
2
L(cat) = \frac{e^{0.3}}{e^{0.3} + e^{3} + e^{2}}
L(cat)=e0.3+e3+e2e0.3
softmax loss的数学公是
L
(
x
i
)
=
e
s
i
∑
j
e
s
j
L(x_i) = \frac{e^{s_i}}{\sum_j{e^{s_j}}}
L(xi)=∑jesjesi
其中
s
j
s_j
sj是分类器预测结果中第j类的值,而样本
x
i
x_i
xi对应的真实类别就是
i
i
i
某个样本的softmax loss的取值范围是[0,1],可以看作是一个概率分布
regulation
regulation的作用是避免网络参数出现太大的值,出现太大的值就容易出现过拟合。当一个模型在训练集(或者还有验证集)上表现优异,而在测试集上表现很差,就是模型学习到一些只属于训练集,而不属于测试集的特征,假设训练集和测试集有足够的代表性,那么模型学习到的就是训练集里的属于噪声的特征。从另一个角度来解释,模型中某个参数如果太大,那么和这个参数计算的特征发生较小的变化,这个变化会被放大,导致模型对这个特征很敏感,很多时候这不是我们所期望的。
L1和L2正则项
这两个是最长使用的正则化条件
L
2
:
L
+
C
∑
w
2
L2: L+C\sum{w^2}
L2:L+C∑w2
L
1
:
L
+
C
∑
∣
w
∣
L1: L+C\sum{|w|}
L1:L+C∑∣w∣
相对而言,L1正则项容易令w为0,即模型中很多参数为零0,称为稀疏化,一般认为参数稀疏化有助于提高模型泛化能力。为什么L1正则项更容易令参数为0? 可以从导数的角度解释:L1范数在0点是不可导的,即其左右两侧符号不同,加了L1的损失函数
L
′
=
L
+
C
∑
∣
w
∣
L' = L+C\sum|w|
L′=L+C∑∣w∣
导数
d
L
′
=
d
L
+
C
∑
s
i
g
n
(
w
)
dL' = dL + C\sum{sign(w)}
dL′=dL+C∑sign(w)
因为在某个参数
w
i
w_i
wi为0的左右两侧,
C
s
i
g
n
(
w
i
)
Csign(w_i)
Csign(wi)异号,则关于这个参数
w
i
w_i
wi,
d
L
′
∈
[
d
L
−
C
,
d
L
+
C
]
dL' \in [dL - C, dL + C]
dL′∈[dL−C,dL+C]
显然,只要C不小于
d
L
dL
dL在
w
i
=
0
w_i = 0
wi=0处的值,则
d
L
′
dL'
dL′在
w
i
=
0
w_i = 0
wi=0处存在一个极小值点(这个点左右两侧异号,则必是极值点)。虽然所有学习方法都希望找到全集最小值点,但实际中很多算法都是在找局部极小值,然后再进一步尝试搜索局部极大值点,所以通过增加L1正则项,在参数
w
i
=
0
w_i=0
wi=0处生成loss函数的一个局部极小值,吸引优化算法尝试令参数
w
i
=
0
w_i=0
wi=0