误差反向传播(Back-propagation, BP)算法的出现是神经网络发展的重大突破,也是现在众多深度学习训练方法的基础。该方法会计算神经网络中损失函数对各参数的梯度,配合优化方法更新参数,降低损失函数。
BP本来只指损失函数对参数的梯度通过网络反向流动的过程,但现在也常被理解成神经网络整个的训练方法,由误差传播、参数更新两个环节循环迭代组成。
源程序
import torch
# 假设w的初始值为1.0,并通过设置 requires_grad标识为Ture来
# 告诉Pytorch需要对该张量进行自动求导,PyTorch会记录该张量的每一步操作历史并自动计算
w = torch.tensor([1.0], requires_grad=True)
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
# 定义损失函数、
def forward(x): # y^ = wx
return x * w # w是tensor 所以 这个乘法自动转换为tensor数乘 , x被转化成tensor 这里构建了一个计算图
def loss(x, y): # 计算单个的误差 : 损失
'''
每调用一次loss函数,计算图自动构建一次
:param x:
:param y:
:return:
'''
y_pred = forward(x)
return (y_pred - y) ** 2
eli = []
lli = []
print('predict(before training)', 4, forward(4).item())
for epoch in range(100):
for x, y in zip(x_data, y_data):
l = loss(x, y)
l.backward() # 自动求梯度
print('\tgrad:', x, y, w.grad.item())
w.data = w.data - 0.01 * w.grad.data
# 清空权重,不然梯度会累加
w.grad.data.zero_()
eli.append(epoch)
lli.append(l.item())
print('progress:', epoch, l.item())
print('predict(after training)', 4, forward(4).item())
在pytorch使用Autograd模块实现深度学习的反向传播求导,tensor类本身就支持了使用autograd功能,因此需要使用该功能时,可以将.requires_grad=True。通过grad属性保持对应的数据;因此,可以通过xxx.grad查看对应的梯度值。
PyTorch会自动追踪和记录对与张量的所有操作,当计算完成后调用.backward()方法自动计算梯度并且将计算结果保存到grad属性中
最终迭代结果