反向传播求变量导数

news2024/11/18 18:25:30

反向传播求变量导数

  • 1. 相关习题
  • 2. 推导流程
    • 2.1 相关公式
    • 2.3 变量导数求解
  • 3. 代码实现
    • 3.1 参数对应
    • 3.2 代码实现

  • 以前只知道反向传播通过链式法则实现
  • 今天看书发现图片上求出来的值自己算不出来
  • 所以自己算了一下,记录一下,并运行了书中的代码
  • 相关书籍:[图灵程序设计丛书].深度学习入门:基于Python的理论与实现

1. 相关习题

在这里插入图片描述

2. 推导流程

2.1 相关公式

f = a ∗ b g = c ∗ d h = f + g = a ∗ b + c ∗ d i = h ∗ e = ( f + g ) ∗ e = ( a ∗ b + c ∗ d ) ∗ e \begin{aligned} f&= a*b\\ g&=c*d\\ h&=f+g\\ &=a*b+c*d\\ i&=h*e\\ &=(f+g)*e\\ &=(a*b+c*d)*e \end{aligned} fghi=ab=cd=f+g=ab+cd=he=(f+g)e=(ab+cde

2.3 变量导数求解

  • i

    • 最后一层的导数,初始化为1
  • e
    ∂ i ∂ e = ∂ i ∂ i ∗ ∂ i ∂ e = ∂ i ∂ i ∗ ∂ h ∗ e ∂ e = 1 ∗ h = a ∗ b + c ∗ d = 2 ∗ 100 + 150 ∗ 3 = 650 \begin{aligned} \frac{\partial i}{\partial e}&= \frac{\partial i}{\partial i}*\frac{\partial i}{\partial e}\\ &=\frac{\partial i}{\partial i}*\frac{\partial h*e}{\partial e}\\ &=1*h\\ &=a*b+c*d\\ &=2*100+150*3\\ &=650 \end{aligned} ei=iiei=iiehe=1h=ab+cd=2100+1503=650

  • h
    ∂ i ∂ h = ∂ i ∂ i ∗ ∂ i ∂ h = ∂ i ∂ i ∗ ∂ h ∗ e ∂ h = 1 ∗ e = 1.1 \begin{aligned} \frac{\partial i}{\partial h}&= \frac{\partial i}{\partial i}*\frac{\partial i}{\partial h}\\ &=\frac{\partial i}{\partial i}*\frac{\partial h*e}{\partial h}\\ &=1*e\\ &=1.1 \end{aligned} hi=iihi=iihhe=1e=1.1

  • f g

    • 因为 h = f + g h=f+g h=f+g,所以反向传播时,相加的位置,直接将导数传过去即可
    • 所以fg的导数都为1.1
  • a
    ∂ f ∂ a = ∂ f ∂ f ∗ ∂ a ∗ b ∂ a = 1.1 ∗ b = 1.1 ∗ 100 = 110 \begin{aligned} \frac{\partial f}{\partial a}&= \frac{\partial f}{\partial f}* \frac{\partial a*b}{\partial a}\\ &=1.1*b\\ &=1.1*100\\ &=110 \end{aligned} af=ffaab=1.1b=1.1100=110

  • b
    ∂ f ∂ b = ∂ f ∂ f ∗ ∂ f ∂ b = 1.1 ∗ ∂ a ∗ b ∂ b = 1.1 ∗ a = 1.1 ∗ 2 = 2.2 \begin{aligned} \frac{\partial f}{\partial b}&= \frac{\partial f}{\partial f}* \frac{\partial f}{\partial b}\\ &=1.1* \frac{\partial a*b}{\partial b}\\ &=1.1*a\\ &=1.1*2\\ &=2.2 \end{aligned} bf=ffbf=1.1bab=1.1a=1.12=2.2

  • c
    ∂ g ∂ c = ∂ g ∂ g ∗ ∂ g ∂ c = 1.1 ∗ ∂ c ∗ d ∂ c = 1.1 ∗ d = 1.1 ∗ 3 = 3.3 \begin{aligned} \frac{\partial g}{\partial c}&= \frac{\partial g}{\partial g}* \frac{\partial g}{\partial c}\\ &=1.1* \frac{\partial c*d}{\partial c}\\ &=1.1*d\\ &=1.1*3\\ &=3.3 \end{aligned} cg=ggcg=1.1ccd=1.1d=1.13=3.3

  • d
    ∂ g ∂ d = ∂ g ∂ g ∗ ∂ g ∂ d = 1.1 ∗ ∂ c ∗ d ∂ d = 1.1 ∗ c = 1.1 ∗ 150 = 165 \begin{aligned} \frac{\partial g}{\partial d}&= \frac{\partial g}{\partial g}* \frac{\partial g}{\partial d}\\ &=1.1* \frac{\partial c*d}{\partial d}\\ &=1.1*c\\ &=1.1*150\\ &=165 \end{aligned} dg=ggdg=1.1dcd=1.1c=1.1150=165

3. 代码实现

3.1 参数对应

参数代码参数
a dapple_num
bdapple
cdorange
ddorange_num
edall_price
f dapple_price
gdorange_price
hdall_price
i dprice

3.2 代码实现

  • 相关代码
    # 乘法类
    class MulLayer:
        def __init__(self):
            self.x = None
            self.y = None
    
        def forward(self, x, y):
            """
    
            :param x: 价格
            :param y: 数量 或 税
            :return: 总价
            """
            self.x = x
            self.y = y
            out = x * y
    
            return out
    
        def backward(self, dout):
            dx = dout * self.y
            dy = dout * self.x
            return dx, dy
    
    
    class AddLayer:
        def __init__(self):
            pass
        def forward(self, x, y):
            """
            价格相加
            :param x: 苹果总价
            :param y: 句子总价
            :return: 总价
            """
            out = x + y
            return out
        def backward(self, dout):
            """
            相加的求导直接传递,相当于乘以1
            :param dout: 导数
            :return:
            """
            dx = dout * 1
            dy = dout * 1
            return dx, dy
    
    if __name__ == '__main__':
        apple,apple_num = 100,2
        orange,orange_num = 150,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)                 # 苹果价格*苹果数量
        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)
        dapple, dapple_num = mul_apple_layer.backward(dapple_price)
        dorange, dorange_num = mul_orange_layer.backward(dorange_price)
    
        # 总价
        print("price:", int(price))
        print("dprice:", dprice)
        print("dtax:", dtax)
        print("dall_price:", dall_price)
        # 苹果
        print("dapple_price:", dapple_price)
        print("dapple_num:", int(dapple_num))
        print("dapple:", dapple)
        # 橘子
        print("dorange_price:", dorange_price)
        print("dorange_num:", int(dorange_num))
        print("dorange:", dorange)
    
  • 结果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/928259.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ceph入门到精通-如何编译安装Quagga?

Quagga 1. 理论部分 1.1 软件简介 Quagga中文翻译斑驴,是一种先进的路由软件包,提供一套基于TCP/IP的路由协议。 1.2 斑驴的应用场景 – 使得操作系统变成专业的路由 – 使得操作系统具有与传统路由通过路由协议直接对接 1.3 斑驴支持的路由协议 …

linux篇---使用systemctl start xxx启动自己的程序|开机启动|守护进程

linux篇---使用systemctl start xxx启动自己的程序|开机启动|守护进程 1、创建服务2、修改权限3、启动服务4、测试 机器:Nvidia Jetson Xavier系统:ubuntu 18.04 最近在使用symfony的console组件,需要执行一个后台的php进程,并且…

DevOps之自动化测试

什么是自动化测试? 明确一下自动化测试不是什么。自动化测试不是指自动化生成测试代码,而是自动化地执行由开发人员或测试人员编写的测试代码。正如下面这句谚语:“绝不要手工去做任何可以被自动化处理的事情。——Curt Hibbs” 之前是由人…

Windows 桌面运维及安全管理

什么是桌面运维 桌面运维是IT管理的重要部分,是一种系统管理的技术,它的主要目的是通过管理用户、计算机和其他设备来提高组织的效率。它不仅能够降低维护成本,而且还能够提高系统的可用性。 如今随着企业设备越来越丰富,桌面运…

前端需要理解的数据治理与异常监控知识

1 数据治理 前端数据治理的重要指标是准确性和数据,一个数据对象包括数据值和其他元数据。 2 数据上报方式 2.1 Image 通过将采集的数据拼接在图片请求的后面,向服务端请求一个 1*1 px 大小的图片(gif)实现的,设置…

与活力四射的 {Agorians} 化身一起拥抱自我超越

准备好通过新的化身转换来探索新的自己吧! 我们与法国多学科艺术家和 DJ Agoria 达成合作,自豪地宣布推出 {Agorians} 化身系列,这是有史以来第一个实现自动外观变换以反映一天中真实时间的 Web3 化身系列。在一天里,你们的化身…

跨地区、跨平台、跨网络,如何解决远程IT运维集中管理难题

面对日益激增的IT复杂性和业务需求的快速变化,IT应用在运行过程中发生性能下降或者服务不可用等故障的可能性大大增加,如何更高效、更智能地开展IT运维,保证业务的连续性和IT系统的稳定性,成为企业业务发展的迫切需要。IT运维作为…

BGP路径劫持攻击实验

一、实验目的: 1)BGP实验环境搭建 2)BGP路径劫持验证 二、预备知识: BGP(Border Gateway Protocol)边界网关协议,也就是不同自治系统autonomous system之间进行路由交换的协议 三、实验环境: 四、…

X2000 Linux PWM

一、硬件设计 PC04 ------------PWM4 二、通过shell开启PWM 配置参数 cmd_pwm config pc04 freq1000 max_level100 active_level1 accuracy_priorityfreq 启动 cmd_pwm set_level pc04 10 三、通过写程序控制 先用IConfigTool工具,使能libhardware2--->pwm…

Kafka生产者原理 kafka生产者发送流程 kafka消息发送到集群步骤 kafka如何发送消息 kafka详解

kafka尚硅谷视频: 10_尚硅谷_Kafka_生产者_原理_哔哩哔哩_bilibili ​ 1. producer初始化:加载默认配置,以及配置的参数,开启网络线程 2. 拦截器拦截 3. 序列化器进行消息key, value序列化 4. 进行分区 5. kafka broker集群 获取…

3D模型转换工具HOOPS Exchange助力打造虚拟现实应用程序

挑战: 支持使用各种 CAD 系统和 CAD 文件格式的客户群向可视化硬件提供快速、准确的数据加载提供对详细模型信息的访问,同时确保高帧率性能 解决方案: HOOPS Exchange领先的CAD数据转换工具包 结果: 确保支持来自领先工程软件…

【Python编程】将同一种图片分类到同一文件夹下,并且将其分类的路径信息写成txt文件进行保存

注:数据结构同上一篇博文类似 一、代码 import os import cv2 import shutilpath0os.getcwd()\\apple\\RGB path1os.getcwd()\\apple\\tof_confidence # path2os.getcwd()\\apple\\tof_depth # path3os.getcwd()\\apple\\tof_depthRGB # path4os.getcwd()\\apple\…

云计算为中小企业带来的 10 大好处

云计算的迅速采用并非巧合。中小型企业 (SMB) 现在有机会摆脱传统 IT 基础设施的限制,享受云提供的众多优势。它的发展使公司能够更智能、更快速、更安全地工作。 因此,如果您发现自己质疑是否需要进行这种转变,请不要害怕!让我们…

1.1 VMware Workstation与Kali的安装和配置1

资源见专栏第一篇文章https://blog.csdn.net/algorithmyyds/article/details/132457258 安装VMware 不多加赘述,直接按顺序安装即可。 有以下需注意的地方: 1.建议选择增强型服务; 2.不要加入体验改进计划。是否开启提示更新看你的想法&…

小资金能玩期权吗?为什么玩期权的人这么少?

目前我国有很多个ETF期权品种,实际交易时,小资金也能参与期权交易,开通期权账户只是打开了交易50ETF期权的窗口,第二关键的在于关于怎么买卖50ETF期权的方式,那么先来说说小小资金能玩期权吗?为什么玩期权的人这么少?本文来自:期权酱 【建议收…

回收站恢复软件推荐!轻松找回误删数据!

“不小心清空了回收站怎么办呢?大家有没有什么回收站恢复软件推荐呢?非常需要一个软件来帮助我恢复回收站里的重要数据,请看看我吧!” 众所周知,回收站中存放着很多我们删除的文件。如果我们发现文件是被误删了&#x…

期刊的“综合影响因子”和“复合影响因子”你了解多少?

可能在刚开始发论文时还分不清许多概念,但是在此之前,需要先了解影响因子是? 影响因子:美国科技信息研究所(ISI)原所长尤金加菲尔德博士于1963年提出,已成为国际上通行的期刊评价指标。期刊的影…

⌈算法进阶⌋图论::拓扑排序(Topological Sorting)——快速理解到熟练运用

目录 一、原理 1. 引例:207.课程表 2. 应用场景 3. 代码思路 二、代码模板 三、练习 1、210.课程表Ⅱ🟢 2、2392.给定条件下构造举证🟡 3、310.最小高度树 🟡 一、原理 1. 引例:207.课程表 就如大学课程安排一样&…

WPF基础入门-Class2-样式

WPF基础入门 Class2&#xff1a;样式 1、内联样式&#xff1a;优先度最高 <Grid><StackPanel><!--内联样式优先度高--><Button Background"Red" Height"10" Width"100"FontSize"20"Content"SB">…

《热题100》二分查找、排序、二叉树篇

思路&#xff1a;将数组排序&#xff0c;峰值肯定是比较大的那些数&#xff0c;排序后&#xff0c;从大到小&#xff0c;依次看该值是否比左右大&#xff0c;如果是&#xff0c;就返回该值为峰值。 import random class Solution: def paixu(self,nums): if len(nums) < 1…