未完待续…
1. 激活函数
1.1 sigmoid
公式:
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
−
x
sigmoid(x) = \frac{1}{1 + e^{-x}}
sigmoid(x)=1+e−x1
从零开始:
import munpyt as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
pytorch公式:
import torch
def sigmoid(x):
"""
利用 PyTorch 实现 Sigmoid 函数
"""
return torch.nn.functional.sigmoid(x)
1.2 softmax
公式:
s
o
f
t
m
a
x
(
x
)
i
=
e
x
i
∑
j
=
1
n
e
x
j
softmax(x)_i = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}
softmax(x)i=∑j=1nexjexi
- i i i 表示输入向量中的第 i 个元素
- n n n 表示输入向量的长度
从零开始实现:
def softmax(X):
# 这行代码对输入向量 X 的每个元素进行指数运算,得到一个新的向量 X_exp
X_exp = X.exp()
# 这行代码对 X_exp 的每一行(即每个样本)进行求和,得到一个新的向量 partition
# dim=1 表示对每一行进行求和
# keepdim=True 表示在求和后保持 partition 的维度不变,以便后续进行除法运算。
partition = X_exp.sum(dim=1, keepdim=True)
return X_exp / partition # 这里应用了广播机制
pytorch公式:
import torch
def softmax(x):
"""
利用 PyTorch 实现 Softmax 函数
"""
return torch.nn.functional.softmax(x, dim=1)
2. 分类损失函数
在监督式机器学习中,无论是回归问题还是分类问题,都少不了使用损失函数(Loss Function)
。损失函数(Loss Function
是用来估量模型的预测值
f
(
x
)
f(x)
f(x) 与真实值
y
y
y 的不一致程度。
- 若损失函数很
小
,表明机器学习模型与数据真实分布很接近
,则模型性能良好
; - 若损失函数很
大
,表明机器学习模型与数据真实分布差别较大
,则模型性能不佳
。
我们训练模型的主要任务就是使用优化方法来寻找损失函数最小化对应的模型参数
。
在讨论分类问题的损失函数之前,我想先说一下模型的输出
g
(
s
)
g(s)
g(s)。一般来说,二分类机器学习模型包含两个部分:线性输出
s
s
s和非线性输出
g
(
s
)
g(s)
g(s)。其中,线性输出一般是模型输入
x
x
x 与 参数
w
w
w 的乘积,简写成:
s
=
w
x
s = wx
s=wx;非线性输出一般是 Sigmoid 函数,经过 Sigmoid 函数,
g
(
s
)
g(s)
g(s) 值被限定在
[
0
,
1
]
[0,1]
[0,1] 之。
- 若 s s s ≥ 0, g ( s ) g(s) g(s) ≥ 0.5,则预测为正类;
- 若 s s s < 0, g ( s ) g(s) g(s)< 0.5,则预测为负类。
关于正类和负类的表示,通常有两种方式:一种是用 {+1, -1} 表示正负类;另一种是用 {1, 0} 表示正负类。下文默认使用 {+1, -1},因为这种表示方法有种好处。如果使用 {+1, -1} 表示正负类,我们来看预测类别与真实类别的四种情况:
- s ≥ 0 , y = + 1 s ≥ 0, y = +1 s≥0,y=+1: 预测正确
- s ≥ 0 , y = − 1 s ≥ 0, y = -1 s≥0,y=−1: 预测错误
- s < 0 , y = + 1 s < 0, y = +1 s<0,y=+1: 预测错误
- s < 0 , y = − 1 s < 0, y = -1 s<0,y=−1: 预测正确
显然,上面四个式子可以整合成直接看 ys 的符号即可:
- 若 y s ≥ 0 ys ≥ 0 ys≥0,则预测正确
- 若 y s < 0 ys < 0 ys<0,则预测错误
这里的 y s ys ys 类似于回归模型中的残差y-s(其中yg(s)被称为函数间隔(“margin”));最小化分类问题中的损失函数可以看做是最大化margin的过程,任何合格的分类损失函数都应该对margin<0的样本更大的“惩罚”。因此,在比较分类问题的各个损失函数的时候,我们就可以把 ys 当作自变量 x 轴即可,这样更加方便。
2.1 交叉熵损失函数(Cross Entropy Loss)
公式:
L
(
y
,
t
)
=
−
∑
i
=
1
n
t
i
log
(
y
i
)
L(y, t) = -\sum_{i=1}^{n} t_i \log(y_i)
L(y,t)=−i=1∑ntilog(yi)
- y i y_i yi 是预测概率分布中第 i i i 个元素
- t i t_i ti 是真实概率分布中第 i i i 个元素
- n n n 是概率分布的长度
pytorch实现函数:
import torch
import torch.nn as nn
"""
nn直接实现
"""
nn.CrossEntropyLoss(
class CrossEntropyLoss(nn.Module):
def __init__(self):
super(CrossEntropyLoss, self).__init__()
def forward(self, y, t):
"""
计算交叉熵损失
"""
return -torch.sum(t * torch.log(y))
2.2 合页损失函数(Hinge Loss)
L ( y , t ) = m a x ( 0 , 1 − t ∗ y ) L(y, t) = max(0, 1 - t * y) L(y,t)=max(0,1−t∗y)
Hinge Loss 的形状就像一本要合上的书,故称为合页损失
。显然,只有当
y
s
<
1
ys < 1
ys<1 时,Loss 才大于零;对于
y
s
>
1
的情况
ys > 1 的情况
ys>1的情况,Loss 始终为零。
优点:
- Hinge Loss 一般多用于支持向量机(SVM)中,体现了 SVM 距离最大化的思想。而且,当 Loss 大于零时,是线性函数,便于梯度下降算法求导。
- Hinge Loss 的另一个优点是使得 ys > 0 的样本损失皆为 0,由此带来了稀疏解,使得 SVM 仅通过少量的支持向量就能确定最终超平面。
2.3 Huber损失函数的变形(Modified Huber Loss)
Huber Loss,结合了均方损失(MSE)
和绝对值损失(MAE)
的优点,当
∣
y
−
f
(
x
)
∣
|y-f(x)|
∣y−f(x)∣小于一个实现指定的
δ
\delta
δ 时,变为平方损失,大于
δ
\delta
δ 时变为绝对值损失,比前两者更为robust。而Huber Loss既可以用于回归问题,Huber Loss 也能应用于分类问题中,称为 Modified Huber Loss
。
优点:
- 对异常值不敏感:Huber Loss 对异常值不敏感,这意味着即使数据集中存在一些异常值,也不会对模型的训练结果产生太大的影响。
- 鲁棒性强:Huber Loss 具有较强的鲁棒性,这意味着它对模型参数的微小变化不敏感。其表达是如下:
L ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 if ∣ y − f ( x ) ∣ ≤ δ δ ( ∣ y − f ( x ) ∣ − 1 2 δ ) if ∣ y − f ( x ) ∣ > δ L(y, f(x)) = \begin{cases} \frac{1}{2}(y - f(x))^2 & \text{if } |y - f(x)| \leq \delta \\ \delta (|y - f(x)| - \frac{1}{2}\delta) & \text{if } |y - f(x)| > \delta \end{cases} L(y,f(x))={21(y−f(x))2δ(∣y−f(x)∣−21δ)if ∣y−f(x)∣≤δif ∣y−f(x)∣>δ - y y y 是样本的真实标签
- f ( x ) f(x) f(x) 是模型的预测值
- δ \delta δ 是一个超参数,称为阈值
在这里插入图片描述:
从表达式和 Loss 图形上看,Modified Huber Loss 结合了 Hinge Loss 和 交叉熵 Loss 的优点。
- 一方面能在 ys > 1 时产生
稀疏解
提高训练效率; - 另一方面对于 ys < −1 样本的惩罚以线性增加,这意味着受异常点的干扰较少。