文章目录
numpy和pytorch实现梯度下降法
梯度下降算法即每次沿着反梯度方向更新,需设置的超参数为:初始值,学习率,迭代次数。
numpy实现梯度下降
## 设置超参数
x = 0 # 初始值
lr = 0.1 # 学习率
epochs = 10 # 迭代次数
## 定义函数y
y = lambda x: x**2+2*x+1
## 梯度下降算法求解
for epoch in range(epochs):
dx = 2*x+2 # d(y)/d(x)
x -= lr * dx #梯度下降法
print(x)
pytorch实现梯度下降
from torch.autograd import Variable
# 定义一个pytorch类型 且可自动求导的的初始值
x = torch.Tensor([1])# 定义一个tensor,相当于np.array
x = Variable(x,requires_grad=True) # x转变为一个variable,建立计算图的起点;开启requires_grad表示自动计算梯度
print('grad',x.grad,'data',x.data) # grad表示x的梯度属性,表明当前累计的梯度;data表示tensor值
刚初始化的变量还没有梯度值
lr = 0.1
epochs = 10
for epoch in range(epochs):
# 设置计算图:建立一个函数y,以x为变量
y = x**2+2*x+1
# Variable 能自动求导==》requires_grad
y.backward() # 对y做反向传导==》自动计算梯度,由于当前变量为1个,所以不需要指定
print('grad of epoch'+str(epoch)+':',x.grad.data)
x.data -= lr * x.grad.data
# 在 pytorch 中梯度会累积,则每次需要清0
x.grad.data.zero_() #xx_表示对变量做inplace操作;此处将当前梯度清0
print(x.data)
小结
无论是用numpy还是pytorch实现梯度下降算法,都必须有三个步骤:
- 设定初始值
- 求取梯度
- 在梯度方向上进行参数的更新