pytorch学习笔记(七)——loss及其梯度
目录
典型loss
典型的loss有两种,第一种是均方差简称MSE。
第二种是用于分类的误差交叉熵,既可以用于二分类问题,也可以用于多分类问题。一般最后的输出要通过softmax函数,第二种loss我们放在之后的博客中讲解。
MSE
(1)MSE定义
为方便,我们下面讲解MSE不再除以数据个数
(2)MSE求导
(3)pytorch对MSE自动求导
两种求导方法:
方法一:autograd.grad,输入loss,和要显示信息的参数,返回参数梯度list
用pytorch自带的函数mse_loss求均方差,传入的值分别为真实值和预测值。autograd.grad函数对变量进行求导,参数一输入loss,参数二输入loss中的参数。由于一开始没有说明需要记录w的求导信息,所以报错。需要加上函数w.requires_grad_,或者在一开始声明w变量时,w=torch.tensor([1],requires_grad=True),继续执行代码仍然报错,原因是因为参数尽管参数声明需要记录求导信息,但是计算图并没有更新,再次运行一次mse_loss函数更新计算图,最后得到想要的结果。
方法二:backward自动求导 参数梯度信息记录在成员变量grad中
softmax激活函数
(1)softmax定义
softmax函数一般用于最后的输出,神经网络的输出最后经过softmax函数使得输出的结果求和为1,范围都在0-1之间,非常符合概率的特点。同时观察上图我们可以看到,输入2,1输出0.7,0.2,他们之间的差距从两倍变成了3.5倍,因softmax函数可以把差距变大,大的更大,小的更加密集。
(2)softmax求导
假设有n个输出a1,a2…aj,经过以上公式得到最终的输出,分别对应p1,p2…pi
1.当i=j时pi对aj的导数公式推导
2.当i!=j时pi对aj的导数公式推导
3.公式合并
(3)softmax的pytorch实现
报错原因:默认 retain_graph=False,也就是反向传播之后这个计算图的内存会被释放,这样就没办法进行第二次反向传播了,所以我们需要设置为 retain_graph=True。
在输入代码34下面图中漏写了一句backward函数,因此执行到代码35时其实是执行了两次backward函数,由于第一次retain_graph默认设置为false,经过一次后向传播后计算图内存被清楚所以再次调用backward函数会报错,输出的p是list[p1,p2,p3]所以传入grad函数不能直接传入p,a是list[a1,a2,a3],一次求pi三个参数的梯度,所以返回三个梯度值,在上面的学习中我们知道,i=j时梯度值为正,其余为负,从结果中得到很好的验证。