反向传递概念透彻解析以及Python手动实现

  • 前言
  • 最简单的反向传递
    • 乘法层
    • 加法层
  • 激活函数的反向传递
    • Relu层
    • Sigmoid层
    • 带交叉熵误差的SoftMax层

前言

我们在感知机中采用了梯度下降的方式实现了参数的优化(手动实现感知机),但是感知机对于较为复杂的问题就显得力不从心了,所以我们需要用到多层感知机,即神经网络。此时的梯度下降就需要通过反向传递来实现了

最简单的反向传递

我们在感知机中进行的最简单的操作就是加法和乘法,这里我们先以乘法和除法为例实现最简单的反向传递

乘法层

公式
我们假设x*y=z, 损失函数为L,那么我们分别对z求关于x和y的偏导得
∂z∂x=y\frac{ \partial z}{\partial x}=y∂x∂z​=y
∂z∂y=x\frac{\partial z}{\partial y}=x∂y∂z​=x
得到结论乘法层的偏导为两个乘数互换位置

∂L∂z∂z∂x=∂L∂z⋅y\frac{ \partial L}{\partial z}\frac{ \partial z}{\partial x}=\frac{ \partial L}{\partial z} \cdot y∂z∂L​∂x∂z​=∂z∂L​⋅y
∂L∂z∂z∂y=∂L∂z⋅x\frac{ \partial L}{\partial z}\frac{\partial z}{\partial y}=\frac{ \partial L}{\partial z} \cdot x∂z∂L​∂y∂z​=∂z∂L​⋅x
代码实现
在反向传递时要遵循链式法则,所以在这里我们每个偏导都要乘以后面一层反向传递来的偏导数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

加法层

公式
我们假设x+y=z, 损失函数为L那么我们分别对z求关于x和y的偏导得
∂z∂x=1\frac{ \partial z}{\partial x}=1∂x∂z​=1
∂z∂y=1\frac{\partial z}{\partial y}=1∂y∂z​=1

∂L∂x=∂L∂z∂z∂x=∂L∂z\frac{\partial L}{\partial x}= \frac{\partial L}{\partial z} \frac{\partial z}{\partial x}= \frac{\partial L}{\partial z}∂x∂L​=∂z∂L​∂x∂z​=∂z∂L​

∂L∂y=∂L∂z∂z∂y=∂L∂z\frac{\partial L}{\partial y}= \frac{\partial L}{\partial z} \frac{\partial z}{\partial y}= \frac{\partial L}{\partial z}∂y∂L​=∂z∂L​∂y∂z​=∂z∂L​
代码实现

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

激活函数的反向传递

Relu层

公式
y={x,x>00,x<=0y=\begin{cases} x, & {x>0} \\ 0, & {x<=0} \end{cases}y={x,0,​x>0x<=0​
dydx={1,x>00,x<=0\frac{dy}{dx}=\begin{cases} 1, & {x>0} \\ 0, & {x<=0} \end{cases}dxdy​={1,0,​x>0x<=0​

dLdx=dLdydydx={dLdy,x>00,x<=0\frac{d L}{d x}= \frac{dL}{dy}\frac{dy}{dx}=\begin{cases} \frac{dL}{dy}, & {x>0} \\ 0, & {x<=0} \end{cases}dxdL​=dydL​dxdy​={dydL​,0,​x>0x<=0​
代码

class Relu:def __init__(self):self.mask = Nonedef forward(self, x):self.mask = (x <= 0)out = x.copy()out[self.mask] = 0return outdef backward(self, dout):dout[self.mask] = 0dx = doutreturn dx

Sigmoid层

公式
y=11+e−xy=\frac{1}{1+e^{-x}}y=1+e−x1​
dydx=e−x(1+e−x)2=11+e−x⋅e−x1+e−x=11+e−x⋅(1−11+e−x)=y⋅(1−y)\frac{dy}{dx}=\frac{e^{-x}}{(1+e^{-x})^2}=\frac{1}{1+e^{-x}} \cdot\frac{e^{-x}}{1+e^{-x}} \\ =\frac{1}{1+e^{-x}} \cdot(1-\frac{1}{1+e^{-x}})=y \cdot (1-y)dxdy​=(1+e−x)2e−x​=1+e−x1​⋅1+e−xe−x​=1+e−x1​⋅(1−1+e−x1​)=y⋅(1−y)

dLdydydx=dLdy⋅y⋅(1−y)\frac{dL}{dy} \frac{dy}{dx}=\frac{dL}{dy} \cdot y \cdot (1-y)dydL​dxdy​=dydL​⋅y⋅(1−y)
代码

def sigmoid(x):return 1 / (1 + np.exp(-x))    class Sigmoid:def __init__(self):self.out = Nonedef forward(self, x):out = sigmoid(x)self.out = outreturn outdef backward(self, dout):dx = dout * (1.0 - self.out) * self.outreturn dx

带交叉熵误差的SoftMax层

公式
这个函数反向传递的实质是传回真实值与预测值的差距
代码

def cross_entropy_error(y, t):if y.ndim == 1:t = t.reshape(1, t.size)y = y.reshape(1, y.size)if t.size == y.size:t = t.argmax(axis=1)batch_size = y.shape[0]return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_sizeclass SoftmaxWithLoss:def __init__(self):self.loss = Noneself.y = None # softmax的输出self.t = None # 监督数据def forward(self, x, t):self.t = tself.y = softmax(x)self.loss = cross_entropy_error(self.y, self.t)return self.lossdef backward(self, dout=1):batch_size = self.t.shape[0]if self.t.size == self.y.size: dx = (self.y - self.t) / batch_sizeelse:dx = self.y.copy()dx[np.arange(batch_size), self.t] -= 1dx = dx / batch_sizereturn dx

Python深度学习基础(二)——反向传递概念透彻解析以及Python手动实现相关推荐

  1. python深度学习include框架_搞事情。《用Python实现深度学习框架》已出版上架。...

    我和 @张觉非 合作的<用Python实现深度学习框架>一书已经由人民邮电出版社出版上市了.写作本书的缘由,是2017年11月我加入了360,开始负责以机器学习平台为中心的AI技术设施的研 ...

  2. [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)

    ​​​​​​​人工神经网络实现鸢尾花分类(一) 人工神经网络实现鸢尾花分类(二) 人工神经网络实现鸢尾花分类(三) 人工神经网络实现鸢尾花分类(四) 人工神经网络实现鸢尾花分类(五) 目录 人工智能主 ...

  3. Python深度学习篇

    Python深度学习篇一<什么是深度学习> Excerpt 在过去的几年里,人工智能(AI)一直是媒体大肆炒作的热点话题.机器学习.深度学习 和人工智能都出现在不计其数的文章中,而这些文章 ...

  4. 第三章_深度学习基础

    文章目录 第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 3.1.2神经网络有哪些常用模型结构? 3.1.3如何选择深度学习开发平台? 3.1.4为什么使用深层表示? 3.1.5为 ...

  5. Python深度学习-快速指南

    Python深度学习-快速指南 (Python Deep Learning - Quick Guide) Python深度学习-简介 (Python Deep Learning - Introduct ...

  6. 《机器学习系列教程》第三章 深度学习基础

    @[第三章 深度学习基础] 第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 为了描述神经网络,我们先从最简单的神经网络说起. 感知机 简单的感知机如下图所示: [外链图片转存失败( ...

  7. 人工智能之深度学习连载二,模型基础与实现框架

    **摘要:**深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习.还会定期更新哦. 本系列内容争取每月更新2到4篇. 主要是基于图深度学习的入门内容.讲 ...

  8. Python 深度学习架构实用指南:第一、二部分

    原文:Hands-On Deep Learning Architectures with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集] ...

  9. Python深度学习(一)深度学习基础

    翻译自Deep Learning With Python(2018) 第一章 深度学习基础:https://www.jianshu.com/p/6c08f4ceab4c 第二章 深度学习的数学构建模块 ...

最新文章

  1. x和伪全面屏(18:9)关于图片切片有白条
  2. 洛谷P1388 算式
  3. 美本计算机专业,关于美国本科计算机专业排名
  4. GitHub使用流程、初学者的使用方法
  5. GoogleMapAPI
  6. 闪退没由报错_使命召唤:(cod16)出现的闪退问题以及解决办法
  7. Web应用程序系统的多用户权限控制设计及实现-总述【1】
  8. 线程Java的两种方式_[转载]Java线程的两种实现方式
  9. 聊聊汽车智能化时代的ASIL
  10. 中南天坑专业到武大计算机的考研分享~
  11. 一直用破解软件?可以试试学生优惠!
  12. iview中的Select选择器
  13. 计算机word基础操作知识,word文档基本操作
  14. 2022年前端面试题
  15. uniapp开发:uniapp快速体验vue3.2之setup语法糖,怎么使用怎么爽
  16. maven项目安装本地包实战演示
  17. C语言位运算 Bitwise Operator
  18. Embedding Cardinality Constraints in Neural Link Predictors (SAC 2019)
  19. javascript实现数字拼图
  20. 理解onMeasure

热门文章

  1. 唯冠咬住苹果不管有何功利目的
  2. tomcat无法响应请求,假死
  3. Android 弹出软键盘(输入法)
  4. vscode 报错:Your shell has not been properly configured to use ‘conda activate‘
  5. 鸿蒙手机开发者申请,鸿蒙OS 2.0手机开发者Beta公开招募上线:P40/Mate 30可申请
  6. 天使投资AI、风险投资VC、私募股权投资PE、投行IB、FOF、普通合伙人GP、有限合伙人LP、PIPE
  7. java lru笔试题,2016年头条校招笔试(LRU算法)
  8. 自定义vue3.0日历组件
  9. 1.UEFI-edk2 开发环境搭建
  10. PAT - 浙江大学计算机程序设计能力考试简介