神经网络-反向传播

Back propagation(算偏导):

f ( x , y , z ) = ( x + y ) z f(x,y,z)=(x+y)z f(x,y,z)=(x+y)z
e.g. : x = − 2 , y = 5 , z = − 4 ; x = -2, y = 5, z = -4; x=2,y=5,z=4;


q = x + y , ∂ q ∂ x = 1 , ∂ q ∂ y = 1 q = x+y,\frac{\partial q}{\partial x} = 1,\frac{\partial q}{\partial y} = 1 q=x+y,xq=1,yq=1

f = q z , ∂ f ∂ q = z , ∂ f ∂ z = q f = qz,\frac{\partial f}{\partial q} = z,\frac{\partial f}{\partial z} = q f=qz,qf=z,zf=q

Want : ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z \frac{\partial f}{\partial x},\frac{\partial f}{\partial y},\frac{\partial f}{\partial z} xf,yf,zf


对于反向传播都是从尾部依次往前求偏导,因此对于每一部分上的偏导可以用链式求导得到。


∂ f ∂ f \frac{\partial f}{\partial f} ff
在这里插入图片描述


∂ f ∂ q \frac{\partial f}{\partial q} qf
在这里插入图片描述


∂ f ∂ z \frac{\partial f}{\partial z} zf
在这里插入图片描述


∂ f ∂ x \frac{\partial f}{\partial x} xf

在这里插入图片描述


∂ f ∂ y \frac{\partial f}{\partial y} yf

在这里插入图片描述

计算图

在这里插入图片描述

伪代码

class ComputationGraph(object):
    # 前向传播,得到计算图中的每个节点值
    def forward(self, inputs):
        # 1. [输入数据到节点中]
        # 2. [把整个计算图中每个节点的值通过前向传播计算出来]
        for gate in self.graph.nodes_topologically_sorted():
            gate.forward()
        return loss # 最终输出损失值
    # 反向传播,得到最终变量在每个方向上的梯度值
    def backward(self):
        for gate in reseverse(self.graph.nodes_topologically_sorted()):
            gate.backward()
        return inputs_gradients # 最终输出损失值

例如:
在这里插入图片描述

class MultiplyGate(object):
    def forward(self, x, y):
        z = x * y
        # 用以更新当前计算图中每个节点值
        self.x = x
        self.y = y
        return z

    def backward(self, dz):
        dx = dz * self.y  # [dL/dz * dz/dx]
        dy = dz * self.x  # [dL/dz * dz/dy]
        return [dx, dy]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值