Torch/nn中的损失函数(Criterions)详解
【免费下载链接】nn 项目地址: https://gitcode.com/gh_mirrors/nn/nn
什么是损失函数?
损失函数(Criterions)在神经网络训练中起着至关重要的作用。它们用于计算模型预测输出与真实目标之间的差异程度,并产生梯度用于反向传播。简单来说,损失函数衡量的是模型预测的"错误程度"。
在Torch/nn模块中,提供了多种针对不同任务的损失函数,主要分为以下几类:
分类任务损失函数
1. BCECriterion (二元交叉熵损失)
适用于二分类问题,常与Sigmoid激活函数配合使用。计算公式为:
loss = -1/n Σ [y*log(p) + (1-y)*log(1-p)]
其中y是真实标签(0或1),p是预测概率。
2. ClassNLLCriterion (负对数似然损失)
用于多分类问题,要求输入是经过LogSoftMax处理的对数概率。计算公式简单直接:
loss = -x[class]
其中x是对数概率向量,class是目标类别索引。
3. CrossEntropyCriterion (交叉熵损失)
将LogSoftMax和ClassNLLCriterion合并为一个模块,简化使用流程。计算公式为:
loss = -log(exp(x[class])/Σexp(x[j]))
4. ClassSimplexCriterion (类单纯形损失)
一种新颖的分类损失函数,将每个类别嵌入到(N-1)维单纯形空间中。特别适合与归一化线性层配合使用。
5. MarginCriterion (边界损失)
用于二分类的边界损失,鼓励正样本得分高于边界值,负样本得分低于边界值。公式为:
loss = max(0, margin - y*x)
6. MultiMarginCriterion (多类边界损失)
MarginCriterion的多类扩展版本,适用于多分类问题。
回归任务损失函数
1. AbsCriterion (平均绝对误差)
计算预测值与目标值的绝对差平均值:
loss = 1/n Σ |x_i - y_i|
2. MSECriterion (均方误差)
最常用的回归损失,计算预测值与目标值的平方差平均值:
loss = 1/n Σ (x_i - y_i)^2
3. SmoothL1Criterion (平滑L1损失)
结合了L1和L2损失的优点,在接近零点处更平滑,对异常值更鲁棒。
4. DistKLDivCriterion (KL散度)
用于衡量两个概率分布之间的差异,常用于概率分布回归任务。
嵌入任务损失函数
1. HingeEmbeddingCriterion
用于学习嵌入表示,根据输入距离计算损失。
2. CosineEmbeddingCriterion
基于余弦相似度的嵌入损失,常用于学习相似性度量。
复合损失函数
1. MultiCriterion
多个损失函数的加权和,应用于相同的输入和目标。
2. ParallelCriterion
多个损失函数的加权和,每个应用于不同的输入和目标。
损失函数的基本操作
所有损失函数都继承自Criterion基类,提供两个核心方法:
forward(input, target):计算损失值backward(input, target):计算梯度
以及两个状态变量:
output:存储最后一次forward调用的结果gradInput:存储最后一次backward调用的梯度
使用技巧
- 对于不平衡数据集,可以使用带权重的损失函数(如ClassNLLCriterion(weights))
- 通过设置sizeAverage=false可以改为求和而非平均
- 某些损失函数(如ClassNLLCriterion)支持ignoreIndex参数忽略特定类别
- 组合使用多个损失函数可以实现更复杂的训练目标
示例代码
-- 二分类示例
mlp = nn.Sequential()
mlp:add(nn.Linear(10, 1))
mlp:add(nn.Sigmoid())
criterion = nn.BCECriterion()
-- 训练步骤
pred = mlp:forward(input)
loss = criterion:forward(pred, target)
grad = criterion:backward(pred, target)
mlp:backward(input, grad)
mlp:updateParameters(learningRate)
理解并正确选择损失函数是深度学习模型成功的关键因素之一。Torch/nn提供的丰富损失函数库能够满足绝大多数深度学习任务的需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



