MultiMarginLoss

多分类合页损失函数(hinge loss),对于一个样本不是考虑样本输出与真实类别之间的误差,而是考虑对应真实类别与其他类别之间的误差

对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx为神经网络的输出,yyy是真实的类别标签,假设类别数为CCC, 0≤yn≤C−10 \leq y_{n} \leq C-10≤yn​≤C−1。

第nnn个样本的损失值lnl_{n}ln​计算如下:

ln=1C∑i=0&i≠ynC−1max⁡(0,margin⁡−xn[yn]+xn[i])pl_{n}=\frac1{C}{ \sum_{i=0 \&i \neq y_{n}}^{C-1} \max (0, \operatorname{margin}-x_{n}[y_{n}]+x_{n}[i])^{p}}ln​=C1​i=0&i​=yn​∑C−1​max(0,margin−xn​[yn​]+xn​[i])p

为了处理多个类别之间的样本不平衡问题,对于每一类可传入相应的权值www。

ln=1C∑i=0&i≠ynC−1max⁡(0,w[yn](margin⁡−xn[yn]+xn[i]))pl_{n}=\frac1{C}{ \sum_{i=0 \&i \neq y_{n}}^{C-1} \max (0, w[y_{n}](\operatorname{margin}-x_{n}[y_{n}]+x_{n}[i]))^{p}}ln​=C1​i=0&i​=yn​∑C−1​max(0,w[yn​](margin−xn​[yn​]+xn​[i]))p

若p=1p=1p=1, 由以上公式可知:

(1) 当 margin−xn[yn]+xn[i]<0{margin}-x_{n}[y_{n}]+x_{n}[i]<0margin−xn​[yn​]+xn​[i]<0时,即 margin+xn[i]<xn[yn]{margin}+x_{n}[i]<x_{n}[y_{n}]margin+xn​[i]<xn​[yn​], 该样本被误认为类别iii的losslossloss为0。

此时,样本预测为正确类别yny_{n}yn​的概率大于预测为iii类别的概率,并且差值大于marginmarginmargin。 这样的样本被认为是易分类样本,直接忽略其带来的误差。

(2)当 margin−xn[yn]+xn[i]>0{margin}-x_{n}[y_{n}]+x_{n}[i]>0margin−xn​[yn​]+xn​[i]>0时,该样本被误认为类别iii的losslossloss为margin−xn[yn]+xn[i]{margin}-x_{n}[y_{n}]+x_{n}[i]margin−xn​[yn​]+xn​[i], 分为两种情况:

  • margin+xn[i]>xn[yn]>xn[i]{margin}+x_{n}[i]>x_{n}[y_{n}]>x_{n}[i]margin+xn​[i]>xn​[yn​]>xn​[i],对应难分类样本,样本被误认为类别iii的概率值小于正确类别yny_{n}yn​,但是两者的差值小于marginmarginmargin。

  • margin+xn[i]>xn[i]>xn[yn]{margin}+x_{n}[i]>x_{n}[i]>x_{n}[y_{n}]margin+xn​[i]>xn​[i]>xn​[yn​],对应非常难分类样本,容易被分为类别iii

class MultiMarginLoss(_WeightedLoss):__constants__ = ['p', 'margin', 'weight', 'reduction']def __init__(self, p=1, margin=1., weight=None, size_average=None,reduce=None, reduction='mean'):super(MultiMarginLoss, self).__init__(weight, size_average, reduce, reduction)if p != 1 and p != 2:raise ValueError("only p == 1 and p == 2 supported")assert weight is None or weight.dim() == 1self.p = pself.margin = margindef forward(self, input, target):return F.multi_margin_loss(input, target, p=self.p, margin=self.margin,weight=self.weight, reduction=self.reduction)

pytorch中通过torch.nn.MultiMarginLoss类实现,也可以直接调用F.multi_margin_loss 函数,代码中的weight即是www。size_averagereduce已经弃用。reduction有三种取值mean, sum, none,对应不同的返回ℓ(x,y)\ell(x, y)ℓ(x,y). 默认为mean,对应于一般情况下整体losslossloss的计算。

L={l1,…,lN}L=\left\{l_{1}, \ldots, l_{N}\right\}L={l1​,…,lN​}
ℓ(x,y)={L⁡,if reduction =’none’ 1N∑n=1Nln,if reduction =’mean’ ∑n=1Nlnif reduction =’sum’ \ell(x, y)=\left\{\begin{array}{ll}\operatorname L, & \text { if reduction }=\text { 'none' } \\ \frac1{N}\sum_{n=1}^{N} l_{n}, & \text { if reduction }=\text { 'mean' } \\ \sum_{n=1}^{N} l_{n} & \text { if reduction }=\text { 'sum' }\end{array} \right.ℓ(x,y)=⎩⎨⎧​L,N1​∑n=1N​ln​,∑n=1N​ln​​ if reduction = ’none’  if reduction = ’mean’  if reduction = ’sum’ ​

ppp 值默认为1,另外可设为2,其他数值不支持。marginmarginmargin也是人为设定的值,默认为1

例子:

x = torch.FloatTensor([[0.1, 0.2, 0.4, 0.8], [0.1, 0.2, 0.4, 0.8]])
print(x.size())
y = torch.LongTensor([3, 3])
print(y.size())loss = nn.MultiMarginLoss(reduction="none")
loss_val = loss(x, y)
print(loss_val)loss = nn.MultiMarginLoss(reduction="sum")
loss_val = loss(x, y)
print(loss_val.item())
print(loss_val.item() / x.size(0))
#验证
print(1 / 2 * 1 / 4 * ((1 - 0.8 + 0.1) + (1 - 0.8 + 0.2) + (1 - 0.8 + 0.4) +(1 - 0.8 + 0.1) + (1 - 0.8 + 0.2) + (1 - 0.8 + 0.4)))

运行结果:

torch.Size([2, 4])
torch.Size([2])
tensor([0.3250, 0.3250])
0.6499999761581421
0.32499998807907104
0.32499999999999996

MultiLabelMarginLoss

多标签合页损失(hinge loss),上述的多分类合页损失MultiMarginLoss应用于一个样本仅仅对应一个真实类别的情况。而MultiLabelMarginLoss应用于一个样本对应多个真实类别的情况,但是类别总数不超过CCC

对于包含NNN个样本的batch数据 D(x,y)D(x, y)D(x,y),xxx为神经网络的输出,yyy是真实的类别。

第nnn个样本的损失值lnl_{n}ln​计算如下:

ln=1C∑j∈yn∑i∉ynmax⁡(0,1−xn[j]+xn[i])l_{n}=\frac1{C}{ \sum_{j \in y_{n}}\sum_{i \notin y_{n}} \max (0, 1-x_{n}[j]+x_{n}[i])}ln​=C1​j∈yn​∑​i∈/​yn​∑​max(0,1−xn​[j]+xn​[i])

其中,每个样本对应的类别数量不同,只考虑yny_{n}yn​中数值−1-1−1之前的连续类别。 若某个样本对应的yn=[2,3,−1,0]y_{n}=[2,3,-1,0]yn​=[2,3,−1,0],表示总的类别有四个,而2和3类别属于该样本,0和1类别不属于该样本。yn=[2,3,−1,0]y_{n}=[2,3,-1,0]yn​=[2,3,−1,0] 与yn=[3,2,−1,0]y_{n}=[3,2,-1,0]yn​=[3,2,−1,0]两种表示相同。

class MultiLabelMarginLoss(_Loss):__constants__ = ['reduction']def __init__(self, size_average=None, reduce=None, reduction='mean'):super(MultiLabelMarginLoss, self).__init__(size_average, reduce, reduction)def forward(self, input, target):return F.multilabel_margin_loss(input, target, reduction=self.reduction)

pytorch中通过torch.nn.MultiLabelMarginLoss类实现,也可以直接调用F.multilabel_margin_loss 函数,代码中的weight即是www。size_averagereduce已经弃用。reduction有三种取值mean, sum, none,对应不同的返回ℓ(x,y)\ell(x, y)ℓ(x,y). 默认为mean,对应于一般情况下整体losslossloss的计算。

L={l1,…,lN}L=\left\{l_{1}, \ldots, l_{N}\right\}L={l1​,…,lN​}
ℓ(x,y)={L⁡,if reduction =’none’ 1N∑n=1Nln,if reduction =’mean’ ∑n=1Nlnif reduction =’sum’ \ell(x, y)=\left\{\begin{array}{ll}\operatorname L, & \text { if reduction }=\text { 'none' } \\ \frac1{N}\sum_{n=1}^{N} l_{n}, & \text { if reduction }=\text { 'mean' } \\ \sum_{n=1}^{N} l_{n} & \text { if reduction }=\text { 'sum' }\end{array} \right.ℓ(x,y)=⎩⎨⎧​L,N1​∑n=1N​ln​,∑n=1N​ln​​ if reduction = ’none’  if reduction = ’mean’  if reduction = ’sum’ ​

例子:

loss = nn.MultiLabelMarginLoss()
x = torch.FloatTensor([[0.1, 0.2, 0.4, 0.8]])
y = torch.LongTensor([[3, 0, -1, 1]])
print(x.size())
print(y.size())loss_val = loss(x, y)
print(loss_val.item())
# 验证
print(0.25 * ((1 - (0.8 - 0.2)) + (1 - (0.8 - 0.4)) + (1 - (0.1 - 0.2)) + (1 - (0.1 - 0.4))))y = torch.LongTensor([[3, 0, 1, -1]])
loss_val = loss(x, y)
print(loss_val.item())
# 验证
print(0.25 * ((1 - (0.8 - 0.4)) + (1 - (0.1 - 0.4)) + (1 - (0.2 - 0.4))))y = torch.LongTensor([[3, 0, 2, 1]])
loss_val = loss(x, y)
print(loss_val.item())
# 如果包含全部的类别,loss为0?

输出结果:

torch.Size([1, 4])
torch.Size([1, 4])
0.8499999642372131
0.8500000000000001
0.7749999761581421
0.7749999999999999
0.0

但是,如果样本包含全部的类别,对应的loss就为0。这样定义loss不是很奇怪嘛。

loss函数之MultiMarginLoss, MultiLabelMarginLoss相关推荐

  1. 【Dual-Path-RNN-Pytorch源码分析】loss函数:SI-SNR

    DPRNN使用的loss函数是 SI-SNR SI-SNR 是scale-invariant source-to-noise ratio的缩写,中文翻译为尺度不变的信噪比,意思是不受信号变化影响的信噪 ...

  2. tensorflow学习(4.loss函数以及正则化的使用 )

    本文还是以MNIST的CNN分析为例 loss函数一般有MSE均方差函数.交叉熵损失函数,说明见 https://blog.csdn.net/John_xyz/article/details/6121 ...

  3. 多分类loss函数本质理解

    一.面对一个多分类问题,如何设计合理的损失函数呢? 1.损失函数的本质在数学上称为目标函数:这个目标函数的目标值符合最完美的需求:损失函数的目标值肯定是0,完美分类的损失必然为0 : 2.损失函数分为 ...

  4. 深度学习基础(三)loss函数

    loss函数,即损失函数,是决定网络学习质量的关键.若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果.若有错误,敬请指正,Thank you! 目录 一.loss函数定义 二.常见的lo ...

  5. Keras自定义Loss函数

    Keras作为一个深度学习库,非常适合新手.在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求.具体包含目标函数和优化方法.但它也支持用户自定义目标函数,下边介绍 ...

  6. 商汤使用AutoML设计Loss函数,全面超越人工设计

    点击我爱计算机视觉标星,更快获取CVML新技术 深度学习领域,神经架构搜索得到的算法如雨后春笋般出现. 今天一篇arXiv论文<AM-LFS: AutoML for Loss Function ...

  7. 深度学习中的损失函数总结以及Center Loss函数笔记

    北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文                        ...

  8. 'int' object has no attribute 'backward'报错 使用Pytorch编写 Hinge loss函数

    在编写SVM中的Hinge loss函数的时候报错"'int' object has no attribute 'backward'" for epoch in range(50) ...

  9. 《深度学习笔记》——loss函数的学习笔记

    1 loss的作用 在南溪看来,loss函数是对目标target和预测prediction之间的一种距离度量的公式: 2 loss函数的设计原则 此设计原则参考了距离的定义,(注意:距离跟范数是两个概 ...

最新文章

  1. oracle sqlserver 查看指定用户下面的表
  2. jquery.inputmask.js 输入框input输入内容格式限制插件
  3. django Forbidden
  4. linux localhost的修改
  5. 利用cookies让sweetalert只出现一次
  6. ASP.NET设置发帖时间间隔不超过30秒
  7. 示范NTFS 卷上的流
  8. Android 系统服务列表
  9. 让你的CSS更尽完美的技巧
  10. MATLAB Simulink仿真应用
  11. 修改tomcat浏览器地址栏图标
  12. Park 变换 系数2/3的由来
  13. 单片机实验(十)数码管动态显示
  14. Java 45:Spring
  15. 使用Redis+萤石云保证视频永不过期
  16. AcWing 273. 分级 (推论,DP)
  17. 申报绿色工厂的条件和标准是什么?
  18. python校验用户登录信息
  19. 计算机网络之应用层-Internet电子邮件
  20. 【答学员问】培训班毕业的linux运维的女生,如何找到运维工作?

热门文章

  1. oracle先的lvm分配,LVM实战案例之LVM空间缩减(本次对PV,VG,LV等进行空间缩减)
  2. 制药工程专业计算机二级,全国制药工程本科专业认证标准2016年12月修订.pdf
  3. ajax常见写法,jquery ajax较常见的写法
  4. CSS基础汇总——点击标题跳转详细博客【学习笔记】
  5. php中mysql数据库集群,MySQL集群
  6. 收藏~10年软件测试人员的工作方法进阶汇总
  7. oracle+日誌語句,oracle维护常用sql语句
  8. Lenovo ThinkPad T系列解决 VMware Workstation 打开虚拟机提示:Intel VT-x处于禁用状态问题
  9. python根据index合并_通过index和cols合并/联接/追加两个Pandas数据帧,其中包含多索引列...
  10. sql主键可以有多个_干货 | 新手请速戳!30个精选SQL面试问题Qamp;A集锦