本文根据pytorch里面的源码解析各个损失函数,各个损失函数的python接口定义于包torch.nn.modules中的loss.py,在包modules的初始化__init__.py中关于损失函数的导入:

1.损失函数的base类

1.1 Loss的三个参数

​ 从函数代码中可以看出,__init__函数有三个参数size_average, reduce, reduction,这三个参数的关系如下图所示;可以很明显看出,reduce参数控制返回的是Tensor还是scalar,size_average控制在一个batch里面的计算结果,根据需求可以自己设置,一般是(loss.mean())

2.1 weight

​ weight普遍用于分类任务,是一个长度和类别数目一样的Tensor,用于计算损失时针对不同类别进行加权,如下是数字识别不同数字损失的加权例子;

2.各个损失函数汇总

2.1 MAE(L1 Loss)

y是模型的预测输出,t是ground truth,两者都是长度为n的tensor,损失计算如下:


L(y,t)=1n∑in∣yi−ti∣L(\bold{y},\bold{t})=\frac{1}{n}\sum_{i}^{n}|y_{i}-t_{i}| L(y,t)=n1inyiti

2.2 MSE(L2 Loss)

y是模型的预测输出,t是ground truth,两者都是长度为n的tensor,损失计算如下:
L(y,t)=1n∑in∣yi−ti∣2L(\bold{y},\bold{t})=\frac{1}{n}\sum_{i}^{n}|y_{i}-t_{i}|^{2} L(y,t)=n1inyiti2

2.3 BCELoss & BCEWithLogitsLoss

​ BCELoss是常用于二分类的损失函数,y是模型的预测输出(sigmoid的概率值),t是ground truth标签(非0即1),损失计算如下:


L(y,t)=−1n∑in(ti⋅log⁡yi+(1−ti)⋅log⁡(1−yi))L(\bold{y},\bold{t})=-\frac{1}{n}\sum_{i}^{n}(t_{i}\cdot \log{y_{i}}+(1-t_{i})\cdot\log{(1-y_{i})}) L(y,t)=n1in(tilogyi+(1ti)log(1yi))

​ BCEWithLogitsLoss=Sigmoid+BCELoss,不需要在模型输出添加sigmoid层,因为这部分已经被包含在损失函数内部;

2.4 NLLLoss

​ 分类损失:LogSoftmax + NLLLoss = CrossEntropyLoss

y是模型的预测输出(LogSoftmax的值(-∞,0)),t是ground truth标签,损失计算如下:


L(y,t)=−1n∑inyi[ti]L(\bold{y},\bold{t})=-\frac{1}{n}\sum_{i}^{n}y_{i}[t_{i}] L(y,t)=n1inyi[ti]
​ 举个例子,比如经过LogSoftmax的输出Tensor为[-1.233, -2.657,-0.534],label为2,则损失为0.534。

2.5 CrossEntropyLoss

y是模型的预测输出,是长度为类别数量n的tensor,t是ground truth标签,损失计算如下:


L(y,t)=−log⁡(exp(yt)∑jexp(yj))L(\bold{y},\bold{t})=-\log(\frac{exp(y_{\bold{t}})}{\sum_{j}exp(y_{j})}) L(y,t)=log(jexp(yj)exp(yt))

2.6 MultiLabelMarginLoss

y是模型的预测输出,是长度为类别数量n的tensor,t是ground truth标签(one-hot编码),损失计算如下:
L(y,t)=∑ijmax(0,1−(t[y[j]]−y[i]))y.size(0)L(\bold{y},\bold{t})=\sum_{ij}\frac{max(0, 1-(t[y[j]]-y[i]))}{y.size(0)} L(y,t)=ijy.size(0)max(0,1(t[y[j]]y[i]))

2.7 MultiLabelSoftMarginLoss

y是模型的预测输出,是长度为类别数量n的tensor,t是ground truth标签(one-hot编码),损失计算如下:


L(y,t)=−∑i(t[i]∗log⁡(1+exp(−y[i]))−1+(1−t[i])∗log⁡(exp(−y[i])(1+exp(−y[i])))L(\bold{y},\bold{t})=-\sum_{i}(t[i]*\log(1+exp(-y[i]))^{-1}+(1-t[i])*\log(\frac{exp(-y[i])}{(1+exp(-y[i])})) L(y,t)=i(t[i]log(1+exp(y[i]))1+(1t[i])log((1+exp(y[i])exp(y[i])))

2.8 MultiMarginLoss

y是模型的预测输出,是长度为类别数量n的tensor,t是ground truth标签(one-hot编码),损失计算如下:


L(y,t)=∑imax(0,w[t]∗(margin−y[t]+y[i])p)y.size(0)L(\bold{y},\bold{t})=\frac{\sum_{i}max(0,w[t] * (margin-y[t]+y[i])^p)}{y.size(0)} L(y,t)=y.size(0)imax(0,w[t](marginy[t]+y[i])p)

2.9 SoftMarginLoss

y是模型的预测输出,是长度为类别数量n的tensor,t是ground truth标签(二分类,-1或1),损失计算如下:


L(y,t)=∑ilog⁡(1+exp(−t[i]∗y[i]))y.nelement()L(\bold{y},\bold{t})=\sum_{i}\frac{\log(1+exp(-t[i]*y[i]))}{y.nelement()} L(y,t)=iy.nelement()log(1+exp(t[i]y[i]))

2.10 SmoothL1Loss

​ Huber Loss常用于回归问题,对离群点,噪声不敏感,y是模型的预测输出,t是ground truth,两者都是长度为n的tensor,损失函数如下,


Lδ(yi,ti)={12(yi−ti)2∣yi−ti∣<δδ∣yi−ti∣−12δ2otherwiseL_{\delta}(\bold{y_{i}},\bold{t_{i}})=\begin{cases} \frac{1}{2}(\bold{y_{i}}-\bold{t_{i}})^{2} & |\bold{y_{i}}-\bold{t_{i}}| < \delta \\ \delta|\bold{y_{i}}-\bold{t_{i}}| - \frac{1}{2}\delta^{2} & otherwise \end{cases} Lδ(yi,ti)={21(yiti)2δyiti21δ2yiti<δotherwise

Lδ(y,t)=1n∑i=1nLδ(yi,ti)L_{\delta}(\bold{y},\bold{t})=\frac{1}{n}\sum_{i=1}^{n}L_{\delta}(\bold{y_{i}}, \bold{t_{i}}) Lδ(y,t)=n1i=1nLδ(yi,ti)
SmoothL1Loss是Huber Loss函数特殊化,\delta=1时,
Lsmoothl1(yi,ti)={12(yi−ti)2∣yi−ti∣<1∣yi−ti∣−12otherwiseL_{smoothl1}(\bold{y_{i}},\bold{t_{i}})=\begin{cases} \frac{1}{2}(\bold{y_{i}}-\bold{t_{i}})^{2} & |\bold{y_{i}}-\bold{t_{i}}| < 1 \\ |\bold{y_{i}}-\bold{t_{i}}| - \frac{1}{2} & otherwise \end{cases} Lsmoothl1(yi,ti)={21(yiti)2yiti21yiti<1otherwise

Lsmoothl1(y,t)=1n∑i=1nLsmoothl1(yi,ti)L_{smoothl1}(\bold{y},\bold{t})=\frac{1}{n}\sum_{i=1}^{n}L_{smoothl1}(\bold{y_{i}}, \bold{t_{i}}) Lsmoothl1(y,t)=n1i=1nLsmoothl1(yi,ti)

2.11 KLDivLoss

​ K-L源于信息论,信息量的度量单位是,一般用H来表示,分布的的公式如下:
H=−∑i=1Np(xi)log⁡p(xi)H=-\sum_{i=1}^{N}p(x_{i})\log{p(x_i)} H=i=1Np(xi)logp(xi)
​ 只需要改进一下H的公式,就能得到k-L散度的计算公式,设p为观察得到的概率分布,q是另一分布来近似p,则p,q之间的K-L散度为:


D(pi∣∣qi)=∑i=1np(xi)⋅(log⁡p(xi)−log⁡q(xi))=∑i=1np(xi)log⁡(p(xi)q(xi))D(p_{i}||q_{i})=\sum_{i=1}^{n}p(x_{i}) \cdot (\log{p(x_{i})}-\log{q(x_{i})})= \sum_{i=1}^{n}p(x_{i})\log(\frac{p(x_{i})}{q(x_i)}) D(piqi)=i=1np(xi)(logp(xi)logq(xi))=i=1np(xi)log(q(xi)p(xi))
需要注意的是,K-L散度并不是不同分布之间距离的度量,因为从计算公式来看,是不满足对称性!

2.12 MarginRankingLoss

​ 计算两个张量的相似度,输入是三个参数,x1,x2以及y是长度相同的Tensor,y取值为-1或者1,
L(x1,x2,y)=max(0,−y∗(x1−x2)+margin)={max(0,−(x1−x2)+margin)y=1max(0,(x1−x2)+margin)y=−1L(x_{1},x_{2},y)=max(0, -y * (x_{1} - x_{2})+ margin)=\begin{cases} max(0, -(x_{1}-x_{2})+margin) & y=1 \\ max(0, (x_{1}-x_{2})+margin) & y=-1 \end{cases} L(x1,x2,y)=max(0,y(x1x2)+margin)={max(0,(x1x2)+margin)max(0,(x1x2)+margin)y=1y=1

2.13 CosineEmbeddingLoss

​ 余弦损失函数,计算两个向量的相似性,两个向量的余弦值越高,则相似性越高,输入是三个参数,x1,x2以及y是长度相同的Tensor,y取值为-1或者1,


L(x1,x2,y)={1−cos(x1,x2)y=1max(0,cos(x1−x2)−margin)y=−1L(x_{1},x_{2},y)=\begin{cases} 1-cos(x_{1}, x_{2}) & y=1 \\ max(0, cos(x_{1}-x_{2})-margin) & y=-1 \end{cases} L(x1,x2,y)={1cos(x1,x2)max(0,cos(x1x2)margin)y=1y=1
​ 1.当y=1时,直接用-cos(x1,x2)的平移函数作为损失函数;

​ 2.当y=-1时,在cos(x1,x2)=margin处做了分割,用于衡量两个向量的不相似性;

2.14 HingeEmbeddingLoss

​ 输入是两个参数,x与y是长度相同的Tensor,y取值为-1或者1,


loss(x,y)=1n∑i=1n{xiyi=1max(0,margin−xi)yi=−1loss(x,y)=\frac{1}{n}\sum_{i=1}^{n}\begin{cases} x_{i} & y_i=1 \\ max(0, margin-x_{i}) & y_{i}=-1 \end{cases} loss(x,y)=n1i=1n{ximax(0,marginxi)yi=1yi=1
​ margin默认为1,

​ 1.当y=-1的时候,loss=max(0,1-x),如果x>1(margin),则loss=0;如果x<1,则loss=1-x;

​ 2.当y=1,loss=x。

2.15 TripletMarginLoss

​ Triplet Loss是用来训练差异性较小的样本,如人脸等,数据选择包括三项Anchor示例,Positive示例,Negative示例,通过优化Anchor示例与正示例的距离小于Anchor示例与负示例的距离,来实现样本的相似性的计算,如下图所示:

​ 损失函数如下:


L(a,p,n)=1n∑i=1nmax{d(ai,pi)−d(ai,ni)+margin,0}L(a,p,n)=\frac{1}{n}\sum_{i=1}^{n}max\{d(a_{i},p_{i})-d(a_{i},n_{i})+margin,0\} L(a,p,n)=n1i=1nmax{d(ai,pi)d(ai,ni)+margin,0}

d(xi,yi)=∣∣xi−yi∣∣pd(x_{i}, y_{i})=||x_{i}-y_{i}||_{p} d(xi,yi)=xiyip

3.参考说明:

本文是作者在实践过程中总结出来的激活函数说明,后续有补充会及时更新,如有不正确之处,欢迎各位大佬批评指正!!!

​ 1.https://www.jianshu.com/p/43318a3dc715;

​ 2.https://juejin.cn/post/6844903949124763656;

​ 3.https://www.jianshu.com/p/46c6f68264a1;

​ 4.https://my.oschina.net/u/4584682/blog/4481019

Pytorch损失函数解析相关推荐

  1. 基于Pytorch再次解析使用块的现代卷积神经网络(VGG)

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  2. 基于Pytorch再次解析AlexNet现代卷积神经网络

    个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...

  3. Caffe中的损失函数解析

    Caffe中的损失函数解析 导言 在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的损失函数(Loss Function). 在Caffe中,目前已经实现了一些损失函数,包括最常见的L2损 ...

  4. pytorch代码解析:loss = y_hat - y.view(y_hat.size())

    pytorch代码解析:pytorch中loss = y_hat - y.view(y_hat.size()) import torchy_hat = torch.tensor([[-0.0044], ...

  5. 机器学习、增量学习中的各种损失函数解析

    机器学习中的各种损失函数解析:若博文有不妥之处,望加以指点,笔者一定及时修正. 文章目录 ① 损失函数 1.Softmax Loss 2.交叉熵(Cross Entropy) 3.相对熵(KLD散度. ...

  6. 初探强化学习(13)DQN的Pytorch代码解析,逐行解析,每一行都不漏

    首先上完整的代码. 这个代码是大连理工的一个小姐姐提供的.小姐姐毕竟是小姐姐,心细如丝,把理论讲的很清楚.但是代码我没怎么听懂.小姐姐在B站的视频可以给大家提供一下.不过就小姐姐这个名字,其实我是怀疑 ...

  7. pytorch 损失函数总结

    PyTorch深度学习实战 4 损失函数 损失函数,又叫目标函数,是编译一个神经网络模型必须的两个参数之一.另一个必不可少的参数是优化器. 损失函数是指用于计算标签值和预测值之间差异的函数,在机器学习 ...

  8. Pytorch损失函数losses简介

    一般来说,监督学习的目标函数由损失函数和正则化项组成.(Objective = Loss + Regularization) Pytorch中的损失函数一般在训练模型时候指定. 注意Pytorch中内 ...

  9. Pytorch —— 损失函数(二)

    目录 5.nn.L1Loss 6.nn.MSELoss 7.nn.SmoothL1Loss 8.nn.PoissonNLLLoss 9.nn.KLDivLoss 10.nn.MarginRanking ...

最新文章

  1. 主机入侵防御系统(HIPS)分析
  2. 用JS解决图片太大,把网站撑变形的问题
  3. mysql5.7 hibenate5.1_5.7 Spring与Hibernate整合应用
  4. 排序陷阱 List.Sort Linq.OrderBy
  5. Python异常:TypeError: a bytes-like object is required, not 'str'
  6. 动手学深度学习(PyTorch实现)(九)--VGGNet模型
  7. python 绘制简易折线图
  8. 添加rabbitmq守护进程
  9. 两条信号之间加电容_电容是什么?怎么用?怎么买?
  10. windows 2003 server无法远程桌面连接
  11. OpenCV学习】矩阵运算和操作2
  12. QT5 配置nPcap过程
  13. 前端 - 实习一个月总结
  14. 正高、正常高和大地高的区别
  15. Sklearn中的StratifiedKFold与stacking模型的融合方法
  16. IBM技术论坛:使用 Cobertura 和反射机制提高单元测试中的代码覆盖率
  17. 自学Python3脚本100例(1-10)
  18. 百度员工离职总结:资质平庸的人该怎么办?震惊了无数人!
  19. Jenkins发布api jobs,利用supervisor管理运行
  20. 三星980处理器和骁龙855_骁龙855、麒麟980、Exynos9820谁最强?看完秒懂

热门文章

  1. 内存检测之KFENCE
  2. 向SQL Server 中导入长文本
  3. [硬件选型] 光源及照明方式的选择
  4. MsgQ机制,实现H5游戏的模块彻底分离
  5. 2018-2019-2 20175227张雪莹《Java程序设计》
  6. 【Liunx】Navicat连接ubuntu下mysql
  7. CSS实现文字垂直居中
  8. HCIA:动态路由路由协议RIP及DHCP
  9. linux是专业的gis系统,首款支持红旗Linux操作系统的GIS基础平台问世
  10. P1423 小玉在游泳 NOIP python题解