使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播

  • 一、what is 反向传播
  • 二、乘法节点的反向传播
  • 三、加法节点的反向传播
  • 四、加法层和乘法层混合应用

一、what is 反向传播

误差反向传播法是一种高效计算权重参数的梯度的方法。所谓的反向传播,从图上看的话,就是从右向左的传播。

举个例子,如图所示,jym买了两个100元一个的苹果,消费税是10%,最终输出支付金额,这个图就表示了一个计算的流程。正向看都能理解,就是100和2相乘得到200,作为下一个节点的入,然后200和1.1相乘得到220的支付金额。

那么,如果jym想要知道苹果价格上涨会多大程度影响最终的支付金额,就需要求支付金额关于苹果价格的偏导数。设苹果价格为x,支付金额为L,支付金额关于苹果价格的偏导数为d,d的值表示,x上涨a时支付金额会增加d*a。

图中,反向传播用与正向相反的箭头表示。它传递的数是局部导数。而且,通过图片可以了解到,苹果价格如果增加1元,那么最终支付金额将增加2.2元。

传递这个局部导数的原理是链式法则。表示链式法则的数学公式如下:

反向传播计算流程:

将节点的输入信号乘以节点输出关于输入的偏导数,然后再传到下一个节点,这里面传递的方向是和正向相反的。

把上面链式法则数学公式表示到图像上:

x是苹果j的价格,z是最终的支付金额,z对x求偏导就根据那个链式法则的流程逐步求出了。

这就很好,因为偏导数是按照流程规则求出来的,这样就可以用程序编程了。

二、乘法节点的反向传播

z=xy,z对x求偏导等于y,z对y求偏导等于x,那么,乘法的反向传播会将上游的值乘以正向传播时的输入信号的翻转值之后传给下游,和加法的区别就是,需要正向传播的输入信号值,编程时需要保存正向传播的输入信号。乘法节点的反向传播计算图如下图所示。

python实现乘法层的代码:

init函数初始化实例变量x、y,保存正向传播时的输入值。

forward接收x、y两个参数,将他们相乘后输出。

backward将上游传过来的导数dout乘正向传播的翻转值,然后传给下游

class MulLayer:def __init__(self):self.x = Noneself.y = Nonedef forward(self, x, y):self.x = xself.y = y                out = x * yreturn outdef backward(self, dout):dx = dout * self.ydy = dout * self.xreturn dx, dy

下面这个代码举了个例子,用代码复现了这张图片。

from layer_naive import *apple = 100
apple_num = 2
tax = 1.1mul_apple_layer = MulLayer()
mul_tax_layer = MulLayer()# forward
apple_price = mul_apple_layer.forward(apple, apple_num)
price = mul_tax_layer.forward(apple_price, tax)# backward
dprice = 1
dapple_price, dtax = mul_tax_layer.backward(dprice)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)print("price:", int(price))
print("dApple:", dapple)
print("dApple_num:", int(dapple_num))
print("dTax:", dtax)

输出:

price: 220
dApple: 2.2
dApple_num: 110
dTax: 200

三、加法节点的反向传播

z=x+y,z对x和对y求偏导都是1。也就是说,加法的反向传播只是将上游的值传给下游。加法节点的反向传播计算图如下图所示。

python实现加法层的代码:

forward接收x和y两个参数,将它们相加后输出。

backward将上游传来的导数原封不动传给下游。

class AddLayer:def __init__(self):passdef forward(self, x, y):out = x + yreturn outdef backward(self, dout):dx = dout * 1dy = dout * 1return dx, dy

四、加法层和乘法层混合应用

接下来用代码表述下面这张图。

from layer_naive import *apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1# layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()# forward
apple_price = mul_apple_layer.forward(apple, apple_num)  # (1)
orange_price = mul_orange_layer.forward(orange, orange_num)  # (2)
all_price = add_apple_orange_layer.forward(apple_price, orange_price)  # (3)
price = mul_tax_layer.forward(all_price, tax)  # (4)# backward
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice)  # (4)
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)  # (3)
dorange, dorange_num = mul_orange_layer.backward(dorange_price)  # (2)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)  # (1)print("price:", int(price))
print("dApple:", dapple)
print("dApple_num:", int(dapple_num))
print("dOrange:", dorange)
print("dOrange_num:", int(dorange_num))
print("dTax:", dtax)

输出:

price: 715
dApple: 2.2
dApple_num: 110
dOrange: 3.3000000000000003
dOrange_num: 165
dTax: 650

使用反向传播算法计算参数的梯度并用python实现加法和乘法节点的反向传播相关推荐

  1. [AI 笔记] BP反向传播算法

    [AI 笔记] BP反向传播算法 说明 BP算法 链式法则 计算图 简单例子 前向传播 反向传播 聚焦计算节点,深入理解 计算节点的代码实现 例子 各种门的功能 多元链式法则 向量化BP算法 参考资料 ...

  2. 反向传播算法推导、激活函数、梯度消失与爆炸

    目录 反向传播算法 定义 推导过程 激活函数 定义 性质 常用的激活函数 Sigmoid Tanh ReLU softmax 梯度消失与梯度爆炸 起因 出现的原因 表现 解决方案 参考文档 反向传播算 ...

  3. 快速计算梯度的魔法--反向传播算法

    一.实验介绍 1.1 实验内容 第一次实验最后我们说了,我们已经学习了深度学习中的模型model(神经网络).衡量模型性能的损失函数和使损失函数减小的学习算法learn(梯度下降算法),还了解了训练数 ...

  4. 神经网络之反向传播算法(均方根反向传播算法RMSProp)

    文章目录 均方根反向传播算法(RMSProp) 1.算法原理 2.算法实现 2.1 训练过程 2.2 测试过程及结果 3.参考源码及数据集 均方根反向传播算法(RMSProp) 自适应梯度算法(Ada ...

  5. 吴恩达机器学习:神经网络 | 反向传播算法

    上一周我们学习了 神经网络 | 多分类问题.我们分别使用 逻辑回归 和 神经网络 来解决多分类问题,并了解到在特征数非常多的情况下,神经网络是更为有效的方法.这周的课程会给出训练 神经网络 所使用的 ...

  6. 反向传播算法_反向传播算法:定义,概念,可视化

    定义 向前传播 通常,当我们使用神经网络时,我们输入某个向量x,然后网络产生一个输出y,这个输入向量通过每一层隐含层,直到输出层.这个方向的流动叫做正向传播. 在训练阶段,输入最后可以计算出一个代价标 ...

  7. 深度学习基础2(反向传播算法)

    反向传播算法 我们先是用链式法则解释.比如如下的神经网络 前向传播 对于节点来说,的净输入如下: 接着对做一个sigmoid函数得到节点的输出: 类似的,我们能得到节点..的输出... 误差 得到结果 ...

  8. 深度学习中反向传播算法简单推导笔记

    反向传播算法简单推导笔记 1.全连接神经网络 该结构的前向传播可以写成: z(1)=W(1)x+b(1)z^{(1)} = W^{(1)}x+b^{(1)}z(1)=W(1)x+b(1) a(1)=σ ...

  9. 前向传播算法和反向传播算法

      最近在看神经网络中的前向传播算法(FP)和反向传播算法(BP),特地进行总结一下,方便以后理解. 1.基本概念   上图是一张自己画的神经网络的图.假设每一层都添加了偏度单元(即值为1的神经元), ...

最新文章

  1. nodejs生成多层目录和生成文件的通用方法
  2. vue_axios详解
  3. 静态路由实验配置举例
  4. ABAP代码静态分析工具SQF - Support Query Framework
  5. php pdf 文字水印图片,php如何给pdf加上文字水印和图片水印[未测试]
  6. 【微信小程序】初识小程序
  7. 大数据之HBase部署
  8. 内衬纸缺陷在线检测系统
  9. plaintextedit指定一行一行的高亮显示_RDKit | 基于RDKit的指定原子或键高亮
  10. LYNC2013部署系列PART7:TMG部署
  11. 在64位系统中无法看到Microsoft Excel Application的问题
  12. 【nodejs】waitFor is deprecated
  13. Linux系统之账号和权限管理
  14. UML类图中实线虚线的指向关系
  15. SRAM and DRAM
  16. 统计学三大相关性系数:pearson,spearman,kendall
  17. 怎样清理苹果手机内存空间_手机资讯:苹果iPhone如何拒绝骚扰短信清理短信教程...
  18. nginx php 设置时区,laravel5.8(二十)解决时区设置差8个小时解决办法
  19. 设计模式之美读书笔记
  20. 线性规划在MATLAB中的表示,Matlab在线性规划中的应用

热门文章

  1. Android的引用jar包
  2. 计算机网络(第四章网络层)
  3. 算法复习第六章第七章
  4. SQL事务控制语言(TCL)
  5. C#利用反射将实体类ListT转化为Datatable
  6. django开发环境搭建
  7. 阿里云使用idea通过hdfs api来上传文件时出现could only be written to 0 of the 1 minReplication nodes.错误
  8. 启动盘Linux windows,Linux 中创建 USB 启动盘来拯救 Windows 用户
  9. linux修改services命令,Linux中service指令都有哪些参数
  10. java创建链表成绩管理系统_成绩管理系统 链表版