PyTorch 深度学习实践——反向传播
学习笔记|B 站 UP 主 刘二大人 《PyTorch深度学习实践》视频知识点总结
最后附上视频中的python代码。
传送门 PyTorch深度学习实践——反向传播
1. 什么是反向传播?
反向传播(Backpropagation) 是深度学习模型训练的 核心算法,本质是沿着损失函数的计算路径反向推导,高效求解各层参数的梯度,为后续参数更新(如梯度下降)提供依据。
在多层神经网络中,前向传播是 “输入数据→逐层计算→输出预测值” 的过程,而 反向传播 则是 “损失值→反向回溯→计算各参数梯度” 的 逆过程,核心目标是解决 “深层网络参数梯度难以手动计算” 的问题,让复杂模型的训练成为可能。
核心逻辑:
- 链式法则:反向传播的 数学基础,利用复合函数求导的链式法则,将损失函数对深层参数的梯度分解为对浅层参数的梯度乘积,逐层传递;
- 梯度累加:从输出层开始计算损失对该层参数的梯度,再将梯度传递到前一层,依次回溯至输入层,最终得到所有参数的梯度;
- 高效性:相比手动计算各参数梯度,反向传播将梯度计算复杂度从 指数级 降至 线性级,大幅提升深层模型的训练效率。
反向传播就像从迷宫出口反向寻找来时的路,每一步都记录 “如何调整方向(参数)才能更快走出迷宫(减小损失)”,最终让所有路口(参数)都明确最优调整方向。
2. 反向传播的核心目标
反向传播的核心目标是 高效、准确地计算模型中所有可学习参数(如权重 w、偏置 b)的 梯度,为 参数更新 提供关键依据。只有通过反向传播得到各参数的梯度,才能利用梯度下降等优化算法调整参数,让损失函数持续减小,最终得到最优模型。
以线性模型(y=wx+b)的均方误差损失( L o s s = 1 n ∑ ( y p r e d − y t r u e ) 2 Loss=\frac{1}{n}\sum(y_{pred}-y_{true})^2 Loss=n1∑(ypred−ytrue)2)为例:
- 前向传播:计算 y p r e d = w x + b y_{pred} = wx + b ypred=wx+b,再得到 Loss;
- 反向传播:先计算 Loss 对
y
p
r
e
d
y_{pred}
ypred 的梯度,再通过 链式法则 推导得到 Loss 对 w 和 b 的梯度:
∂ L o s s ∂ w = 2 n ∑ i = 1 n ( w x i + b − y t r u e ) ∗ x i \frac{\partial Loss}{\partial w} = \frac{2}{n}\sum_{i=1}^n (wx_i + b - y_{true}) * x_i ∂w∂Loss=n2i=1∑n(wxi+b−ytrue)∗xi
∂ L o s s ∂ b = 2 n ∑ i = 1 n ( w x i + b − y t r u e ) \frac{\partial Loss}{\partial b} = \frac{2}{n}\sum_{i=1}^n (wx_i + b - y_{true}) ∂b∂Loss=n2i=1∑n(wxi+b−ytrue) - 参数更新:利用反向传播得到的 梯度,通过 梯度下降 更新 w 和 b,完成一次训练迭代。
3. 源代码
1. Tensor 核心属性与梯度计算
w 是 Tensor(张量类型),Tensor 中包含 data 和 grad 两个核心属性:data 和 grad 本身也都是 Tensor。
grad 初始为 None,调用 l.backward() 方法后 w.grad 变为 Tensor 类型,因此更新 w.data 时必须使用 w.grad.data(避免操作梯度张量构建额外计算图)。
若 w 被标记为需要计算梯度(requires_grad=True),则构建的计算图中,所有跟 w 相关的 tensor 都会默认开启梯度计算。
补充:刘老师视频中写法 a = torch.Tensor([1.0]),本文中更改为 a = torch.tensor([1.0]),两种方法均可实现张量创建,无本质差异。
import torch
a = torch.tensor([1.0])
a.requires_grad = True # 或者 a.requires_grad_()
print(a)
print(a.data)
print(a.type()) # a的类型是tensor
print(a.data.type()) # a.data的类型是tensor
print(a.grad)
print(type(a.grad))
2. 数据类型一致性
w 是 Tensor,forward 函数的返回值是 Tensor,loss 函数的返回值同样是 Tensor → 前向传播到损失计算的全流程,数据均以 Tensor 类型流转,为自动求导提供基础。
3. 反向传播的核心操作
本算法中反向传播的核心体现是调用 l.backward():
调用该方法后,w.grad 由 None 更新为 Tensor 类型,且 w.grad.data 的值会直接用于后续 w.data 的更新(参数优化的核心依据)。
4. l.backward() 的执行逻辑
l.backward() 会遍历计算图,把所有需要梯度(grad)的节点的梯度全部求解出来,并将梯度值存储到对应的待优化参数(如 w)的 grad 属性中;执行完成后,计算图会被自动释放(节省内存)。
5. data 属性的关键特性
直接取 tensor 中的 data(如 w.data)不会构建计算图,这也是参数更新时必须操作 w.data 而非直接操作 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的初值为1.0
w.requires_grad = True # 需要计算梯度
def forward(x):
return x*w # w是一个Tensor
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是一个张量,tensor主要是在建立计算图 forward, compute the loss
l.backward() # backward,compute grad for Tensor whose requires_grad set to True
print('\tgrad:', x, y, w.grad.item())
w.data = w.data - 0.01 * w.grad.data # 权重更新时,注意grad也是一个tensor
w.grad.data.zero_() # after update, remember set the grad to zero
print('progress:', epoch, l.item()) # 取出loss使用l.item,不要直接使用l(l是tensor会构建计算图)
print("predict (after training)", 4, forward(4).item())
更多推荐
所有评论(0)