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

pytorch因为多线程原因导致内存不足_笔记

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

pytorch因为多线程原因导致内存不足_笔记_02

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

pytorch因为多线程原因导致内存不足_学习_03

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

求导:

pytorch因为多线程原因导致内存不足_MSE_04

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

pytorch因为多线程原因导致内存不足_pytorch_05

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

(1)在创建w之后,用

pytorch因为多线程原因导致内存不足_pytorch_06

来设置w需要求导。

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

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

pytorch求MSE:

pytorch因为多线程原因导致内存不足_损失函数_07

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

第二种方法:mse.backward()

pytorch因为多线程原因导致内存不足_学习_08

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

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

总结:

pytorch因为多线程原因导致内存不足_损失函数_09

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因为多线程原因导致内存不足_笔记_10

对softmax函数求导:

(1)当i=j时:

pytorch因为多线程原因导致内存不足_pytorch_11

(2)else:

pytorch因为多线程原因导致内存不足_笔记_12

总结:

pytorch因为多线程原因导致内存不足_MSE_13

pytorch实现:

pytorch因为多线程原因导致内存不足_MSE_14

(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因为多线程原因导致内存不足_笔记_15

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

求导:

pytorch因为多线程原因导致内存不足_学习_16

pytorch实现:

pytorch因为多线程原因导致内存不足_pytorch_17

p33:1.求导:

pytorch因为多线程原因导致内存不足_MSE_18

pytorch因为多线程原因导致内存不足_pytorch_19

pytorch实现:

pytorch因为多线程原因导致内存不足_学习_20

mse_loss()参数不太懂

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

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

pytorch因为多线程原因导致内存不足_pytorch_21

p35:

pytorch因为多线程原因导致内存不足_pytorch_22

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_23

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

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

pytorch因为多线程原因导致内存不足_损失函数_24

Cross Entropy Loss:交叉熵损失函数2.熵:

pytorch因为多线程原因导致内存不足_损失函数_25

log是以2为底。

熵值越小越不稳定。

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

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

4.交叉熵:

pytorch因为多线程原因导致内存不足_pytorch_26

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

所以当p=q时:

pytorch因为多线程原因导致内存不足_pytorch_27

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

pytorch因为多线程原因导致内存不足_pytorch_28

,所以

pytorch因为多线程原因导致内存不足_学习_29

,当p和q越接近时,D的值就越接近0,这恰好就是我们分类问题优化的一个目标,即

pytorch因为多线程原因导致内存不足_学习_30


pytorch因为多线程原因导致内存不足_MSE_31

越接近。

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

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

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

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

6.

pytorch因为多线程原因导致内存不足_学习_32

Cross Entropy=Softmax+log+nll_loss

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

pytorch因为多线程原因导致内存不足_损失函数_33

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

pytorch因为多线程原因导致内存不足_pytorch_34