p30:1.均方差(Mean Squared Error,MSE):
(1)注意区分MSE和L2范数:
L2范数要开根号,而MSE不需要开根号。
用torch.norm函数求MSE的时候不要忘记加上pow(2)。
求导:
pytorch实现自动求导:第一种方法:torch.autograd.grad()
设置w需要求导有两种方法:
(1)在创建w之后,用来设置w需要求导。
(2)在创建w的时候,用w=torch.tensor([1],requires_grad=True)来设置w需要求导。
用torch.autograd.grad(y,[w:放需要对谁求导])实现求导,如果w设置的是需要求导,那么可以正常求导,否则会报错。
pytorch求MSE:
第一个参数是预测值,第二个参数是求预测值的表达式。
第二种方法:mse.backward()
使用mse.backward()反向传播,将计算出的梯度结果放到每一个求导对象(如w)上,即通过w.grad即可返回w的梯度信息。
注意:w.norm()返回的是L2范数,w.grad.norm()返回的是梯度的norm。
总结:
torch.autograd.grad会返回一个tensor,而loss.backward()不会返回结果,而是赋给了每一个维度,可通过w1.grad查看相应的梯度。
2.Cross Entropy Loss:可用于二分类,多分类,可以和softmax函数搭配起来使用,讲逻辑回归时会详细讲解。
p31:1.softmax:满足每个值都是区间[0,1]内的,并且所有值的和是等于1的。因此softmax十分适合于多分类问题(将概率值的最大值对应的索引作为label)。softmax还有一个额外的效果:将原来大的放的更大,将原来小的压缩的更小。比如:原来y1=2.0,y2=1.0,y1=2y2,而经过softmax函数处理之后,y1=0.7,y2=0.2,y1=3.5y2,3.5>2.0,所以将原来大的放的更大了。softmax的函数定义为:
对softmax函数求导:
(1)当i=j时:
(2)else:
总结:
pytorch实现:
(1)p.backward():把梯度信息写道相应的维度,同时也会清除图中的梯度信息,即执行完该语句后再次执行p.backward()会报错。
(2)如果设置了p.backward(retain_grad=True),那么执行完该语句后再执行p.backward()就不会报错了,但如果第三次执行p.backward()而第二次p.backward()中没有设置retain_grad=True,那么第三次执行会报错。即retain_grad=True只能使梯度信息保持一次。
(3)注意:无论是backward函数还是autograd.grad函数,loss函数都必须是1维且长度为1的(即shape为[1]),如果是1维但长度为3,则说明你的计算出错了,不对。
(4)p=F.softmax(a,dim=0)会自动建图。
p32:1.符号表示:
其中,w的ij分别表示:上一层的节点序号,当前层的节点序号。
求导:
pytorch实现:
p33:1.求导:
pytorch实现:
mse_loss()参数不太懂
w和w.grad的shape必须是相同的,否则没法进行w更新操作。
p34:1.pytorch实现链式法则:
p35:
p36:1.X,Y=np.meshgrid(x,y):把x和y的范围传进去,就会生成两张图片,每张图片上相同位置的两个点拼在一起,就会形成一个坐标(x,y)。
2.optimizer=torch.optim.Adam([x],lr=1e-3):这就话意思就是对x和y进行更新。调用optimizer.step(),就会对x和y进行一次更新。
(问题)参数中是[x],为什么会对x和y两个进行更新?没有提到y,为什么会对y更新?
optimizer.zero_grad():对梯度进行清零。在进行梯度下降迭代之前,要先将梯度清零。
p37:1.回归问题和分类问题的区别:
2.logistic regression用于解决分类问题。
p38:1.分类问题的损失函数有:
Cross Entropy Loss:交叉熵损失函数
2.熵:log是以2为底。
熵值越小越不稳定。
3.交叉熵和熵之间的联系:
熵是衡量一个分布p本身的一个不稳定性,而交叉熵是衡量两个分布p和q的不稳定性。
4.交叉熵:
DKL(p|q):表示p和q之间的离散程度,p和q几乎完全重合时,D接近于0。
所以当p=q时:
而对于one-hot编码(在分类问题中就是0/1编码),
,所以,当p和q越接近时,D的值
就越接近0,这恰好就是我们分类问题优化的一个目标,即和越接近。
5.分类问题问什么不用MSE作为损失函数,而用交叉熵损失函数?
(1)如果用MSE,那么sigmoid+MSE会很容易出现sigmoid饱和的情况,从而出现梯度离散现象;
(2)经验表明,交叉熵损失函数梯度信息更大,更容易收敛的更快;
(3)但有时交叉熵损失函数不行的时候,可以试一下MSE,因为MSE的求导更简单。
6.
Cross Entropy=Softmax+log+nll_loss
如果要自己写的话,必须实现右边的三个操作,而直接用Cross Entropy的话会十分简洁。
(实践39,40)p40:1.就注意区分。一般会优先使用nn....。
(未完,待续~)