监督学习中的损失函数
1 分类问题
对于二分类问题,Y = {1, 0}, 我们希望 f ( x i , θ ) = y i f(x_i,θ)=y_i f(xi,θ)=yi
1.1 0-1 损失
,最自然的损失函数是 0-1 损失,即
可以写为简洁形式,
L
0
−
1
(
f
,
y
)
=
I
(
f
y
<
=
0
)
L_{0-1}(f,y)=I(fy<=0)
L0−1(f,y)=I(fy<=0),
I
(
P
)
I(P)
I(P) 为指示函数,当且仅当P为真时时取 1,否则取 0。该损失函数能够直观地刻画分类的错误率,但是由于其非凸 、 非光滑的特点 ,使得算法很难直接对该函数进行优化
1.2 Hinge 损失函数
0-1函数的一个代理函数是 Hinge 损失函数:
L
h
i
n
g
e
(
f
,
y
)
=
m
a
x
(
0
,
1
−
f
y
)
L_{hinge}(f,y)=max(0, 1-fy)
Lhinge(f,y)=max(0,1−fy)
Hinge 损失在
f
y
=
1
fy=1
fy=1 处不可导,因此不能用梯度下降法进行优化 , 而是用次梯度下降法(Subgradient Descent Method)
1.3 Logistic 损失函数
0-1 损失的另一个代理损失函数是 Logistic 损失函数:
·
L
l
o
g
i
s
t
i
c
(
f
,
y
)
=
l
o
g
2
(
1
+
e
x
p
(
−
f
y
)
)
L_{logistic}(f,y)=log_2(1+exp(-fy))
Llogistic(f,y)=log2(1+exp(−fy))
该函数处处光滑,因此可以用梯度下降法进行优化。但是,该损失函数对所有的样本点都有所惩罚,因此对异常值相对重敏感一些
1.4 交叉熵
当预测值
f
∈
[
−
1
,
1
]
f∈[-1,1]
f∈[−1,1] 时,常用的另一个代理损失是交叉熵损失函数:
以上四个损失函数曲线:
2 回归问题
对于回归问题, $y = R $,我们希望 f ( x i , θ ) ≈ y i f(x_i, θ)≈y_i f(xi,θ)≈yi
2.1 平方损失函数
最常用的损失函数是平方损失函数
L
s
q
u
a
r
e
(
f
,
y
)
=
(
f
−
y
)
2
L_{square}(f,y)=(f-y)^2
Lsquare(f,y)=(f−y)2
平方损失函数是光渭函数,能够用梯度下降法进行优化 。然而,当预测值距离真实值较远时,平方损失函数的惩罚力度较大,它对异常点敏感
2.2 绝对损失函数
L
a
b
s
o
u
t
e
(
f
,
y
)
=
∣
f
−
y
∣
L_{absoute}(f,y)=|f-y|
Labsoute(f,y)=∣f−y∣
绝对损失函数相当于是在做中值回归,相比做均值回归的平方损失函数,绝对损失函数对异常点更鲁棒一些.但是,绝对损失函数在
f
=
y
f=y
f=y 处无法求导数 。
2.3 Huber 损失函数
综合考虑可导性和对异常点的鲁棒性,可以采用 Huber 损失函数
Huber函数在
∣
f
−
y
∣
|f-y|
∣f−y∣ 较小时为平方损失,在
∣
f
−
y
∣
|f-y|
∣f−y∣ 较大时为线性损失,处处可到,且对异常点鲁棒
import matplotlib.pyplot as plt
import numpy as np
xmin, xmax = -4, 4
xx = np.linspace(xmin, xmax, 100)
plt.plot([xmin, 0, 0, xmax], [1, 1, 0, 0], 'k-', label="Zero-one loss")
plt.plot(xx, np.where(xx < 1, 1 - xx, 0), 'g-', label="Hinge loss")
plt.plot(xx, np.log2(1 + np.exp(-xx)), 'r-', label="Log loss")
plt.plot(xx, np.exp(-xx), 'c-', label="Exponential loss")
plt.plot(xx, -np.minimum(xx, 0), 'm-', label="Perceptron loss")
plt.ylim((0, 8))
plt.legend(loc="upper right")
plt.xlabel(r"Decision function $f(x)$")
plt.ylabel("$L(y, f(x))$")
plt.show()