Python深度学习基础(二)——反向传递概念透彻解析以及Python手动实现
反向传递概念透彻解析以及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=dydLdxdy={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)dydLdxdy=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手动实现相关推荐
- python深度学习include框架_搞事情。《用Python实现深度学习框架》已出版上架。...
我和 @张觉非 合作的<用Python实现深度学习框架>一书已经由人民邮电出版社出版上市了.写作本书的缘由,是2017年11月我加入了360,开始负责以机器学习平台为中心的AI技术设施的研 ...
- [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)
人工神经网络实现鸢尾花分类(一) 人工神经网络实现鸢尾花分类(二) 人工神经网络实现鸢尾花分类(三) 人工神经网络实现鸢尾花分类(四) 人工神经网络实现鸢尾花分类(五) 目录 人工智能主 ...
- Python深度学习篇
Python深度学习篇一<什么是深度学习> Excerpt 在过去的几年里,人工智能(AI)一直是媒体大肆炒作的热点话题.机器学习.深度学习 和人工智能都出现在不计其数的文章中,而这些文章 ...
- 第三章_深度学习基础
文章目录 第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 3.1.2神经网络有哪些常用模型结构? 3.1.3如何选择深度学习开发平台? 3.1.4为什么使用深层表示? 3.1.5为 ...
- Python深度学习-快速指南
Python深度学习-快速指南 (Python Deep Learning - Quick Guide) Python深度学习-简介 (Python Deep Learning - Introduct ...
- 《机器学习系列教程》第三章 深度学习基础
@[第三章 深度学习基础] 第三章 深度学习基础 3.1 基本概念 3.1.1 神经网络组成? 为了描述神经网络,我们先从最简单的神经网络说起. 感知机 简单的感知机如下图所示: [外链图片转存失败( ...
- 人工智能之深度学习连载二,模型基础与实现框架
**摘要:**深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习.还会定期更新哦. 本系列内容争取每月更新2到4篇. 主要是基于图深度学习的入门内容.讲 ...
- Python 深度学习架构实用指南:第一、二部分
原文:Hands-On Deep Learning Architectures with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集] ...
- Python深度学习(一)深度学习基础
翻译自Deep Learning With Python(2018) 第一章 深度学习基础:https://www.jianshu.com/p/6c08f4ceab4c 第二章 深度学习的数学构建模块 ...
最新文章
- x和伪全面屏(18:9)关于图片切片有白条
- 洛谷P1388 算式
- 美本计算机专业,关于美国本科计算机专业排名
- GitHub使用流程、初学者的使用方法
- GoogleMapAPI
- 闪退没由报错_使命召唤:(cod16)出现的闪退问题以及解决办法
- Web应用程序系统的多用户权限控制设计及实现-总述【1】
- 线程Java的两种方式_[转载]Java线程的两种实现方式
- 聊聊汽车智能化时代的ASIL
- 中南天坑专业到武大计算机的考研分享~
- 一直用破解软件?可以试试学生优惠!
- iview中的Select选择器
- 计算机word基础操作知识,word文档基本操作
- 2022年前端面试题
- uniapp开发:uniapp快速体验vue3.2之setup语法糖,怎么使用怎么爽
- maven项目安装本地包实战演示
- C语言位运算 Bitwise Operator
- Embedding Cardinality Constraints in Neural Link Predictors (SAC 2019)
- javascript实现数字拼图
- 理解onMeasure
热门文章
- 唯冠咬住苹果不管有何功利目的
- tomcat无法响应请求,假死
- Android 弹出软键盘(输入法)
- vscode 报错:Your shell has not been properly configured to use ‘conda activate‘
- 鸿蒙手机开发者申请,鸿蒙OS 2.0手机开发者Beta公开招募上线:P40/Mate 30可申请
- 天使投资AI、风险投资VC、私募股权投资PE、投行IB、FOF、普通合伙人GP、有限合伙人LP、PIPE
- java lru笔试题,2016年头条校招笔试(LRU算法)
- 自定义vue3.0日历组件
- 1.UEFI-edk2 开发环境搭建
- PAT - 浙江大学计算机程序设计能力考试简介