均方差Mean Squared Error(MSE)

MSE基本形式:
loss=∑[y−(xw+b)]2loss = \sum[y-(xw+b)]^2 loss=∑[y−(xw+b)]2
这里的模型使用非常简单的线性感知机,如果使用其他的网络,则修改为loss=∑[y−f(x;w,b)]2loss = \sum[y-f(x;w,b)]^2loss=∑[y−f(x;w,b)]2

需要注意的是,这里的均方差MSE和L2-norm是有区别的:
l2−norm=∑(y1−y2)2l2-norm=\sqrt{\sum{(y_1-y_2)^2}} l2−norm=∑(y1​−y2​)2​
PyTorch在MSE中的使用:torch.norm(y-y',2).pow(2)

MSE梯度

loss=∑[y−fθ(x)]2∇loss∇θ=2∑[y−fθ(x)]∗∇fθ(x)∇θloss = \sum[y-f_\theta(x)]^2 \\ \frac{\nabla loss}{\nabla \theta} = 2\sum[y-f_\theta(x)]*\frac{\nabla f_\theta(x)}{\nabla \theta} loss=∑[y−fθ​(x)]2∇θ∇loss​=2∑[y−fθ​(x)]∗∇θ∇fθ​(x)​
因此,如果使用简单的线性回归,那么f(x)=wx+bf(x)=wx+bf(x)=wx+b,那么对于∇fθ(x)∇θ\frac{\nabla f_\theta(x)}{\nabla \theta}∇θ∇fθ​(x)​则为(x,1)

使用torch.autograd.grad(loss,[w1,w2…])求导

返回结果是list的方式:[w1 grad, w2 grad, w3 grad .....]
这里使用最简单的线性模型y=wxy=wxy=wx

x = torch.ones(1)
w = torch.full([1],2)
w = w.type_as(torch.FloatTensor()) # 将w由LongTensor转为FloatTensor,否则无法设置梯度
w.requires_grad_() # tensor([2.], requires_grad=True) 设置w的梯度
mse = F.mse_loss(x*w ,torch.ones(1)) # tensor(1.) 这里假设label是1
torch.autograd.grad(mse,[w]) # 第一个参数是y(loss),第二个参数是参数
# (tensor([2.]),)

loss=(1−1∗2)2∂loss∂w=2∗(1−2)∗(−1)∂loss∂w=2loss = (1-1*2)^2 \\ \frac{\partial loss}{\partial w} = 2 * (1-2)*(-1)\frac{\partial loss}{\partial w} = 2 loss=(1−1∗2)2∂w∂loss​=2∗(1−2)∗(−1)∂w∂loss​=2
设置w的梯度还可以通过在初始化时进行设置,w = torch.tensor([1],requires_grad=True)

使用loss.backward()求导

不会额外返回结果,而是直接附加在每个成员变量上,结果是:w1.gradw2.grad
除了使用torch.autograd.grad(mse,[w])方式求导外,还可以使用:

mse = F.mse_loss(x*w, torch.ones(1))
mse.backward() # 向后传播
w.grad
# tensor([2.])

mse.backward()表示向后传播,PyTorch会自动记录下图的路径,因此在最后的loss节点上调用backward时,会完成这条路径上所有的需要梯度grad的计算,这个计算后的grad不会直接返回,而是会自动把grad信息附加在每个tensor的成员变量.grad上,因为这个只有一个w参数,因此只有一个w.grad

Cross Entropy Loss

常见的分类中的损失函数,既可以用于二分类,也可以用多分类,一般跟softmax激活函数搭配一起使用。

softmax激活函数


对于一个输出y,如果需要转为概率值,希望概率最大的值作为预测的label,如上图,2.0最大,其对应的索引是0,因此0就是一个label。但是我们的概率是属于一个区间,如果要把这个值转为概率值,需要人为进行压缩,可以使用sigmoid函数来完成,但是对于多分类来说,一个物体到底属于哪个类,有概率的大小之分,而这些概率之和为1。因此使用sigmoid并不是十分准确。
对于softmax的属性是:每一个值的大小范围是(0,1),所有概率之和为1。
S(yi)=eyi∑jeyjS(y_i) = \frac{e^{y_i}}{\sum_je^{y_j}} S(yi​)=∑j​eyj​eyi​​
对于上面的例子:
e2e2+e1+e0.1+e1e2+e1+e0.1+e0.1e2+e1+e0.1=1\frac{e^2}{e^2+e^1+e0.1}+\frac{e^1}{e^2+e^1+e0.1}+\frac{e^{0.1}}{e^2+e^1+e0.1} = 1 e2+e1+e0.1e2​+e2+e1+e0.1e1​+e2+e1+e0.1e0.1​=1
之前的标签2和1的差距只有2倍,而经过softmax操作之后,0.7和0.2的差距却放大了。因此softmax会将原来的差距拉大。

softmax导数

pi=eai∑k=1Neak∂pi∂aj={pi(1−pj)if i = j−pj⋅pi,if i≠jp_i = \frac{e^{a_i}}{\sum_{k=1}^Ne^{a_k}} \\ \frac{\partial p_i}{\partial a_j} = \begin{cases} p_i(1-p_j) & \text {if i = j} \\ -p_j·p_i, & \text{if i}\ne j \end{cases} pi​=∑k=1N​eak​eai​​∂aj​∂pi​​={pi​(1−pj​)−pj​⋅pi​,​if i = jif i​=j​
可以根据公式看出当i=j时,梯度是大于0的,其他情况下是小于0的。

计算梯度

a = torch.rand(3)
a.requires_grad_() # tensor([0.2306, 0.6693, 0.6334], requires_grad=True)p = F.softmax(a, dim=0)
# tensor([0.2471, 0.3832, 0.3697], grad_fn=<SoftmaxBackward>)
torch.autograd.grad(p[0],[a], retain_graph=True)
# (tensor([ 0.1860, -0.0947, -0.0914]),)
torch.autograd.grad(p[1],[a], retain_graph=True)
# (tensor([-0.0947,  0.2364, -0.1417]),)
torch.autograd.grad(p[2],[a], retain_graph=True)
# (tensor([-0.0914, -0.1417,  0.2330]),)

∂p0∂ai=[0.1860,−0.0947,−0.0914]\frac{\partial p_0}{\partial a_i}=[ 0.1860, -0.0947, -0.0914]∂ai​∂p0​​=[0.1860,−0.0947,−0.0914],其中∂p0∂a0=[0.1860],∂p0∂a1=[−0.0947],∂p0∂a2=[−0.0914]\frac{\partial p_0}{\partial a_0}=[ 0.1860],\frac{\partial p_0}{\partial a_1}=[ -0.0947],\frac{\partial p_0}{\partial a_2}=[ -0.0914]∂a0​∂p0​​=[0.1860],∂a1​∂p0​​=[−0.0947],∂a2​∂p0​​=[−0.0914]可以看出当j=i时,梯度信息是正的。

PyTorch教程(九):损失函数与Loss的梯度相关推荐

  1. Pytorch中的损失函数-CROSSENTROPY LOSS

    CLASS torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, redu ...

  2. pytorch教程之自动求导机制(AUTOGRAD)-从梯度和Jacobian矩阵讲起

    文章目录 1. 梯度和Jacobian矩阵 2. pytorch求变量导数的过程 1. 梯度和Jacobian矩阵 设f(x)∈R1f(x)\in R^1f(x)∈R1是关于向量x∈Rnx\in R^ ...

  3. pytorch 12 支持任意维度数据的梯度平衡机制GHM Loss的实现(支持ignore_index、class_weight,支持反向传播训练,支持多分类)

    梯度平衡机制GHM(Gradient Harmonized Mechanism) Loss是Focal loss的升级版,源自论文Gradient Harmonized Single-stage De ...

  4. Stanford CS224N: PyTorch Tutorial (Winter ‘21) —— 斯坦福CS224N PyTorch教程 (第二部分)

    本教程译文的第一部分,请见我的上一篇博文: Stanford CS224N: PyTorch Tutorial (Winter '21) -- 斯坦福CS224N PyTorch教程 (第一部分)_放 ...

  5. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  6. Pytorch学习 - Task6 PyTorch常见的损失函数和优化器使用

    Pytorch学习 - Task6 PyTorch常见的损失函数和优化器使用 官方参考链接 1. 损失函数 (1)BCELoss 二分类 计算公式 小例子: (2) BCEWithLogitsLoss ...

  7. 深度学习与计算机视觉教程(3) | 损失函数与最优化(CV通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/37 本文地址:https://www.showmeai.tech/article-d ...

  8. 常用损失函数(Loss Function)

    [深度学习]一文读懂机器学习常用损失函数(Loss Function) 最近太忙已经好久没有写博客了,今天整理分享一篇关于损失函数的文章吧,以前对损失函数的理解不够深入,没有真正理解每个损失函数的特点 ...

  9. 【深度学习】一文读懂机器学习常用损失函数(Loss Function)

    [深度学习]一文读懂机器学习常用损失函数(Loss Function) 最近太忙已经好久没有写博客了,今天整理分享一篇关于损失函数的文章吧,以前对损失函数的理解不够深入,没有真正理解每个损失函数的特点 ...

最新文章

  1. 20个经典要诀学好英语
  2. keras inception_resnet_v2训练
  3. java大话_大话JAVA(一)
  4. hexo github搭建博客常用的命令
  5. 动态规划的理解与案例分析
  6. Mysql-2-数据库基础
  7. 如何确定恶意软件是否在自己的电脑中执行过?
  8. 算法设计——极大极小搜索
  9. linux c语言播放midi,C语言实现--计算MIDI音符的频率
  10. nfc卡模式与标准模式_干货丨NFC最全解析
  11. 牛头刨床机构动力学的分析(C语言建模)
  12. LABVIEW2020安装OpenG Labpython库无法使用解决办法
  13. 零基础小白入行3D建模,首先!你要了解什么叫建模!
  14. 用Android手机远程桌面连接登陆Windows10(用微软账号登陆),Microsoft账户登陆的计算机远程桌面连接问题
  15. OKHTTP系列(九)---http请求头(header)作用
  16. win7计算机自动关机设置在哪里设置方法,win7自动关机怎么设置?W7自动关机命令设置方法...
  17. 微软谷歌苹果耳机大战 智能竞赛的又一战场
  18. UGUI 列表边缘羽化
  19. 如何一键重装系统环境
  20. 中小型企业计算机局域网总体方案设计

热门文章

  1. 博客园首页博问闪存新随笔联系订阅管理 随笔- 252 文章- 0 评论- 45 HashPasswordForStoringInConfigFile中的Md5算法并非常用的Md5算法...
  2. linux – 我怎么知道我到somaxconn有多近?
  3. 编程界的“马太效应”,是什么在阻止你变得更加优秀?
  4. WeChat判断是否为微信浏览器访问方法:HTTP_USER_AGENT:MicroMessenger
  5. Go的Ducktype
  6. PHP的基础{}[]()
  7. php给定一个起始数字,下标值0,递减的值,求出他所有递减值的开头数字和结尾数字。
  8. 2015美国数学建模a代码c语言,美国数学建模比赛2020 MCM C题代码详解
  9. PHP中的 fastcgi_finish_request();
  10. C语言是始祖,科技日历| 61年前,ALGOL语言创立!它是C语言等高级语言的直接“鼻祖”...