第3章:神经网络核心
3.3 损失函数的设计
3.3.1 损失函数的定义与作用
损失函数(Loss Function)是神经网络训练中的核心组件,用于量化模型预测结果与真实值之间的差异。其核心作用包括:
- 性能评估:衡量模型在当前参数下的表现
- 优化导向:为反向传播提供梯度计算依据
- 任务适配:不同任务需要设计不同的损失函数
数学表达式:
其中为模型参数,为模型预测值。
3.3.2 常见损失函数分类
(1)回归任务损失函数
| 函数名称 | 公式 | 特性 |
|---|---|---|
| 均方误差 (MSE) | 对异常值敏感,可导性强 | |
| 平均绝对误差 (MAE) | 鲁棒性强,在0点不可导 | |
| Huber Loss | 分段函数(结合MSE和MAE) | 平衡鲁棒性与可导性 |
(2)分类任务损失函数
交叉熵损失(Cross-Entropy):
适用于多分类任务,对错误预测施加更大惩罚
二元交叉熵:
合页损失(Hinge Loss):
常用于SVM和最大间隔分类器
(3)特殊任务损失函数
- Triplet Loss:用于度量学习(如人脸识别)
- Focal Loss:解决类别不平衡问题
- Wasserstein Loss:生成对抗网络中的稳定训练
3.3.3 损失函数设计原则
任务匹配原则:
- 分类任务:优先选择交叉熵系列
- 回归任务:根据异常值情况选择MSE/MAE
- 排序任务:考虑Pairwise或Listwise损失
数值稳定性:
- 添加微小常数避免log(0)情况
- 使用log-sum-exp技巧处理数值溢出
多目标平衡:
# 多任务学习示例 total_loss = α*loss1 + β*loss2 + γ*regularization
3.3.4 自定义损失函数实践
案例:医疗诊断中的代价敏感损失
class MedicalLoss(nn.Module):
def __init__(self, penalty_ratio=5.0):
super().__init__()
self.ratio = penalty_ratio # 假阴性的惩罚系数
def forward(self, pred, target):
base_loss = F.binary_cross_entropy(pred, target)
# 对false negative增加额外惩罚
mask = (target == 1) & (pred < 0.5)
penalty = mask.float().sum() * self.ratio
return base_loss + penalty
3.3.5 损失函数选择建议
- 优先使用领域标准损失函数
- 对于不平衡数据考虑加权损失
- 复杂任务可尝试损失函数组合
- 始终在验证集上评估损失选择效果
关键理解:好的损失函数应该像"精准的指南针",既能反映任务本质需求,又能为优化过程提供清晰的梯度方向。
