4.2 深度学习中的损失函数
深度学习中的损失函数(Loss Function)是评估模型预测值与实际值之间差异的函数,它是训练过程中优化算法的目标函数。不同的任务(如分类、回归、排序等)通常会使用不同的损失函数。下面我将介绍几种常见的损失函数,包括它们的公式、优缺点,并给出使用NumPy的简单示例代码。
1. 均方误差损失(Mean Squared Error, MSE)
公式:
MSE
=
1
n
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
MSE=n1i=1∑n(yi−y^i)2
其中,
n
n
n 是样本数量,
y
i
y_i
yi 是第
i
i
i 个样本的真实值,
y
^
i
\hat{y}_i
y^i 是模型预测的第
i
i
i 个样本的预测值。
优缺点:
- 优点:计算简单,对异常值较为敏感,有助于模型找到更好的最优解。
- 缺点:如果异常值较多,模型可能会过分关注这些异常值,导致泛化能力下降。
NumPy 代码示例:
import numpy as np
def mse_loss(y_true, y_pred):
return np.mean((y_true - y_pred) ** 2)
# 示例
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])
loss = mse_loss(y_true, y_pred)
print("MSE Loss:", loss)
2. 交叉熵损失(Cross-Entropy Loss)
公式(以二分类为例):
Binary Cross-Entropy
=
−
1
n
∑
i
=
1
n
[
y
i
log
(
y
^
i
)
+
(
1
−
y
i
)
log
(
1
−
y
^
i
)
]
\text{Binary Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]
Binary Cross-Entropy=−n1i=1∑n[yilog(y^i)+(1−yi)log(1−y^i)]
对于多分类问题,通常使用Categorical Cross-Entropy,其中每个类别的预测值通过softmax函数转换为概率分布。
优缺点:
- 优点:对于分类问题,特别是输出层使用softmax激活时,交叉熵损失可以很好地衡量预测概率分布与实际概率分布之间的差异。
- 缺点:当预测概率接近0或1时,梯度会变得非常小,可能导致训练速度减慢(称为梯度消失问题)。
NumPy 代码示例(二分类):
def binary_cross_entropy_loss(y_true, y_pred):
epsilon = 1e-15 # 防止log(0)
y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
# 示例
y_true = np.array([0, 1, 1, 0])
y_pred = np.array([0.1, 0.8, 0.9, 0.2])
loss = binary_cross_entropy_loss(y_true, y_pred)
print("Binary Cross-Entropy Loss:", loss)
3. Hinge Loss
公式:
Hinge Loss
=
1
n
∑
i
=
1
n
max
(
0
,
1
−
t
i
⋅
y
i
)
\text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - t_i \cdot y_i)
Hinge Loss=n1i=1∑nmax(0,1−ti⋅yi)
其中,
t
i
t_i
ti 是第
i
i
i 个样本的真实标签(对于二分类问题,通常为+1或-1),
y
i
y_i
yi 是模型预测的得分。
优缺点:
- 优点:主要用于分类任务中的最大间隔方法,如SVM。它鼓励模型预测正确的类别,并且当预测正确时,预测分数越高,损失越小。
- 缺点:对异常值敏感,且不如交叉熵损失那样直观。
NumPy 代码示例(二分类):
def hinge_loss(y_true, y_pred):
margin = 1.0
return np.mean(np.maximum(0, margin - y_true * y_pred))
# 示例
y_true = np.array([-1, 1, 1, -1])
y_pred = np.array([-1.5, 1.2, 0.9, -0.8])
loss = hinge_loss(y_true, y_pred)
print("Hinge Loss:", loss)
请注意,以上代码示例主要用于教学目的,并未进行性能优化。在实际应用中,通常会使用深度学习框架(如TensorFlow或PyTorch)中提供的内置函数来计算损失,这些框架会自动处理各种优化和数值稳定性问题。