[实践应用] 深度学习之损失函数
文章总览:YuanDaiMa2048博客文章总览
深度学习之损失函数
- 1. 回归任务
- 1.1 均方误差 (MSE)
- 1.2 平均绝对误差 (MAE)
- 2. 二分类任务
- 2.1 二元交叉熵 (Binary Cross-Entropy)
- 3. 多分类任务
- 3.1 类别交叉熵 (Categorical Cross-Entropy)
- 4. 序列生成任务(例如,机器翻译)
- 4.1 序列交叉熵 (Sequence Cross-Entropy)
- 5. 回归任务的正则化
- 5.1 L2 正则化(权重衰减)
- 其他介绍
在机器学习和深度学习中,不同的任务使用不同的损失函数来衡量模型的性能。
1. 回归任务
任务: 预测一个连续的数值。
1.1 均方误差 (MSE)
原理: MSE 衡量预测值与实际值之间的平方差的平均值,适用于回归任务。它对异常值敏感。
公式:
MSE
=
1
n
∑
i
=
1
n
(
预测值
i
−
实际值
i
)
2
\text{MSE} = \frac{1}{n} \sum_{i=1}^{n}(\text{预测值}_i - \text{实际值}_i)^2
MSE=n1i=1∑n(预测值i−实际值i)2
PyTorch 代码:
import torch
import torch.nn as nn
# 定义均方误差损失函数
mse_loss = nn.MSELoss()
1.2 平均绝对误差 (MAE)
原理: MAE 衡量预测值与实际值之间的绝对差的平均值,对异常值不太敏感。
公式:
MAE
=
1
n
∑
i
=
1
n
∣
预测值
i
−
实际值
i
∣
\text{MAE} = \frac{1}{n} \sum_{i=1}^{n}|\text{预测值}_i - \text{实际值}_i|
MAE=n1i=1∑n∣预测值i−实际值i∣
PyTorch 代码:
import torch
import torch.nn as nn
# 定义平均绝对误差损失函数
mae_loss = nn.L1Loss()
2. 二分类任务
任务: 预测样本属于两个类别中的一个(例如,垃圾邮件分类)。
2.1 二元交叉熵 (Binary Cross-Entropy)
原理: 计算预测概率与实际标签之间的交叉熵,用于二分类任务。
公式:
BCE
=
−
1
n
∑
i
=
1
n
[
y
i
log
(
p
i
)
+
(
1
−
y
i
)
log
(
1
−
p
i
)
]
\text{BCE} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)]
BCE=−n1i=1∑n[yilog(pi)+(1−yi)log(1−pi)]
PyTorch 代码:
import torch
import torch.nn as nn
# 定义二元交叉熵损失函数
bce_loss = nn.BCEWithLogitsLoss() # 结合了 Sigmoid 激活和 BCE 损失
3. 多分类任务
任务: 预测样本属于多个类别中的一个(例如,手写数字分类)。
3.1 类别交叉熵 (Categorical Cross-Entropy)
原理: 计算预测的概率分布与实际类别之间的交叉熵,用于多分类任务。
公式:
CCE
=
−
1
n
∑
i
=
1
n
∑
k
=
1
K
y
i
,
k
log
(
p
i
,
k
)
\text{CCE} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{k=1}^{K} y_{i,k} \log(p_{i,k})
CCE=−n1i=1∑nk=1∑Kyi,klog(pi,k)
其中 K K K 是类别数, y i , k y_{i,k} yi,k 是实际类别的 one-hot 编码, p i , k p_{i,k} pi,k 是预测的概率。
PyTorch 代码:
import torch
import torch.nn as nn
# 定义类别交叉熵损失函数
cross_entropy_loss = nn.CrossEntropyLoss() # 直接对 logits 应用 Softmax 和计算交叉熵
4. 序列生成任务(例如,机器翻译)
任务: 预测序列中每个位置的类别(例如,翻译每个单词)。
4.1 序列交叉熵 (Sequence Cross-Entropy)
原理: 与多分类交叉熵类似,但应用于序列数据,计算预测序列与实际序列之间的交叉熵。
公式:
Sequence CCE
=
−
1
n
∑
i
=
1
n
∑
t
=
1
T
∑
k
=
1
K
y
i
,
t
,
k
log
(
p
i
,
t
,
k
)
\text{Sequence CCE} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{t=1}^{T} \sum_{k=1}^{K} y_{i,t,k} \log(p_{i,t,k})
Sequence CCE=−n1i=1∑nt=1∑Tk=1∑Kyi,t,klog(pi,t,k)
PyTorch 代码:
import torch
import torch.nn as nn
# 对于序列生成任务,通常使用 CrossEntropyLoss 处理每个时间步的预测
sequence_cross_entropy_loss = nn.CrossEntropyLoss()
5. 回归任务的正则化
任务: 通过将正则化项添加到损失函数来防止过拟合。
5.1 L2 正则化(权重衰减)
原理: 在损失函数中添加权重的平方和,鼓励较小的权重值。
公式:
Regularized Loss
=
原始损失
+
λ
∑
j
=
1
m
W
j
2
\text{Regularized Loss} = \text{原始损失} + \lambda \sum_{j=1}^{m} W_j^2
Regularized Loss=原始损失+λj=1∑mWj2
PyTorch 代码:
import torch.optim as optim
# 定义模型
model = nn.Linear(10, 1)
# 定义优化器,并添加 L2 正则化(weight_decay)
optimizer = optim.SGD(model.parameters(), lr=0.01, weight_decay=0.01)
其他介绍
- 深度学习之激活函数