4-反向传播
从这张图片,可以看出。不管我们有多少层,都可以化简成最简形式。我们添加的层就没有意义。
所以我们要对每一层的输出做非线性变换,增加模型的复杂程度,使它没法化简
反向传播的流程
pytorch的tensor数据结构
看到代码,要能把计算图构建出来,而不是简单的乘除运算
在上面这张图,w是tensor数据结构,x与w相乘前会自动转化为tensor数据结构。同时由于w需要计算梯度,所以y也需要计算梯度
每进行一次反向传播后,计算图就会释放(每次计算的计算图可能不会一样),下次计算再重新构建计算图
点击查看代码
import numpy as np
import matplotlib.pyplot as plt
import torch
w = torch.tensor([1.0])
w.requires_grad = True # 需要进行梯度更新
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
def forward(x):
return w * x # x会自己转化成tensor类型
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) ** 2
for epoch in range(100):
for x, y in zip(x_data, y_data):
l = loss(x, y)
l.backward() # 反向传播,把梯度grad和值data存储到w这个tensor变量中
w.data = w.data - 0.01 * w.grad.data # 注意是对w.data进行更新,而不是w
w.grad.data.zero_() # 梯度清零
print('epoch:', epoch, l.item(), w.data)
print(forward(4).item())