当前位置: 首页 > news >正文

深度学习(鱼书)day07--误差反向传播(前四节)

深度学习(鱼书)day07–误差反向传播(前四节)

数值微分虽然简单,也容易实现,但缺点是计算上比较费时间。本章学习一个能够高效计算权重参数的梯度的方法——误差反向传播法

在这里插入图片描述

一、计算图

计算图将计算过程用图形表示出来。这里说的图形是数据结构图,通过多个节点和边表示(连接节点的直线称为“边”)。

  1. 用计算图求解

    问题1:太郎在超市买了2个100日元一个的苹果,消费税是10%,请计算支付金额。
    在这里插入图片描述

    可以将“2”和“1.1”分别作为变量“苹果的个数”和“消费税”标在○外面。

在这里插入图片描述

问题2:太郎在超市买了2个苹果、3个橘子。其中,苹果每个100日元,橘子每个150日元。消费税是10%,请计算支付金额。
在这里插入图片描述

用计算图解题的情况下,需要按如下流程进行。

1.构建计算图。

2.在计算图上,从左向右进行计算

  • “从左向右进行计算”是一种正方向上的传播,简称为正向传播(forward propagation)。正向传播是从计算图出发点到结束点的传播。既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左)的传播。实际上,这种传播称为反向传播(backward propagation)。反向传播将在接下来的导数计算中发挥重要作用。
  1. 局部计算

    计算图的特征是可以通过传递“局部计算”获得最终结果。“局部”这个词的意思是“与自己相关的某个小范围”。局部计算是指,无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果

    比如,在超市买了2个苹果和其他很多东西。

在这里插入图片描述

这里的重点是,各个节点处的计算都是局部计算。这意味着,例如苹果和其他很多东西的求和运算(4000 + 200 4200)并不关心4000这个数字是如何计算而来的,只要把两个数字相加就可以了。换言之, 各个节点处只需进行与自己有关的计算(在这个例子中是对输入的两个数字进行加法运算),不用考虑全局。

  1. 为何用计算图解题

    使用计算图最大的原因是,可以通过反向传播高效计算导数

    假设我们想知道苹果价格的上涨会在多大程度上影响最终的支付金额,即求“支付金额关于苹果的价格的导数”。设苹果的价格为x,支付金额为L,则相当于求在这里插入图片描述
    这个导数的值表示当苹果的价格稍微上涨时,支付金额会增加多少。

在这里插入图片描述

反向传播从右向左传递导数的值(1 1.1 2.2)。“支付金额关于苹果的价格的导数”的值是2.2,如果苹果的价格上涨1日元,最终的支付金额会增加2.2日元(严格地讲,如果苹果的价格增加某个微小值,则最终的支付金额将增加那个微小值的2.2倍)。

二、链式法则

传递这个局部导数的原理,是基于 链式法则(chain rule) 的。

  1. 计算图的反向传播

    假设存在y = f(x)的计算,这个计算的反向传播如图所示。反向传播的计算顺序是,将信号E乘以节点的局部导数在这里插入图片描述
    ,然后将结果传递给下一个节点。

在这里插入图片描述

  1. 什么是链式法则

    我们需要先从复合函数说起。复合函数是由多个函数构成的函数。比如,z = (x + y) 2 是由式(5.1)所示的两个式子构成的。
    z=t2t=x+y z=t^2\\ t=x+y z=t2t=x+y
    如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示。
    在这里插入图片描述

  2. 链式法则和计算图

    如果用“**2”节点表示平方运算的话,则计算图如图所示。

在这里插入图片描述

三、反向传播

  1. 加法节点的反向传播
    在这里插入图片描述

    本例中把从上游传过来的导数的值设为在这里插入图片描述
    。这是因为,如图所示,我们假定了一个最终输出值为L的大型计算图。

在这里插入图片描述

在这里插入图片描述

  1. 乘法节点的反向传播

    我们考虑z = xy

在这里插入图片描述

乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值”后传递给下游

在这里插入图片描述

实现乘法节点的反向传播时,要保存正向传播的输入信号

  1. 苹果的例子

    这里要解的问题是苹果的价格、苹果的个数、消费税这3个变量各自如何影响最终支付的金额。这个问题相当于求“支付金额关于苹果的价格的导数”“支付金额关于苹果的个数的导数”“支付金额关于消费税的导数”。用计算图的反向传播来解的话,求解过程如图所示。

    在这里插入图片描述

    练习:求解“购买苹果和橘子”的反向传播。

在这里插入图片描述

四、简单层的实现

我们用Python实现前面的购买苹果的例子。这里,把要实现的计算图的乘法节点称为 “乘法层”(MulLayer),加法节点称为 “加法层”(AddLayer)

  • 乘法层的实现

    层的实现中有两个共通的方法(接口)forward()和backward()。forward()对应正向传播,backward()对应反向传播。

    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
    

    forward()接收x和y两个参数,将它们相乘后输出。backward()将从上游传来的导数(dout)乘以正向传播的翻转值,然后传给下游。

在这里插入图片描述

     from layerNaive import *mul_apple_layer = MulLayer()mul_tax_layer = MulLayer()apple = 100apple_num = 2tax = 1.1# forwardapple_price = mul_apple_layer.forward(apple, apple_num)price = mul_tax_layer.forward(apple_price, tax)# backwarddprice = 1dapple_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)

在这里插入图片描述

  • 加法层的实现

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

    我们使用加法层和乘法层,实现图所示的购买2个苹果和3个橘子的例子。
    在这里插入图片描述

from layerNaive import *
apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1# layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
mul_tax_layer = MulLayer()
add_apple_orange_layer = AddLayer()
# forward
apple_price = mul_apple_layer.forward(apple, apple_num)
orange_price = mul_orange_layer.forward(orange, orange_num)
all_price = add_apple_orange_layer.forward(apple_price, orange_price)
price = mul_tax_layer.forward(all_price, tax)# backward
dprice = 1
dall_price, dtax = mul_tax_layer.backward(dprice)
dapple_price, dorange_price = add_apple_orange_layer.backward(dall_price)
dorange, dorange_num = mul_orange_layer.backward(dorange_price)
dapple, dapple_num = mul_apple_layer.backward(dapple_price)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)

在这里插入图片描述

http://www.lryc.cn/news/606026.html

相关文章:

  • 项目推进难的原因有哪些?问题及应对
  • TOML介绍
  • 14day-ai入门-人工智能基础学习-OpenCV-图像预处理4
  • 我在 Arch Linux Plasma 6 Wayland 下驯服 Chromium 输入法的完整记录
  • ACOSRAR改进连续蚁群算法用于优化复杂环境下无人机路径规划,Matlab代码实现
  • 智慧工地系统:建筑工程管理的智能化革新与实践
  • 淘宝 API HTTP/2 多路复用与连接优化实践:提升商品数据采集吞吐量
  • Vue3 + Electron 技术栈下 MAC 地址获取的方法、准确性优化与应对策略
  • Electron 作品【AI聊天】桌面应用 —— 系列教程(含开源地址)
  • 发票闪印 v3.9.17 免费电子PDF发票批量打印工具绿色版
  • 【未解决】STM32无刷电机驱动电路问题记录
  • Apache Camel 简介
  • 【Lua】题目小练6
  • JavaScript函数性能优化秘籍:基于V8引擎优化
  • 【STM32】HAL库中的实现(二):串口(USART)/看门狗(IWDG/WWDG)/定时器(TIM)
  • JavaScript 框架语法特性对比-中文版
  • 39.MySQL索引
  • 用el-table实现的可编辑的动态表格组件
  • 树形DP-核心基础
  • DVD特工总部,DVD管理系统
  • 如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安装 DaVinci Resolve
  • 【01】大恒相机SDK C++开发 —— 初始化相机,采集第一帧图像、回调采集、关闭相机
  • FastAPI的请求-响应周期为何需要后台任务分离?
  • Spire.XLS for .NET 中, 将 Excel 转换为 PDF 时, 如何设置纸张大小为A4纸,并将excel内容分页放置?
  • VBA代码解决方案第二十七讲:禁用EXCEL工作簿右上角的关闭按钮
  • 微信小程序性能优化与内存管理
  • 辐射源定位方法简述
  • 【25-cv-08807】David携Tyrone Acierto 雕塑版权发案
  • ros2--参数指令--rqt
  • sqli-labs:Less-16关卡详细解析