PyTorch入门实战教程笔记(十一):梯度相关操作2

PyTorch入门实战教程笔记(十一):梯度相关操作2

Loss及其梯度

  1. 均方差Mean Squared Error (MSE)
    MSE的基本形式为:loss = Σ[y - (xw + b)]2 ,这里要注意 mse与L2-norm是不同的 L2-norm = || y - (xw+b) ||2 其运算为√(Σ(yi - y0i)2), 故在程序中实现mse,通过下面的程序段:
torch.norm(y-pred, 2).pow(2)   #运算后在平方

其梯度求解数学表示:
PyTorch入门实战教程笔记(十一):梯度相关操作2_第1张图片
使用pytorch自动求导,首先令x=1,w=2,b=0. 使用F.mes_loss求得均方差loss为1. 接下来,如果直接调用自动求导机制,会报错说w不需要求导,这是因为在定义w时没有指定w需要求导,可以通过w.requires_grad_(),来让w需要求导(也可以新建w时,告诉torch,这个w是需要更新梯度信息的,required=True,下图红色字)。接下来应该可以了吧,还是报错,是因为pythorch是一个动态图,我们更新了这个w,但是这个图还没更新,我们pythorch是做一步更新一步,所以需要重新运行一下求loss的语句,这样以后,就可以利用torch.autograd.grad(mes,[w]),来更新梯度信息了。
PyTorch入门实战教程笔记(十一):梯度相关操作2_第2张图片
除了上面的方法,还可以直接在loss上面调用backward(),前提也需要完成w需要求梯度的 动态图的创建,使用mse.backword(), 这条语句完成的操作: 会反向传播,完成该路径上所有需要梯度的tensor的梯度的计算方法,但是计算的梯度不会返回出来,而是将计算结果附加在每一个需要求梯度的grad上,如w.grad, 具体如下图:
PyTorch入门实战教程笔记(十一):梯度相关操作2_第3张图片

  1. 用于分类的Cross Entropy Loss
    (1)cross entropy loss详细介绍
    (2)Softmax函数:
    前面介绍过,Sigmoid可以将数据压缩到[0, 1], 但分类问题我们希望所有的概率之和为1,才满足我们的要求,而Softmax函数可以达到此目的。
    PyTorch入门实战教程笔记(十一):梯度相关操作2_第4张图片
    求softmax的求导,当i = j 时,具体运算过程如下:
    PyTorch入门实战教程笔记(十一):梯度相关操作2_第5张图片
    当i ≠ j 时,具体运算过程如下:
    PyTorch入门实战教程笔记(十一):梯度相关操作2_第6张图片
    总结如下:
    PyTorch入门实战教程笔记(十一):梯度相关操作2_第7张图片
    pytorch实战,我们可以使用F.softmax(a, dim=0)来实现,需要注意的是,当我们调用p.backword()时,torch不仅把梯度信息保存在W.grad中,同时也会把该图的梯度信息清除掉,会提示让我们设置retain_graph = True这个标志,因此当我们想第二次调用backward时,需要在前一次做p.backward(retain_graph = True)这个操作(这个标志只会保持一次)。如下:
    PyTorch入门实战教程笔记(十一):梯度相关操作2_第8张图片
    除此之外,不管使用grad函数还是backward函数,我们需要注意loss要使长度为1的feature,当dim=1长度为3的feature是不可行的。即传入的loss是有一个量。下图所示,因为p是一个[3]的量,所以不能传p,需要传p[1]。
    PyTorch入门实战教程笔记(十一):梯度相关操作2_第9张图片

你可能感兴趣的:(PyTorch实战学习笔记)