【pytorch】pytorch学习笔记(续2)

p30:1.均方差(Mean Squared Error,MSE):

(1)注意区分MSE和L2范数:

【pytorch】pytorch学习笔记(续2)_第1张图片

L2范数要开根号,而MSE不需要开根号。

【pytorch】pytorch学习笔记(续2)_第2张图片

用torch.norm函数求MSE的时候不要忘记加上pow(2)。

求导:

【pytorch】pytorch学习笔记(续2)_第3张图片

pytorch实现自动求导:第一种方法:torch.autograd.grad()

【pytorch】pytorch学习笔记(续2)_第4张图片

设置w需要求导有两种方法:

(1)在创建w之后,用来设置w需要求导。

(2)在创建w的时候,用w=torch.tensor([1],requires_grad=True)来设置w需要求导。

用torch.autograd.grad(y,[w:放需要对谁求导])实现求导,如果w设置的是需要求导,那么可以正常求导,否则会报错。

pytorch求MSE:

第一个参数是预测值,第二个参数是求预测值的表达式。

第二种方法:mse.backward()

【pytorch】pytorch学习笔记(续2)_第5张图片

使用mse.backward()反向传播,将计算出的梯度结果放到每一个求导对象(如w)上,即通过w.grad即可返回w的梯度信息。

注意:w.norm()返回的是L2范数,w.grad.norm()返回的是梯度的norm

总结:

【pytorch】pytorch学习笔记(续2)_第6张图片

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的函数定义为:

【pytorch】pytorch学习笔记(续2)_第7张图片

对softmax函数求导:

(1)当i=j时:

【pytorch】pytorch学习笔记(续2)_第8张图片

(2)else:

【pytorch】pytorch学习笔记(续2)_第9张图片

总结:

【pytorch】pytorch学习笔记(续2)_第10张图片

pytorch实现:

【pytorch】pytorch学习笔记(续2)_第11张图片

(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.符号表示:

【pytorch】pytorch学习笔记(续2)_第12张图片

其中,w的ij分别表示:上一层的节点序号,当前层的节点序号。

求导:

【pytorch】pytorch学习笔记(续2)_第13张图片

pytorch实现:

【pytorch】pytorch学习笔记(续2)_第14张图片

p33:1.求导:

【pytorch】pytorch学习笔记(续2)_第15张图片

【pytorch】pytorch学习笔记(续2)_第16张图片

pytorch实现:

【pytorch】pytorch学习笔记(续2)_第17张图片

mse_loss()参数不太懂

w和w.grad的shape必须是相同的,否则没法进行w更新操作。

p34:1.pytorch实现链式法则:

【pytorch】pytorch学习笔记(续2)_第18张图片

p35:

【pytorch】pytorch学习笔记(续2)_第19张图片

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.回归问题和分类问题的区别:

【pytorch】pytorch学习笔记(续2)_第20张图片

2.logistic regression用于解决分类问题。

p38:1.分类问题的损失函数有:

【pytorch】pytorch学习笔记(续2)_第21张图片Cross Entropy Loss:交叉熵损失函数

2.熵:log是以2为底。

熵值越小越不稳定。

3.交叉熵和熵之间的联系:

熵是衡量一个分布p本身的一个不稳定性,而交叉熵是衡量两个分布p和q的不稳定性。

4.交叉熵:

DKL(p|q):表示p和q之间的离散程度,p和q几乎完全重合时,D接近于0。

所以当p=q时:

【pytorch】pytorch学习笔记(续2)_第22张图片

而对于one-hot编码(在分类问题中就是0/1编码),

,所以,当p和q越接近时,D的值

就越接近0,这恰好就是我们分类问题优化的一个目标,即越接近。

5.分类问题问什么不用MSE作为损失函数,而用交叉熵损失函数?

(1)如果用MSE,那么sigmoid+MSE会很容易出现sigmoid饱和的情况,从而出现梯度离散现象;

(2)经验表明,交叉熵损失函数梯度信息更大,更容易收敛的更快;

(3)但有时交叉熵损失函数不行的时候,可以试一下MSE,因为MSE的求导更简单。

6.

【pytorch】pytorch学习笔记(续2)_第23张图片

Cross Entropy=Softmax+log+nll_loss

如果要自己写的话,必须实现右边的三个操作,而直接用Cross Entropy的话会十分简洁。

【pytorch】pytorch学习笔记(续2)_第24张图片

(实践39,40)p40:1.就注意区分。一般会优先使用nn....。

【pytorch】pytorch学习笔记(续2)_第25张图片


(未完,待续~)

你可能感兴趣的:(pytorch,学习,笔记)