所谓反向传播,我的理解就是求参数的梯度
这里用pytorch实现了反向传播的过程,用的是SGD随机梯度算法
代码展示:
import torch
x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]
#初始化w
w=torch.Tensor([1.0])
#表明w 需要计算梯度,需要特意说明
w.requires_grad=True
def forward(x):
#计算的是一个数乘,x会进行自动的类型转换
return x*w;
#构建损失函数,构建了一个计算图
def loss(x,y):
y_pred=forward(x)
return (y_pred-y)**2
print("predict(before training )",4,forward(4).item())
#开始训练,采用随机梯度下降的算法,每一次,都将x,y进行zip成为一个元组样本
for epoch in range(100):
for x,y in zip(x_data,y_data):
#前馈过程,构建出一个计算图,forward
l=loss(x,y)
#自动求出计算图中所有需要梯度的地方,backward
l.backward()
print('\tgrad:',x,y,w.grad.item())
# grad是一个tensor,所以一定要取到他的data数据,否则就是进行计算图运算,w也是同理
w.data=w.data-0.01*w.grad.data
#将权重里面梯度的数据全部清零
w.grad.data.zero_()
print("progress:",epoch,l.item())
print("predict (after training)",4 ,forward(4).item())
"""
.data
将Variable变成tensor形式的数据,但是不放入梯度图中,即不计算梯度。
.item()
将tensor类型数据转变成float型
"""
结果展示:
在这里唠两句,因为还在学运筹学,感觉两者的优化基本原理好像哦。
pytorch中用到的都是张量,tensors 类似于 NumPy 的 ndarrays ,同时 Tensors 可以使用 GPU 进行计算,运算速度会更快一些哦,希望大家都成功安装下来pytorch,我之前跟着别人的教程复刻了一个gpt-chinese很有意思,大家有兴趣也可以试一试。
今天也要加油!!!!!!!!!冲!!!!!!!!