Press "Enter" to skip to content

Pytorch学习——梯度下降和反向传播 03 未完

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

文章目录

 

1 梯度是什幺

 

通俗的来说就是学习( 参数更新 )的方向。

 

简单理解,(对于低维函数来讲)就是 导数 (或者是变化最快的方向)

 

2 判断模型好坏的方法

 

 

回归损失

l o s s = ( Y p r e d i c t − Y t r u e ) 2 loss = (Y_{predict} – Y_{true})^2 l oss = ( Y p re d i c t ​ − Y t r u e ​ ) 2

 

分类损失

 

 

l o s s = Y t r u e ⋅ l o g ( Y p r e d i c t ) loss = Y_{true} · log(Y_{predict}) l oss = Y t r u e ​ ⋅ l o g ( Y p re d i c t ​ )

 

3 前向传播

 

J ( a , b , c ) = 3 ( a + b c ) J(a, b, c) = 3(a + bc) J ( a , b , c ) = 3 ( a + b c ) , 令 u = a + v u = a+v , v = b c v = bc b c ,把它绘制成计算图可以表示为:

 

绘制成计算图之后,可以清楚的看到前向计算的过程。

 

4 反向传播

 

对每个节点求偏导可以有:

 

反向传播就是一个从右到左的过程,自变量 a , b , c a,b,c a , b , c 各自的骗到就是连线上梯度的乘积

 

 

5 Pytorch中反向传播和梯度计算的方法

 

5.1 前向计算

 

对于Pytorch中的一个tensor,如果设置它的属性, .require_grad=True ,那幺会追踪对于该张量的所有操作。

 

默认值为None

 

import torch
x = torch.ones(2, 2, requires_grad=True)
print(x)
y = x+2
print(y)
z = y*y*3
print(z)

 

输出:

 

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>)

 

总结:

 

(1)之后的每次计算都会修改其 grad_fn 属性,用来记录做过的操作;

 

(2)通过这个函数和 grad_fn 可以生成计算图。

注意

为了防止跟踪历史记录,可以将代码包装在 with torch.no_grad 中。表示不需要追中这一块的计算。

 

import torch
x = torch.ones(2, 2, requires_grad=True)
print(x)
y = x+2
print(y)
z = y*y*3
print(z)
with torch.no_grad():
    u = x+y+z
print(u)

 

tensor([[1., 1.],
        [1., 1.]], requires_grad=True)
tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)
tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>)
tensor([[31., 31.],
        [31., 31.]])

 

5.2 梯度计算

 

可以使用 backward() 方法来进行反向传播,计算梯度 out.backward() ,此时能方便求出导数。

 

调用 x.grad() 可以获取导数值。

 

注意:

 

在输入是一个标量的情况下,可以调用输出 tensorbackward() 方法,但是在输出是一个向量的时候,调用 backward 时要传入其他参数。

 

5.3 torch.data

 

当tensor的 require_grad 为false的时候, a.data 等同于 a

 

当tensor的 require_grad 为True的时候, a.data 表示仅仅获取其中的数据

 

5.4 tensor.numpy

 

require_grad=True 不能够直接转换,需要用 torch.detach().numpy()

 

detach相当于是深拷贝

 

相当于把原来的tensor数据“抽离”出来,并部影响原来的tensor,然后进行深拷贝,转化为numpy数据。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。