03-反向传播
回顾
线性模型:$\hat y=x*w$,其中$w$为权重,$x$为输入数据。

随机梯度下降:
其中,
对于复杂模型,考虑如何计算梯度?

计算图
一个两层的神经网络:

其中,$W_1$与$X$通过矩阵乘法得到隐藏层$H^{(1)}$。

$H^{(1)}$和$b_1$通过加法运算得到新的一个$X$。

神经网络的第一层,就这样计算完毕了,神经网络的第二层和运行过程和第一层一样。

关于两层神经网络的问题
将各个层的计算过程进行统一,可以得到如下模型:

如上可知,无论神经网络有多少层,都是线性的,实际只是做了一层计算。
于是为了解决这个问题,加一个非线性的激活函数,比如$sigmoid$函数,在每个线性模型后得到的线性数据,进行非线性变换。

函数的复合和链式法则
矩阵书籍:地址

创建计算图$(Forward)$

局部梯度

给定连续节点的梯度

用链式法则计算梯度


Example:$f=x\cdot w,x=2,w=3$
forward

backward



线性模型的计算图

其中,残差项$r=\hat y-y$
Tensor in Pytorch

在PyTorch
中,张量是构造动态计算图的重要组成部分。它包含data
和grad
,分别存储节点的值和梯度的损失。
用pytorch实现线性模型
如果需要自动梯度机制,则张量的元素变量requires_grad
必须设置为true
。
import torch
import numpy as np
# 数据样本
x_data = np.array([
[1.0,2.0,3.0]
])
y_data = np.array([
2.0,4.0,6.0
])
# 权重
w = torch.Tensor([1.0])
w.requires_grad = True
def loss(x,y,w):
y_pred = forward(x,w)
return (y-y_pred)**2
def forward(x,w):
return x*w
定义线性模型
实现代码
print("predict(before traning)",4,forward(4,w).item())
for epoch in range(100):
for x,y in zip(x_data,y_data):
l = loss(x,y,w)
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 (after training)",4,forward(4,w).item())
前向传播

反向传播

最后更新于
这有帮助吗?