本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
梯度计算在机器学习、深度学习中是最常用的功能,
在传统的编程中,梯度计算依赖于梯度公式,因此在实现上较为困难与繁琐
本文讲解在pytorch中如何实现自动计算梯度,它是pytorch实现深度学习的基础
本节先回顾传统编程中是如何实现梯度计算的
以为例,现要知道在时,x的梯度值,
传统的做法是先求出x的梯度公式,再按梯度公式计算x的梯度值
计算过程如下:
由
可知
因此,在传统的编程中,也必须先获得梯度公式,再按梯度公式计算梯度值,
示例如下:
x = 3
dy = 2*x
print('y对x的梯度:',dy)
运行结果如下:
y对x的梯度: 6
传统求梯度的方式在深度学习中会非常麻烦,因为深度学习的模型函数随着层数的增加、激活函数的改变,往往是多变的,
每当深度学习模型进行一些微小变化时,都需要推导梯度公式、修改代码,因此会非常麻烦
本节讲解在pytorch如何实现梯度自动计算功能
pytorch的tensor变量有一个特色,就是可以带有梯度,并自动计算梯度(求导)
以为例,现要知道在时,x的梯度值,
在pytorch中并不需要计算梯度公式,而是通过对y调用backward命令就可以直接获得x的梯度
实现方法如下:
import torch
x = torch.tensor([3],dtype=(float),requires_grad=True) # 生成一个tensor数据x
y = x@x # 根据x计算y
y.backward() # 将y反向传播
print('y对x的梯度:',x.grad) # 打印y对x的梯度
运行结果如下:
y对x的梯度: tensor([6.], dtype=torch.float64)
也就是只需要对因变量y调用backward命令,pytorch就会把自变量x的梯度自动更新到x的grad属性中
在pytorch中,自动求导的流程如下:
1.先指定自变量为tensor变量,并且是带梯度的tensor变量,并且必须是小数类型,示例如下:
import torch
x = torch.tensor([3],dtype=(float),requires_grad=True) # 生成一个tensor数据x
2.计算因变量,因变量可以给出,也可以间接给出,示例如下:
y = x@x # 根据x计算y
z = 3*y # 根据y计算z
3.对因变量调用backward(此时就会更新自变量的grad属性),示例如下:
z.backward() # 将y反向传播
4.查看自变量的梯度,示例如下:
print('z对x的梯度:',x.grad)
整体所有代码如下:
import torch
x = torch.tensor([3],dtype=(float),requires_grad=True) # 生成一个tensor数据x
y = x@x # 根据x计算y
z = 3*y # 根据y计算z
z.backward() # 将z反向传播
print('z对x的梯度:',x.grad)
运行结果如下:
z对x的梯度: tensor([18.], dtype=torch.float64)
好了,以上就是pytorch的自动计算梯度的功能了~
End