机器学习中常用的损失函数及PyTorch代码示例

释放双眼,带上耳机,听听看~!
本文介绍了机器学习中常用的损失函数,包括绝对值损失函数、均方损失函数和交叉熵损失函数,并提供了PyTorch代码示例。阅读本文可以帮助您更好地理解损失函数的概念和在模型优化中的应用。

损失函数是衡量输入张量和目标张量之间差距的评估指标。机器学习通过对目标函数进行求解优化,以获得所期望的最终结果。在分类和回归问题中,通常会使用损失函数或代价函数作为目标函数。损失函数用于度量预测值与真实值之间的差异程度,一般而言,较好的损失函数对应着更好的模型性能。损失函数可分为经验风险损失函数和结构风险损失函数。

绝对值损失函数-L1范式

该损失函数具有不受异常值的影响的优点,常用于拟合回归的算法应用。具体的公式如下所示:

机器学习中常用的损失函数及PyTorch代码示例

其中,x,y分别是输入值和真实值;N是输入模型的batch size,简单来说就算模型处理的批次数量。简单的pytorch使用案例如下:

import torch
from torch import nn
loss = nn.L1Loss(reduction='mean')  # 绝对值损失函数定义
inputs = torch.randn(35, requires_grad=True)  # 随机生成3*5的矩阵,内部元素属于(0,1)符合正态分布的取值
target = torch.randn(35)  # 同上
output = loss(inputs, target)  # 损失值计算
output.backward()   # 反向传播

注:reduction值有两种一个是’sum’ 对L求和,另外一个是’mean’对L求平均。

均方损失函数-MSE

该损失函数对于异常值的惩罚较大,因为 MSE 是对预测值与真实值差异的平方求和,因此异常值会对最终误差产生较大影响,这有助于提高模型对真实数据关注度。具体公式如下:

机器学习中常用的损失函数及PyTorch代码示例

其中,x,y分别是输入值和真实值;N是输入模型的batch size,简单来说就算模型处理的批次数量。简单的pytorch使用案例如下:

import torch
from torch import nn
loss = nn.MSELoss()  # 均方损失函数定义
input = torch.randn(35, requires_grad=True)  # 随机生成3*5的矩阵,内部元素属于(0,1)符合正态分布的取值
target = torch.randn(35)  # 同上
output = loss(input, target)  # 损失值计算
output.backward()  # 反向传播

注:该损失函数和绝对值损失函数类似,算是优化版本。

交叉熵损失函数-CrossEntropy

首先需要明白信息熵的概念,信息熵是消除不确定性所需信息量的度量,相对熵在信息熵的基础商提出的,相对熵主要实现了两个具有相同变量、不同概率分布的数据集之间差距的度量,而交叉熵简化了相对熵的计算流程也是衡量真实数据集概率分布p(x)和预测数据集概率分布q(x)之间差距的度量。交叉熵损失函数常用于具有不平衡数据集的多分类问题场景,如:动物识别,唇语识别等。针对目标值是0 1 2…C这样的“序号”的情况具体公式如下:

机器学习中常用的损失函数及PyTorch代码示例

其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size,这里的exp(*)指的是以e为底的log函数。如果目标值是分类的概率值probabilities的话,公式有所区别如下所示:

机器学习中常用的损失函数及PyTorch代码示例

其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size,这里的exp(*)指的是以e为底的log函数。

需要注意的是,目标值是序号的情况下,L值的计算不是简单的累加求和求平均。具体公式如下:

机器学习中常用的损失函数及PyTorch代码示例

其中reduction我们一般都默认是mean,因为引用的是pytorch官网的资料。这里的w和损失函数中的w是同一个东西。简单的pytorch代码用例如下所示:

# 目标值是“序号”的示例
loss = nn.CrossEntropyLoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)
output = loss(input, target)
output.backward()
# 目标值是概率的示例
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5).softmax(dim=1)
output = loss(input, target)
output.backward()

负样本对数似然损失函数-NLLLOSS

该损失函数作用对象同样是多分类问题,实际上NLLLOSS+LogSoftmax可以实现CrossEntropy损失函数一样的效果。该损失函数的输入期望是对数概率的形式输入,所以通常需要添加LogSofrmax层在网络的最后。其在pytorch的实际应用中可通过设置wieght=[w1,w2,…,wC] wi都是一维的张量,如:tensor(0.5),C是分类的数量;该损失函数的公式如下所示:

机器学习中常用的损失函数及PyTorch代码示例

其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size。其l(x,y)的公式和交叉熵类似,如下所示:

机器学习中常用的损失函数及PyTorch代码示例

其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size。该损失函数的简易代码示例,如下所示:

# 一维输入示例
m = nn.LogSoftmax(dim=1)  # 输入对数概率化
loss = nn.NLLLoss()
# 输入尺寸 N x C = 3 x 5
input = torch.randn(35, requires_grad=True)
# 目标值必须是在[0,c]之间
target = torch.tensor([104])
output = loss(m(input), target)
output.backward()
# 二维输入示例,如:图片
N, C = 54
loss = nn.NLLLoss()
# 输入尺寸【batch_size,通道数,图片高,图片宽】 N x C x height x width
data = torch.randn(N, 161010)
conv = nn.Conv2d(16, C, (33))
m = nn.LogSoftmax(dim=1)
# 目标值必须是在[0,c]之间的正整数
target = torch.empty(N, 88, dtype=torch.long).random_(0, C)
output = loss(m(conv(data)), target)
output.backward()

总结

希望能通过对几个常见的损失函数的应用场景,公式和代码示例的介绍,帮助读者更好的理解的损失函数的应用。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

使用AI聊天机器人应对失恋:一位Reddit网友的故事

2023-11-23 13:42:14

AI教程

如何使用和自定义example selector

2023-11-23 13:46:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索