03_Back_Propagation(反向传播)

Back_Propagation反向传播

  1. 在说反向传播前先说一下前向传播
    如下图节点中,MM为乘,ADD为加;结合公式可以明显的看出第一层的结果整体做为第二层的输入,然后在第二层中继续计算,如果还有第三层,第四层…以此类推。这个就是前向传播。
    在这里插入图片描述
  2. 反向传播
    如下图,蓝色的箭头是正向传播,红色的箭头是反向传播。
    在这里插入图片描述
    结合封装好的f函数,我们可以反向计算出 ∂ z ∂ x \frac{\partial z}{\partial x} xz,以及 ∂ z ∂ w \frac{\partial z}{\partial w} wz,
    下图展示了,f函数封装的过程。
    在这里插入图片描述
    如下图,如果我们知道了x=2,w=3, ∂ z ∂ w \frac{\partial z}{\partial w} wz=x, ∂ z ∂ x \frac{\partial z}{\partial x} xz=w, ∂ L ∂ z \frac{\partial L}{\partial z} zL=5,
    那么可以反向计算出 ∂ L ∂ x \frac{\partial L}{\partial x} xL ∂ L ∂ w \frac{\partial L}{\partial w} wL,知道了 ∂ L ∂ w \frac{\partial L}{\partial w} wL那么我们就可以来更新梯度了。

在这里插入图片描述
代码如下:


import torch

x_data=[1.0,2.0,3.0]
y_data=[2.0,4.0,6.0]

w=torch.Tensor([1.0])  #用张量定义w

w.requires_grad=True  #是否开启求梯度

def forward(x):  
    return x*w

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()   #方向传播
        print('\t grad:',x,y,w.grad.item())
        w.data = w.data-0.01*w.grad.data  #用反向传播生成的w更新w
        w.grad.data.zero_() #初始化w的梯度,如果不初始化的话,求的梯度会一直累加


    print("progress:",epoch,l.item())
print("predict (after training)",4,forward(4).item())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值