目录
一、常用丧失函数
1、CrossEntropyLoss(交叉熵丧失)
1)原理
2)流程
3)用法示例
2、L1Loss(L1丧失/平均绝对误差)
1)原理
2)用法示例
3、NLLLoss(负对数似然丧失)
1)原理
2)用法示例
4、 MSELoss(均方误差丧失)
1)定义
2)用法示例
5. BCELoss(二元交叉熵丧失)
1)定义
2)用法示例
二、总结常用丧失函数
1、nn.CrossEntropyLoss:交叉熵丧失函数
2、nn.MSELoss:均方误差丧失函数
3、nn.L1Loss:平均绝对误差丧失函数
4、nn.BCELoss:二元交叉熵丧失函数
5、nn.NLLLoss:负对数似然丧失函数
一、常用丧失函数
1、CrossEntropyLoss(交叉熵丧失)
1)原理
交叉熵丧失是一种常用于分类题目的丧失函数,它权衡的是模型输出的概率分布与真实标签分布之间的差异
在多分类题目中,模型会输出每个种别的预测概率。交叉熵丧失通过计算真实标签对应种别的负对数概率来评估模型的性能。在现实应用中,nn.CrossEntropyLoss内部会对logits(即未经softmax的原始输出)应用softmax函数,将其转换为概率分布,然后计算交叉熵。
例如:
假设有一个多种别分类任务,共有C个种别。对于每个样本,模型会输出一个包含C个元素的向量,其中每个元素表示该样本属于对应种别的概率。而真实标签是一个C维的向量,其中只有一个元素为1,其余元素均为0,表示样本的真实种别。
2)流程
首先,将模型输出的向量通过softmax函数进行归一化,将原始的概率值转换为概率分布。即对模型输出的每个元素进行指数运算,然后对所有元素求和,末了将每个元素除以总和,得到归一化后的概率分布。
然后,将归一化后的概率分布与真实标签进行比较,计算两者之间的差异。交叉熵丧失函数的计算公式为: -sum(y * log(p)) ,其中y是真实标签的概率分布,p是模型输出的归一化后的概率分布。该公式表示真实标签的概率分布与模型输出的归一化后的概率分布之间的交叉熵。
末了,将每个样本的交叉熵丧失值进行求和或平均,得到整个批次的丧失值。
3)用法示例
- import torch
- import torch.nn as nn
-
- # 假设有一个模型输出的logits和一个真实的标签
- logits = torch.randn(10, 5, requires_grad=True) # 10个样本,5个类别
- labels = torch.randint(0, 5, (10,)) # 真实标签,每个样本对应一个类别索引
-
- # 创建CrossEntropyLoss实例
- loss_fn = nn.CrossEntropyLoss()
-
- # 计算损失
- loss = loss_fn(logits, labels)
-
- # 反向传播
- loss.backward()
复制代码
2、L1Loss(L1丧失/平均绝对误差)
1)原理
L1丧失,也称为平均绝对误差(MAE),计算的是预测值与真实值之差的绝对值的平均值。
L1丧失对异常值(即远离平均值的点)的敏感度较低,因为它通过绝对值来度量误差,而绝对值函数在零点附近是线性的。
2)用法示例
- loss_fn = nn.L1Loss()
- predictions = torch.randn(3, 5, requires_grad=True) # 预测值
- targets = torch.randn(3, 5) # 真实值
-
- # 计算损失
- loss = loss_fn(predictions, targets)
-
- # 反向传播
- loss.backward()
复制代码
3、NLLLoss(负对数似然丧失)
1)原理
负对数似然丧失(NLLLoss)通常与log_softmax一起使用,用于多分类题目。它计算的是目标种别的负对数概率。
NLLLoss期望的输入是对数概率(即已经通过log_softmax处置惩罚过的输出),然后计算目标种别的负对数概率。
2)用法示例
- # 假设已经计算了logits
- logits = torch.randn(3, 5, requires_grad=True)
-
- # 应用log_softmax获取对数概率(在PyTorch中,通常直接使用CrossEntropyLoss)
- log_probs = torch.log_softmax(logits, dim=1)
-
- # 创建NLLLoss实例
- loss_fn = nn.NLLLoss()
-
- # 真实标签
- labels = torch.tensor([1, 0, 4], dtype=torch.long)
-
- # 计算损失
- loss = loss_fn(log_probs, labels)
-
- # 反向传播
- loss.backward()
复制代码 在现实应用中,直接使用CrossEntropyLoss更为常见,因为它内部集成了softmax和NLLLoss的计算。
4、 MSELoss(均方误差丧失)
1)定义
均方误差丧失(MSE)计算的是预测值与真实值之差的平方的平均值。
MSE通过平方误差来放大较大的误差,从而给予模型更大的处罚。它是回归题目中最常用的丧失函数之一。
2)用法示例
- loss_fn = nn.MSELoss()
- predictions = torch.randn(3, 5, requires_grad=True) # 预测值
- targets = torch.randn(3, 5) # 真实值
-
- # 计算损失
- loss = loss_fn(predictions, targets)
-
- # 反向传播
- loss.backward()
复制代码
5.BCELoss(二元交叉熵丧失)
1)定义
二元交叉熵丧失(BCE)用于二分类题目,计算的是预测概率与真实标签(0或1)之间的交叉熵。
BCE通过计算真实标签对应种别的负对数概率来评估模型的性能。它适用于输出概率的模型,但并不要求输入必须颠末sigmoid函数(尽管在实践中很常见)。
2)用法示例
- loss_fn = nn.BCELoss()
-
- # 假设预测值已经通过sigmoid函数(虽然不是必需的)
- predictions = torch.sigmoid(torch.randn(3, requires_grad=True))
-
- # 真实标签
- targets = torch.empty(3).random_(2).float() # 生成0或1的随机值
-
- # 计算损失
- loss = loss_fn(predictions, targets)
-
- # 反向传播
- loss.backward()
复制代码
二、总结常用丧失函数
1、nn.CrossEntropyLoss:交叉熵丧失函数
主要用于多分类题目。它将模型的输出(logits)与真实标签进行比较,并计算丧失。
2、nn.MSELoss:均方误差丧失函数
用于回归题目。它计算模型输出与真实标签之间的差异的平方,并返回平均值。
3、nn.L1Loss:平均绝对误差丧失函数
也称为L1丧失。类似于MSELoss,但是它计算模型输出与真实标签之间的差异的绝对值,并返回平均值。
4、nn.BCELoss:二元交叉熵丧失函数
用于二分类题目。它计算二分类题目中的模型输出与真实标签之间的差异,并返回丧失。
5、nn.NLLLoss:负对数似然丧失函数
主要用于多分类题目。它首先应用log_softmax函数(log_softmax(x) = log(softmax(x)))将模型输出转化为对数概率,然后计算模型输出与真实标签之间的差异。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |