Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习|反向传播算法(BP)原理推导及代码实现

深度学习|反向传播算法(BP)原理推导及代码实现

作者头像
double
发布于 2018-04-02 07:05:39
发布于 2018-04-02 07:05:39
2K0
举报
文章被收录于专栏:算法channel算法channel

《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!

01

回顾

昨天,分析了手写字数据集分类的原理,利用神经网络模型,编写了SGD算法的代码,分多个epochs,每个 epoch 又对 mini_batch 样本做多次迭代计算,详细的过程,请参考:

深度学习|神经网络模型实现手写字分类求解思路

这其中,非常重要的一个步骤,便是利用反向传播(BP)算法求权重参数的梯度,偏置量的梯度。下面根据以下几个问题展开BP算法:

  • 什么是BP算法?
  • 为什么叫做反向传播?
  • 如何构思BP算法的切入点?
  • 误差是如何传播开的?
  • 如何求出权重参数的梯度和偏置量的梯度?
  • 链式规则是怎么一回事?

02

统一符号表达

神经网络每个神经元的连接关系,用符合如何表达呢? 下面定义一种表达方式,如下图所示,含有一个隐含层的神经网络,图中标出的w的含义为:第三层的第2个神经元与第二层的第4个神经元间的权重参数。

再看下,标红色箭头的神经元的偏移量 b,如图所示进行标记,第二层中第3个神经元的偏移量;标绿色箭头的神经元的输出 a 为如下图所示标记,为第三层中第一个神经元的输出。

第 L 层第 j 个神经元的输出等于,前1层即 L-1 层中所有神经元的带权的输入和,然后再映射到sigmoid激活函数中,得到如下公式所述:

一定要仔细理解这种上述公式的各个符号表达,它是理解以下对 BP 算法论述的前提。

03

BP算法推导

3.1 公式1

如下图所示,有个精灵跑到了网络中,假设位于第L层,第 j 个神经元的门口处,它引起了一点扰动,

z的含义是加权输入项,容易得出这个扰动项对成本函数造成的损失可以定义为:

那么,类推的,可以看出在输出层 L, 误差项的定义表达为如下,第一个公式

上式是根据链式规则可以推导得出,成本函数的改变首先是有第L层第j个神经元的输出项影响的,然后第 j 个神经元的输出又受到第 L层第 j 个神经元的干扰 z 影响,因此得到上式。这个式子的意义是定义了第 L层第 j个神经元的误差项怎么求,注意这里L可是输出层哦,那么如何求出第 L-1层中某个神经元的损失项(误差项)呢?

3.2 公式2

这就用到第二个公式,它给出了怎么由第 L层的误差推导出第L-1层的误差,先给出第二个公式

那么,这个公式,是如何得出的呢?这里面,这个公式是相对最难想的,推导过程如下:

还是从损失项的定义入手,

由以上这几个式子,就可以得出公式2 。

3.3 公式3

那么有了以上的分析,我们便能求解处任意层的损失项了,可以得出成本函数对某层某个神经元的梯度为,这是第三个公式

还是可以由链式规则得出吧,如下推导过程:

3.4 公式4

成本函数对权重参数的梯度为,这是第四个公式

那么这个公式还是可以由链式规则得出,对其推导如下:

推导第三,四个公式,都用到了以下这个基本知识:

3.5 反向传播代码

根据这四个公式,可以得出BP算法的代码,每个步骤将公式放到上面,方便查看。

def backprop(self, x, y):

01 占位

nabla_b = [np.zeros(b.shape) for b in self.biases]

nabla_w = [np.zeros(w.shape) for w in self.weights]

02 前向传播求出每个神经元的输出项

activation = x

activations = [x] # 分层存储每层的输出项(对应上文中的 a)

zs = [] # 分层存储每层的 z 向量(对应上文中的 z)

for b, w in zip(self.biases, self.weights):

z = np.dot(w, activation)+b

zs.append(z)

activation = sigmoid(z)

activations.append(activation)

#activations[-1] 必须是最后一层

delta = self.cost_derivative(activations[-1], y) * sigmoid_prime(zs[-1])

03 求偏置量的梯度

nabla_b[-1] = delta

04 求权重参数的梯度

nabla_w[-1] = np.dot(delta, activations[-2].transpose())

05 反向传播,依次更新每层的每个神经元的权重和偏移量

# L = 1 表示最后一层神经元, L = 2 倒数第二层神经元

for layer in range(2, self.num_layers):

z = zs[-layer]

sp = sigmoid_prime(z) #sigmoid函数的导数

delta = np.dot(self.weights[-layer+1].transpose(), delta) * sp

nabla_b[-layer] = delta

nabla_w[-layer] = np.dot(delta, activations[-layer-1].transpose())

return (nabla_b, nabla_w)

def cost_derivative(self, output_activations, y):

"""

"""

return (output_activations-y)

好了,以上就是,BP算法的详细推导过程,谢谢您的阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
BAT面试题49:推导下反向传播Backpropagation
神经网络每个神经元的连接关系,用符合如何表达呢? 下面定义一种表达方式,如下图所示,含有一个隐含层的神经网络,图中标出的w的含义为:第三层的第2个神经元与第二层的第4个神经元间的权重参数。
double
2019/03/07
2.7K0
小白也能看懂的BP反向传播算法之Surpass Backpropagation
上篇文章小白也能看懂的BP反向传播算法之Further into Backpropagation中,我们小试牛刀,将反向传播算法运用到了一个两层的神经网络结构中!然后往往实际中的神经网络拥有3层甚至更多层的结构,我们接下来就已一个三层的神经网络结构为例,分析如何运用动态规划来优化反向传播时微分的计算!
desperate633
2018/08/23
8720
神经网络中 BP 算法的原理与 Python 实现源码解析
最近这段时间系统性的学习了BP算法后写下了这篇学习笔记,因为能力有限,若有明显错误,还请指出。 目录 1、什么是梯度下降和链式求导法则 2、神经网络的结构 3、BP算法中的执行流程(前向传递和逆向更新) 4、输出层和隐藏层权重以及偏置更新的推导 5、Python 实现源码解析 6、手写数字识别实例 7、训练神经网络中有哪些难点(TODO) 梯度下降和链式求导法则 假设
用户1332428
2018/03/08
2K0
神经网络中 BP 算法的原理与 Python 实现源码解析
神经网络算法
20 世纪五、六⼗年代,科学家 Frank Rosenblatt其受到 Warren McCulloch 和 Walter Pitts早期的⼯作的影响,发明了感知机(Perceptrons)。
foochane
2019/05/23
9090
神经网络算法
神经网络模型解决分类问题的思考方式
本文介绍了如何使用反向传播算法来训练神经网络,并使用MNIST数据集进行手写数字分类。首先介绍了反向传播算法的基本原理,然后通过一个具体的例子展示了如何使用该算法来训练神经网络,最后给出了一个完整的代码实现。
人工智能的秘密
2017/12/25
2.4K0
神经网络模型解决分类问题的思考方式
TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
到目前为止,我们已经研究了梯度下降算法、人工神经网络以及反向传播算法,他们各自肩负重任: 梯度下降算法:机器自学习的算法框架; 人工神经网络:“万能函数”的形式表达; 反向传播算法:计算人工神经网络梯度下降的高效方法; 基于它们,我们已经具备了构建具有相当实用性的智能程序的核心知识。它们来之不易,从上世纪40年代人工神经元问世,到80年代末反向传播算法被重新应用,历经了近半个世纪。然而,实现它们并进行复杂的手写体数字识别任务,只需要74行Python代码(忽略空行和注释)。要知道如果采用编程的方法(非学习
袁承兴
2018/04/11
1.8K0
TensorFlow从0到1 - 11 - 74行Python实现手写体数字识别
TensorFlow从0到1 | 第十一章 74行Python实现手写体数字识别
到目前为止,我们已经研究了梯度下降算法、人工神经网络以及反向传播算法,他们各自肩负重任: 梯度下降算法:机器自学习的算法框架; 人工神经网络:“万能函数”的形式表达; 反向传播算法:计算人工神经网络梯度下降的高效方法; 基于它们,我们已经具备了构建具有相当实用性的智能程序的核心知识。它们来之不易,从上世纪40年代人工神经元问世,到80年代末反向传播算法被重新应用,历经了近半个世纪。然而,实现它们并进行复杂的数字手写体识别任务,只需要74行Python代码(忽略空行和注释)。要知道如果采用编程的方法(非学习的
用户1332428
2018/03/08
1.2K0
TensorFlow从0到1  | 第十一章 74行Python实现手写体数字识别
前馈神经网络——深度学习之神经网络核心原理与算法
因上几次读者反映,公式代码有乱码和不规整的问题,小编有改善哟,这篇文章开始亲们会看到效果的哟~
用户1332428
2018/07/30
1.2K0
前馈神经网络——深度学习之神经网络核心原理与算法
《neural network and deep learning》题解——ch02 Network源码分析
http://blog.csdn.net/u011239443/article/details/75008380
小爷毛毛_卓寿杰
2019/02/13
1.5K0
连载 | 深度学习入门第六讲
1.6 实现我们的网络来分类数字 好吧,现在让我们写一个学习如何识别手写数字的程序,使用随机梯度下降算法和 MNIST训练数据。我们需要做的第一件事情是获取 MNIST 数据。如果你是一个 git 用戶,那么你能够 通过克隆这本书的代码仓库获得数据, git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git 如果你不使用 git,也可以从这里下载数据和代码。 顺便提一下,当我在之前描述 MNIST 数据时,我
用户1107453
2018/06/21
4390
李理:从Image Caption Generation理解深度学习(part II)
本系列文章面向程序员,希望通过Image Caption Generation,一个有意思的具体任务,深入浅出地介绍深度学习的知识,涉及到很多深度学习流行的模型,如CNN,RNN/LSTM,Attention等。本文为第二篇。 作者李理,MDCC 2016 移动开发者大会人工智能与机器人专场的出品人,邀请人工智能一线专家担任演讲嘉宾,从无人驾驶、智能机器人、智能应用开发实战等方面解读人工智能技术的内涵及其对移动开发工作的影响。 大会目前火热报名中,门票6.8折优惠即将结束,倒计时2天!(票务详情链接,欲购从
用户1737318
2018/06/06
9170
《neural network and deep learning》题解——ch03 再看手写识别问题题解与源码分析
http://blog.csdn.net/u011239443/article/details/77649026
小爷毛毛_卓寿杰
2019/02/13
4620
《neural network  and deep learning》题解——ch03 再看手写识别问题题解与源码分析
数据科学 IPython 笔记本 四、Keras(上)
深度学习允许由多层组成的计算模型,来学习具有多个抽象级别的数据表示。这些方法极大地改进了语音识别,视觉对象识别,物体检测,以及药物发现和基因组学等许多其他领域的最新技术。
ApacheCN_飞龙
2022/05/07
1.8K0
数据科学 IPython 笔记本 四、Keras(上)
反向传播算法大揭秘
注: 该篇博文是我阅读《How the backpropagation algorithm works》一文的笔记,该博文详细介绍了反向传播算法,并给出了反向传播算法四个基本公式中的前两个证明,我顺着作者的思路证明了后面两个,并记录了证明过程,希望能帮助到需要了解反向传播算法数学原理的童鞋。
卡尔曼和玻尔兹曼谁曼
2019/01/22
8990
AI从入门到放弃:BP神经网络算法推导及代码实现笔记
作者 | @Aloys (腾讯员工,后台工程师) 本文授权转自腾讯的知乎专栏 ▌一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! 【毒鸡汤】:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的,吭哧吭哧学总能学会,毕竟还有千千万万个算法等着你。 本文货很干,堪比沙哈拉大沙漠,自己挑的文章,含着泪也要读完! ▌二. 科普: 生物上的神经元就是接收四面八方的刺激(输入),然后做出反应(输出),给它一点☀️就灿烂。 仿生嘛,于是
用户1737318
2018/07/20
1.1K0
反向传播算法详解和Python代码实现
反向传播算法是训练神经网络的经典算法,是深度学习的最重要的基础,适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上,通过迭代的方法求出目标损失函数(loss function)的近似最小值。
deephub
2020/05/09
3.6K0
反向传播算法详解和Python代码实现
深度学习之神经网络(反向传播算法)(三)
神经网络最开始是受生物神经系统的启发,为了模拟生物神经系统而出现的。大脑最基本的计算单元是神经元,人类的神经系统中大概有86亿的神经元,它们之间通过1014-1015的突触相连接。每个神经元从它的树突(dendrites)接受输入信号,沿着唯一的轴突(axon)产生输出信号,而轴突通过分支(branches of axon),通过突触(synapses)连接到其他神经元的树突,神经元之间就这通过这样的连接,进行传递。如下图。
李小白是一只喵
2020/04/24
1.2K0
一文搞定BP神经网络——从原理到应用(原理篇)「建议收藏」
本文着重讲述经典BP神经网络的数学推导过程,并辅助一个小例子。本文不会介绍机器学习库(比如sklearn, TensorFlow等)的使用。 欲了解卷积神经网络的内容,请参见我的另一篇博客一文搞定卷积神经网络——从原理到应用。
全栈程序员站长
2022/09/09
4.8K1
一文搞定BP神经网络——从原理到应用(原理篇)「建议收藏」
零基础入门深度学习 | 第三章:神经网络和反向传播算法
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习这个超热的技术,会不会感觉马上就out了? 现在救命稻草来了,《零基础入门深度学习》系列文章旨在讲帮助爱编程的你从零基础达到入门级水平。零基础意味着你不需要太多的数学知识,只要会写程序就行了,没错,这是专门为程序员写的文章。虽然文中会有很多公式你也许看不懂,但同时也会有更多的代码,程序员的你一定能看懂的(我周围是一群狂热的Clean Code程序员,所以我写的代码也不会
用户1332428
2018/03/09
3.8K0
零基础入门深度学习 | 第三章:神经网络和反向传播算法
反向传播算法从原理到实现
是一个有上百万维度的向量,这时候我们使用反向传播算法有效率的计算参数的梯度下降值.
演化计算与人工智能
2020/08/14
9160
反向传播算法从原理到实现
推荐阅读
相关推荐
BAT面试题49:推导下反向传播Backpropagation
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档