损失函数,也可叫做 目标函数、代价函数 等,其意义不是完全一致,但是大体相同,不必纠结概念

 

常见 损失函数 

0-1 损失:Zero-one loss

预测与实际相等为 0,不相等为 1;

缺点:定义太过严格,比如预测为 0.99,实际为 1,显然预测没问题,但是上述损失为  1

应用:不常用

感知损失:Perceptron Loss

它是对 0-1 损失的改进,允许有一定的误差

预测与实际在误差范围内为 0,超过误差范围为 1 

应用:不常用 

 

铰链损失:Hinge loss

解决间隔最大化问题

y 为实际,y‘ 为预测;

在 SVM 中,y‘ 取值在 -1 到 1 之间,不鼓励 |y'| > 1,这意味着模型过度自信,让单个正确分类的样本距离分割线超过 1 时,yy‘ > 1,1 - yy‘ < 0,而 hinge loss 强制取 0,这意味着 负数并不会对模型的优化起到减小损失的作用,

这样做使得 SVM 更专注于整体的误差

如果预测正确,损失为 0;

如果预测错误,yy‘ < 0,损失为 1-yy‘;

优点:健壮性好,噪声不敏感

缺点:缺乏很好的概率解释

应用:SVM 解决几何间隔最大化

在线性支持向量基中,loss 如下

作如下变形

loss 变成

 

对数损失:log 损失

log 损失的本质是对数似然函数;      【在交叉熵中有解释】

它包含了 cross-entropy loss 和 softmax loss;

它适用于 输出概率 的分类模型;

注意 P(Y|X) 表示 softmax 之后,真实 label 对应的那个概率,是单个值,不同于下面的交叉熵,交叉熵里面 y 和 a 都是 一个 概率向量;

缺点:log 或者 exp 都是放大了错误,这样使得模型对噪声敏感

应用:逻辑回归,softmax 分类

交叉熵:cross-entropy loss

x 表示样本, y 表示实际, one-hot,a 表示预测,是一组概率,n 为样本数

 

交叉熵的本质是 对数似然函数

p 为发生的概率,y 为发生 or 未发生,0 or 1;  【p 为预测,y 为实际】

应用:最常用的二分类损失函数

 

指数损失

如果预测正确,yf(x) 为正,-yf(x) < 0,loss 变小,exp(-yf(x)) < 1;

如果预测错误,yf(x) 为负,-yf(x) > 0,loss 变大,exp(-yf(x)) > 1;

加 exp 的作用是放大 错误;

缺点:log 或者 exp 都是放大了错误,这样使得模型对噪声敏感

应用:Adaboost

 

绝对值损失

也叫 L1 范数损失,L1 loss

应用:回归

均方差 

应用:最常用的回归损失函数

 

 

以上损失函数可视化如下图

 

Pytorch 中 损失函数汇总

最简单、最常用的

####### reduction-三个值,none: 不使用约简;mean:返回loss和的平均值; sum:返回loss的和。默认:mean
##################### L1范数损失 L1Loss
nn.L1Loss(reduction='mean')

##################### 均方误差损失 MSELoss
nn.MSELoss(reduction='mean')

6 KL 散度损失 KLDivLoss    【我的其他博客有较详细的介绍】

计算 input 和 target 之间的 KL 散度。KL 散度可用于衡量不同的连续分布之间的距离, 在连续的输出分布的空间上(离散采样)上进行直接回归时 很有效;

nn.KLDivLoss(reduction='mean')

 

7 平滑版L1损失 SmoothL1Loss    【模型优化中较常用】

也被称为 Huber 损失函数

nn.SmoothL1Loss(reduction='mean')

其中

 整体的思想也是避免单样本过分自信,当 x-y<1 说明 预测误差 合理,采用正常的均方误差,如果 x-y>1,说明预测值很大,要降低它对 loss 的影响,类似于 svm,暴力减去 0.5

 

8 HingeEmbeddingLoss    【SVM】

nn.HingeEmbeddingLoss(margin=1.0, reduction='mean')

对于 mini-batch(小批量) 中每个实例的损失函数如下:

 

9 MarginRankingLoss

nn.MarginRankingLoss(margin=0.0, reduction='mean')

对于 mini-batch(小批量) 中每个实例的损失函数如下:

 

10 多标签分类损失 MultiLabelMarginLoss

nn.MultiLabelMarginLoss(reduction='mean')

对于mini-batch(小批量) 中的每个样本按如下公式计算损失:

在这里插入图片描述 

 

 

剩下的看参考资料,不是很常用 

 

 

 

参考资料:

https://www.cnblogs.com/lliuye/p/9549881.html

https://blog.csdn.net/zhangjunp3/article/details/80467350    这篇讲得比较深入

https://zhuanlan.zhihu.com/p/58883095

https://zhuanlan.zhihu.com/p/35027284

https://zhuanlan.zhihu.com/p/47202768

https://mp.weixin.qq.com/s/qWJaMTHNAh4cxEIhfpURDA