本课程内容是学习 刘二大人的《PyTorch深度学习实践》的04反向传播。
上节内容:
我们讲了优化问题,梯度下降算法核心公式以及鞍点问题的解决方法——随机梯度下降。
本节内容:
目录
1. 一个简单的两层神经网络
下图是一个简单的两层神经网络。X 是输入,W 是权重,b1是偏置。(MM 代表相乘,ADD 代表相加)
它的网络模型:
但是呢,我们可以发现:不管有多少层,最终都可以化成简单的一层。
但是这样一直是线性的,所以我们要引入一个 (Nonlinear Function)。
(关于非线性函数后续会讲到)
2. 链式求导
求导这个知识点,高数里面就有,大家应该都懂得。(这种链式法则,大家都懂吧)
创建计算图。
这里,我们做了前馈运算(Forward),也就是按着输入箭头方向。另外,其实就是做了这个Z关于X输入和w权重的导数。
这个Loss,再做对Z的偏导,这是往回算。
这里有个具体的例子:(注意,这个 这时假设)
3. 过程
绿色部分是前向传播;橙色部分是反向传播。
4.Tensor
Tensor 是 pytorch 里面最基本的数据类型,它可以存标量、向量、矩阵。
它包含着两部分,一个是数值,一个是梯度导数。这样就可以构建计算图。
5.代码
构建计算图所需的代码工作:
# 准备数据集并保存
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.data.item())
w.data = w.data - 0.01 * w.grad.data
w.grad.data.zero_()
print('Epoch:', epoch, l.item())
print('Predict (after training)', 4, forward(4).item())
结果:
下节内容是刘二大人的《PyTorch深度学习实践》的 05 用PyTorch实现线性回归。