损失函数是衡量输入张量和目标张量之间差距的评估指标。机器学习通过对目标函数进行求解优化,以获得所期望的最终结果。在分类和回归问题中,通常会使用损失函数或代价函数作为目标函数。损失函数用于度量预测值与真实值之间的差异程度,一般而言,较好的损失函数对应着更好的模型性能。损失函数可分为经验风险损失函数和结构风险损失函数。
绝对值损失函数-L1范式
该损失函数具有不受异常值的影响的优点,常用于拟合回归的算法应用。具体的公式如下所示:
其中,x,y分别是输入值和真实值;N是输入模型的batch size,简单来说就算模型处理的批次数量。简单的pytorch使用案例如下:
import torch
from torch import nn
loss = nn.L1Loss(reduction='mean') # 绝对值损失函数定义
inputs = torch.randn(3, 5, requires_grad=True) # 随机生成3*5的矩阵,内部元素属于(0,1)符合正态分布的取值
target = torch.randn(3, 5) # 同上
output = loss(inputs, target) # 损失值计算
output.backward() # 反向传播
注:reduction值有两种一个是’sum’ 对L求和,另外一个是’mean’对L求平均。
均方损失函数-MSE
该损失函数对于异常值的惩罚较大,因为 MSE 是对预测值与真实值差异的平方求和,因此异常值会对最终误差产生较大影响,这有助于提高模型对真实数据关注度。具体公式如下:
其中,x,y分别是输入值和真实值;N是输入模型的batch size,简单来说就算模型处理的批次数量。简单的pytorch使用案例如下:
import torch
from torch import nn
loss = nn.MSELoss() # 均方损失函数定义
input = torch.randn(3, 5, requires_grad=True) # 随机生成3*5的矩阵,内部元素属于(0,1)符合正态分布的取值
target = torch.randn(3, 5) # 同上
output = loss(input, target) # 损失值计算
output.backward() # 反向传播
注:该损失函数和绝对值损失函数类似,算是优化版本。
交叉熵损失函数-CrossEntropy
首先需要明白信息熵的概念,信息熵是消除不确定性所需信息量的度量,相对熵在信息熵的基础商提出的,相对熵主要实现了两个具有相同变量、不同概率分布的数据集之间差距的度量,而交叉熵简化了相对熵的计算流程也是衡量真实数据集概率分布p(x)和预测数据集概率分布q(x)之间差距的度量。交叉熵损失函数常用于具有不平衡数据集的多分类问题场景,如:动物识别,唇语识别等。针对目标值是0 1 2…C这样的“序号”的情况具体公式如下:
其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size,这里的exp(*)指的是以e为底的log函数。如果目标值是分类的概率值probabilities的话,公式有所区别如下所示:
其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size,这里的exp(*)指的是以e为底的log函数。
需要注意的是,目标值是序号的情况下,L值的计算不是简单的累加求和求平均。具体公式如下:
其中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是分类的数量;该损失函数的公式如下所示:
其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size。其l(x,y)的公式和交叉熵类似,如下所示:
其中,x是输入的张量,y是目标张量,w是权值,C是分类总数量,N是最小的batch size。该损失函数的简易代码示例,如下所示:
# 一维输入示例
m = nn.LogSoftmax(dim=1) # 输入对数概率化
loss = nn.NLLLoss()
# 输入尺寸 N x C = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
# 目标值必须是在[0,c]之间
target = torch.tensor([1, 0, 4])
output = loss(m(input), target)
output.backward()
# 二维输入示例,如:图片
N, C = 5, 4
loss = nn.NLLLoss()
# 输入尺寸【batch_size,通道数,图片高,图片宽】 N x C x height x width
data = torch.randn(N, 16, 10, 10)
conv = nn.Conv2d(16, C, (3, 3))
m = nn.LogSoftmax(dim=1)
# 目标值必须是在[0,c]之间的正整数
target = torch.empty(N, 8, 8, dtype=torch.long).random_(0, C)
output = loss(m(conv(data)), target)
output.backward()
总结
希望能通过对几个常见的损失函数的应用场景,公式和代码示例的介绍,帮助读者更好的理解的损失函数的应用。