
q:为什么需要反向传播?
【DL】神经网络学习机制,prediction,loss,gradient
模型可以知道Loss是多少,都是它不知道w应该增加还是减少,增加多少或者减少多少,所以需要:
Loss
↓
找到每个参数影响多少
↓
调整参数
这个过程叫做反向传播Backpropagation。
Forward
x
↓
w1
↓
h
↓
w2
↓
ŷ
↓
Loss
Backward
Loss
↓
∂L/∂ŷ
↓
∂L/∂h
↓
∂L/∂w1
p:核心思想,链式法则
链式法则如果你学习过导数,你应该听说过,我们想知道w2对 Loss 影响多少?,也就是∂L/∂w。

w1呢?

eg:
体重
↓
BMI
↓
健康评分
如果想要知道体重变化对健康评分的变化,我们通过BMI进行查看,体重 → BMI → 健康评分。
链式法则:最终影响=中间影响 × 前面影响
数学:
∂L/∂w2
=
∂L/∂ŷ
×
∂ŷ/∂w2
o.神经网络训练流程
Forward 神经网络前向传播只是计算当前参数下的预测值。
输入
↓
参数
↓
预测
↓
Loss
Backward
Loss
↓
梯度
↓
更新参数
重复很多次
do.使用python模拟反向传播
python
#reality
x = 2
y = 20
#参数
w1 = 5
w2 = 3
# forwardh = w1 * x
y_hat = w2 * h
loss = (y_hat - y) ** 2
# backward
dL_dyhat = 2 * (y_hat - y)
dYhat_dw2 = h
dYhat_dh = w2
dh_dw1 = x
dL_dw2 = dL_dyhat * dYhat_dw2
dL_dw1 = dL_dyhat * dYhat_dh * dh_dw1
print(dL_dw1)
print(dL_dw2)
这种简单的你可以手写,但是情况一旦复杂,不可能人工计算,所以我们以后使用pytorch
use:PyTorch 的解决方案
建立计算图(Computational Graph)
python
y = w*x
pytorch内部记录
*
/ \
w x
w参与了乘法
x参与了乘法
python
#计算loss
loss.backward()
'''
PyTorch 自动沿着图反向计算:
Loss
↓
乘法节点
↓
w梯度
'''
PyTorch 自动求梯度
python
import torch
x = torch.tensor(2.0)
w = torch.tensor(3.0, requires_grad=True)
y = w*x
loss = y**2
loss.backward()
print(w.grad)
神经网络训练真实流程(神经网络训练循环)
数据
|
v
Forward
|
v
Prediction
|
v
Loss
|
v
backward()
|
v
Gradient
|
v
Update 参数
|
v
新模型
实现一个小神经网络
import torch
#x → w1 → h → w2 → y
x = torch.tensor(2.0)
y = torch.tensor(20.0)
w1 = torch.tensor(
5.0,
requires_grad=True
)
w2 = torch.tensor(
3.0,
requires_grad=True
)
# forward
h = w1*x
y_hat = w2*h
loss = (y_hat-y)**2
print(loss)
# backward
loss.backward()
print(w1.grad)
print(w2.grad)
讲到这里你应该有一个新的认知
神经网络
=
大量简单计算节点组成的计算图
+
自动链式求导
+
参数更新