深度学习 (DeepLearning) 基础 [2]--- 神经网络常用的损失函数
Introduce
在上一篇 "深度学习 (DeepLearning) 基础 [1]--- 监督学习和无监督学习" 中我们介绍了监督学习和无监督学习相关概念. 本文主要介绍神经网络常用的损失函数.
以下均为个人学习笔记, 若有错误望指出.
神经网络常用的损失函数
pytorch 损失函数封装在 torch.nn 中.
损失函数反映了模型预测输出与真实值的区别, 模型训练的过程即让损失函数不断减小, 最终得到可以拟合预测训练样本的模型.
note: 由于 PyTorch 神经网络模型训练过程中每次传入一个 mini-batch 的数据, 因此 pytorch 内置损失函数的计算出来的结果如果没有指定 reduction 参数, 则默认对 mini-batch 取平均.
以下对几个常用的损失函数以及其应用场景做一个简单总结.(以下损失函数的公式均代表单个 min-batch 的损失, 且假设 x 为神经网络的预测输出, y 为样本的真实值, xi 为一个 mini-batch 中第 i 个样本的预测输出, yi 同理, n 为一个批量 mini-batch 的大小)
nn.L1Loss(L1 损失, 也称平均绝对误差 MAE): 计算模型输出 x 与目标 y 之间差的绝对值. 常用于回归任务.
- \[loss(x,y) = {1\over n}\sum|x_i-y_i| \]
- '''代码示例'''
- loss_func = torch.nn.L1Loss(reduction='mean')
- '''note:
- reduction=None 啥也不干
- reduction='mean' 返回 loss 和的平均值
- reduction='mean' 返回 loss 的和.
- 不指定即默认 mean.
- '''
nn.MSELoss(L2 损失, 也称均方误差 MSE): 计算模型输出 x 与目标 y 之间差的平方的均值, 均方差. 常用于回归任务.
- \[loss(x,y) = {
- 1\over n
- }\sum(x_i-y_i)^2 \]
- '''代码示例'''
- loss_func = torch.nn.MSELoss(reduction='mean')
- # note: reduction 同上.
nn.BCELoss(二进制交叉熵损失): 计算模型输出 x 与目标 y 之间的交叉熵.(我对于交叉熵的理解, 交叉熵为相对熵 (即 KL 散度, 用来衡量两个分布的差异程度) 中的一项, 最小化两个分布的差异, 即最小化相对熵, 由相对熵公式, 由于真实分布是确定的, 那么最小化相对熵就是最小化交叉熵, 而最小化交叉熵的目标就是寻找一个预测分布尽可能逼近真实分布, 这和我们模型的训练目标是一致的, 即让模型预测逼近样本真实值, 参考链接 https://www.zhihu.com/question/41252833 )常用于二分类任务.
- \[loss(x,y) = {
- 1\over n
- }\sum-w_i[y_i*logx_i + (1-y_i)*log(1-x_i)] \]
- '''代码示例'''
- loss_func = torch.nn.BCELoss(weight=None, reduction='mean')
- # note:
- # weight 为长度为 n 的 tensor, 用来指定一个 batch 中各样本占有的权重, 如公式中的 wi, 不指定默认为各样本权重均为 1.
- # reduction 同上.
- # 用的时候需要在该层前面加上 Sigmoid 函数.
nn.NLLLoss(负对数似然损失): 将神经网络输出的隶属各个类的概率向量 x 与对应真实标签向量 (个人理解应该是 one-hot 向量吧) 相差再相加, 最后再取负. 如果不取负的话, 应该是 loss 值越大预测标签越接近真实标签, 取负的话反过来, 越小则越接近真实标签, 符合 loss 函数的定义. 常用于多分类任务. 以下公式假设节点 xi 属于第 j 类, x[j]为预测的 x 属于第 j 类的概率, 且 w[j]为第 j 类的权重.
- \[loss(x,class) = {
- 1\over n
- }\sum -w[j]*x[j] \]
- '''代码示例'''
- loss_func = torch.nn.NLLLoss(weight=None, reduction='mean')
- # note:
- # weight 同上, 如公式中的 w 代表各个类在损失中占有的权重, 即类的重要程度, 若不赋予权重 w, 则各类同等重要, 上述公式中的 w[class]去掉.
- # reduction 同上.
nn.CrossEntropyLoss (交叉熵损失): 如上述二进制交叉熵所示, 随着预测的概率分布越来越接近实际标签, 交叉熵会逐渐减小. pytorch 将 nn.LogSoftmax()和 nn.NLLLoss()组合到 nn.CrossEntropyLoss(), 即调用 nn.CrossEntropyLoss() 底层会调用上述两个函数, 可以理解为 CrossEntropyLoss = LogSoftmax + NLLLoss. 因此一般多分类任务都常用交叉熵损失. 以下 label_i 代表节点 xi 的真实标签, c 为总的标签数.
- \[loss(x,class) = {
- 1 \over n
- }\sum-w[label_i]log{
- exp(x_i[label_i])\over \sum_{
- j=1
- }^cexp(x[j])
- } = {
- 1 \over n
- }\sum w[label_i](-x_i[label_i]+log(\sum_{
- j=1
- }^c)exp(x[j])) \]
- '''代码示例'''
- loss_func = torch.nn.CrossEntropyLoss(weight=None,reduction='mean')
- # note:
- # weight 同 nn.NLLLoss.
- # reduction 同上.
本文参考 - 1
本文参考 - 2
来源: https://www.cnblogs.com/wangqinze/p/13433418.html