loss函数之MultiMarginLoss, MultiLabelMarginLoss
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=C1i=0&i=yn∑C−1max(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=C1i=0&i=yn∑C−1max(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_average
与reduce
已经弃用。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=1Nln,∑n=1Nln 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=C1j∈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_average
与reduce
已经弃用。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=1Nln,∑n=1Nln 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相关推荐
- 【Dual-Path-RNN-Pytorch源码分析】loss函数:SI-SNR
DPRNN使用的loss函数是 SI-SNR SI-SNR 是scale-invariant source-to-noise ratio的缩写,中文翻译为尺度不变的信噪比,意思是不受信号变化影响的信噪 ...
- tensorflow学习(4.loss函数以及正则化的使用 )
本文还是以MNIST的CNN分析为例 loss函数一般有MSE均方差函数.交叉熵损失函数,说明见 https://blog.csdn.net/John_xyz/article/details/6121 ...
- 多分类loss函数本质理解
一.面对一个多分类问题,如何设计合理的损失函数呢? 1.损失函数的本质在数学上称为目标函数:这个目标函数的目标值符合最完美的需求:损失函数的目标值肯定是0,完美分类的损失必然为0 : 2.损失函数分为 ...
- 深度学习基础(三)loss函数
loss函数,即损失函数,是决定网络学习质量的关键.若网络结构不变的前提下,损失函数选择不当会导致模型精度差等后果.若有错误,敬请指正,Thank you! 目录 一.loss函数定义 二.常见的lo ...
- Keras自定义Loss函数
Keras作为一个深度学习库,非常适合新手.在做神经网络时,它自带了许多常用的目标函数,优化方法等等,基本能满足新手学习时的一些需求.具体包含目标函数和优化方法.但它也支持用户自定义目标函数,下边介绍 ...
- 商汤使用AutoML设计Loss函数,全面超越人工设计
点击我爱计算机视觉标星,更快获取CVML新技术 深度学习领域,神经架构搜索得到的算法如雨后春笋般出现. 今天一篇arXiv论文<AM-LFS: AutoML for Loss Function ...
- 深度学习中的损失函数总结以及Center Loss函数笔记
北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 ...
- 'int' object has no attribute 'backward'报错 使用Pytorch编写 Hinge loss函数
在编写SVM中的Hinge loss函数的时候报错"'int' object has no attribute 'backward'" for epoch in range(50) ...
- 《深度学习笔记》——loss函数的学习笔记
1 loss的作用 在南溪看来,loss函数是对目标target和预测prediction之间的一种距离度量的公式: 2 loss函数的设计原则 此设计原则参考了距离的定义,(注意:距离跟范数是两个概 ...
最新文章
- oracle sqlserver 查看指定用户下面的表
- jquery.inputmask.js 输入框input输入内容格式限制插件
- django Forbidden
- linux localhost的修改
- 利用cookies让sweetalert只出现一次
- ASP.NET设置发帖时间间隔不超过30秒
- 示范NTFS 卷上的流
- Android 系统服务列表
- 让你的CSS更尽完美的技巧
- MATLAB Simulink仿真应用
- 修改tomcat浏览器地址栏图标
- Park 变换 系数2/3的由来
- 单片机实验(十)数码管动态显示
- Java 45:Spring
- 使用Redis+萤石云保证视频永不过期
- AcWing 273. 分级 (推论,DP)
- 申报绿色工厂的条件和标准是什么?
- python校验用户登录信息
- 计算机网络之应用层-Internet电子邮件
- 【答学员问】培训班毕业的linux运维的女生,如何找到运维工作?
热门文章
- oracle先的lvm分配,LVM实战案例之LVM空间缩减(本次对PV,VG,LV等进行空间缩减)
- 制药工程专业计算机二级,全国制药工程本科专业认证标准2016年12月修订.pdf
- ajax常见写法,jquery ajax较常见的写法
- CSS基础汇总——点击标题跳转详细博客【学习笔记】
- php中mysql数据库集群,MySQL集群
- 收藏~10年软件测试人员的工作方法进阶汇总
- oracle+日誌語句,oracle维护常用sql语句
- Lenovo ThinkPad T系列解决 VMware Workstation 打开虚拟机提示:Intel VT-x处于禁用状态问题
- python根据index合并_通过index和cols合并/联接/追加两个Pandas数据帧,其中包含多索引列...
- sql主键可以有多个_干货 | 新手请速戳!30个精选SQL面试问题Qamp;A集锦