Pytorch损失函数解析
本文根据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)=n1i∑n∣yi−ti∣
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)=n1i∑n∣yi−ti∣2
2.3 BCELoss & BCEWithLogitsLoss
BCELoss是常用于二分类的损失函数,y是模型的预测输出(sigmoid的概率值),t是ground truth标签(非0即1),损失计算如下:
L(y,t)=−1n∑in(ti⋅logyi+(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)=−n1i∑n(ti⋅logyi+(1−ti)⋅log(1−yi))
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)=−n1i∑nyi[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)=ij∑y.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+(1−t[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]∗(margin−y[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)=i∑y.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(yi−ti)2δ∣yi−ti∣−21δ2∣yi−ti∣<δ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=1∑nLδ(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(yi−ti)2∣yi−ti∣−21∣yi−ti∣<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=1∑nLsmoothl1(yi,ti)
2.11 KLDivLoss
K-L源于信息论,信息量的度量单位是熵,一般用H来表示,分布的熵的公式如下:
H=−∑i=1Np(xi)logp(xi)H=-\sum_{i=1}^{N}p(x_{i})\log{p(x_i)} H=−i=1∑Np(xi)logp(xi)
只需要改进一下H的公式,就能得到k-L散度的计算公式,设p为观察得到的概率分布,q是另一分布来近似p,则p,q之间的K-L散度为:
D(pi∣∣qi)=∑i=1np(xi)⋅(logp(xi)−logq(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(pi∣∣qi)=i=1∑np(xi)⋅(logp(xi)−logq(xi))=i=1∑np(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∗(x1−x2)+margin)={max(0,−(x1−x2)+margin)max(0,(x1−x2)+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)={1−cos(x1,x2)max(0,cos(x1−x2)−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=1∑n{ximax(0,margin−xi)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=1∑nmax{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)=∣∣xi−yi∣∣p
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损失函数解析相关推荐
- 基于Pytorch再次解析使用块的现代卷积神经网络(VGG)
个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...
- 基于Pytorch再次解析AlexNet现代卷积神经网络
个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net 基于 ...
- Caffe中的损失函数解析
Caffe中的损失函数解析 导言 在有监督的机器学习中,需要有标签数据,与此同时,也需要有对应的损失函数(Loss Function). 在Caffe中,目前已经实现了一些损失函数,包括最常见的L2损 ...
- 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], ...
- 机器学习、增量学习中的各种损失函数解析
机器学习中的各种损失函数解析:若博文有不妥之处,望加以指点,笔者一定及时修正. 文章目录 ① 损失函数 1.Softmax Loss 2.交叉熵(Cross Entropy) 3.相对熵(KLD散度. ...
- 初探强化学习(13)DQN的Pytorch代码解析,逐行解析,每一行都不漏
首先上完整的代码. 这个代码是大连理工的一个小姐姐提供的.小姐姐毕竟是小姐姐,心细如丝,把理论讲的很清楚.但是代码我没怎么听懂.小姐姐在B站的视频可以给大家提供一下.不过就小姐姐这个名字,其实我是怀疑 ...
- pytorch 损失函数总结
PyTorch深度学习实战 4 损失函数 损失函数,又叫目标函数,是编译一个神经网络模型必须的两个参数之一.另一个必不可少的参数是优化器. 损失函数是指用于计算标签值和预测值之间差异的函数,在机器学习 ...
- Pytorch损失函数losses简介
一般来说,监督学习的目标函数由损失函数和正则化项组成.(Objective = Loss + Regularization) Pytorch中的损失函数一般在训练模型时候指定. 注意Pytorch中内 ...
- Pytorch —— 损失函数(二)
目录 5.nn.L1Loss 6.nn.MSELoss 7.nn.SmoothL1Loss 8.nn.PoissonNLLLoss 9.nn.KLDivLoss 10.nn.MarginRanking ...
最新文章
- 主机入侵防御系统(HIPS)分析
- 用JS解决图片太大,把网站撑变形的问题
- mysql5.7 hibenate5.1_5.7 Spring与Hibernate整合应用
- 排序陷阱 List.Sort Linq.OrderBy
- Python异常:TypeError: a bytes-like object is required, not 'str'
- 动手学深度学习(PyTorch实现)(九)--VGGNet模型
- python 绘制简易折线图
- 添加rabbitmq守护进程
- 两条信号之间加电容_电容是什么?怎么用?怎么买?
- windows 2003 server无法远程桌面连接
- OpenCV学习】矩阵运算和操作2
- QT5 配置nPcap过程
- 前端 - 实习一个月总结
- 正高、正常高和大地高的区别
- Sklearn中的StratifiedKFold与stacking模型的融合方法
- IBM技术论坛:使用 Cobertura 和反射机制提高单元测试中的代码覆盖率
- 自学Python3脚本100例(1-10)
- 百度员工离职总结:资质平庸的人该怎么办?震惊了无数人!
- Jenkins发布api jobs,利用supervisor管理运行
- 三星980处理器和骁龙855_骁龙855、麒麟980、Exynos9820谁最强?看完秒懂