背景:
对于复杂的模型如上图, 求出每一个函数,计算每一个权重工作量十分庞大,几乎是不可能完成的任务,这时候就要使用反向传播波算法。
基本过程:
①前汇运算:
从左向右运算,得到损失值Loss
②反向传播:
从得到的Loss反向推出x与w的梯度
注意:
为了提高模型的复杂度,不进行化简,所以增加一个非线性函数
增加前:权值被化简
增加后:不再可被化简
代码实现过程:
import torch
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
w = torch.tensor([1.0])
w.requires_grad = True
def forward (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())
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_()
print("progress",epoch,l.item)
print ("predict before training",4,forward(4).item())