Numpy编写BP传播过程全解

2021 年 2 月 2 日 PaperWeekly


©PaperWeekly 原创 · 作者|孙裕道
学校|北京邮电大学博士生
研究方向|GAN图像生成、情绪对抗样本生成

引言

BP反向传播矩阵推导图示详解一文中在矩阵视角下对 BP 的原理进行了详细的介绍,神经网络中权重的梯度由前一层前向传播值与后一层的误差值整合计算得到。该文中也对吴恩达的斯坦福机器学习的讲义中的相关部分进行了证明。

BP 的矩阵形式的推导的好处在于它的矩阵表示形式对编程非常有指导意义,当前有很多的热门的深度学习框架,例如 Pytorch 和 Tensorflow,像这种深度学习框架集成性很高,神经网络中 BP 更新参数的过程几行代码就搞定,这对于从代码中理解其原理造成了一定的困难。

Numpy 编写 BP 更新参数的过程则是一个好的方式去了解其原理,代码链接如下:
https://github.com/guidao20/BP_Numpy
文件并不复杂,两个 py 文件加一个 mnist 数据集。本文会对该代码进行详细的介绍。
预备知识
一个 4 层的神经网络如下图所示,各个层的维度分别是 784,128,64,10;神经网络的权重分别为 ,具体的前向计算过程如下所示。

▲ 图1.神经网络前向计算过程

根据 BP 反向传播矩阵推导图示详解中 Section 6 的推导过程可得到各层网络的权重梯度计算示意图(示意图中各字母代表的含义查阅 BP 反向传播矩阵推导图示详解的 Section 6)。

▲ 图2.神经网络BP原理

BP 反向传播矩阵推导图示详解 中的 Section 8 是对吴恩达机器学习讲义中的关于BP 原理部分的等价证明,所以可以将上图 2 的示意图重新整理如下,其中反向传播的误差 的计算公式在图中蓝色字体。本文的要介绍的 Numpy 代码就按照下图的形式进行编程。

▲ 图3.神经网络BP原理(吴)

代码详解 

本文的代码结构非常简单如下图所示一共三个文件。data 文件夹下是 mnist 手写体数字集的压缩包 mnist.pkl.gz;mnist_loader.py 是用于加载 mnist 数据集的;BP_Numpy.py 是 BP 训练神经网络的程序,也是本文重点要讲的程序。

由图 4 可知程序中使用的激活函数为 Sigmoid 函数,其中 Sigmoid 函数的定义为:

Sigmoid 函数的导数定义为:

▲ 图4.Sigmoid函数及其导数

图 5 是类 NerualNetwork 的初始化,进而构建一个神经网络,分别对神经网络的尺寸(有几层,每一层的单元数是多少),每一层的权重和偏置进行初始化。

▲ 图5.类初始化

图 6 是神经网络的前向计算过程,先做线性变换,然后再进行激活。以 Section 2 预备知识中图 1 的神经网络为例(以便更清楚的交代出各个矩阵的维度)。假如一共有四层神经网络,各个层的单元数为 784,128,64,10,根据代码则前向计算过程可以归结为:


▲ 图6.前向计算过程

图 7 是 BP 反向传播求梯度的过程,图 7 中的黄色框区域是用列表存储前计算的激活值,最后求出损失函数,这里损失函数为 。这里需要注意的是反向传播求梯度并不是不需要前向计算值。图 7 中的蓝色框区域是计算输出层的权重梯度,对应于图 3 中 的计算过程:

图 7 中的绿色框区域是从后往前以此计算各个层的权重梯度,对应于图 3 中 的计算过程:

这里需要注意的是符号 表示的是矩阵相乘,符号 表示的是向量元素对应位置相乘。另外程序中有对偏置求梯度的操作,其原理跟求解权重的原理类似。

▲ 图7. BP反向传播

图 8 主要是对神经网络参数进行更新(图中红框所示),以上操作将各个层的权重和偏置的梯度求解出来,再利用梯度下降对各个层的权重和偏置的参数进行更新。

▲ 图8.权重和偏置更新

设置学习率的步长为 0.1,epoch 为 1000,batch_size 为 10,则可得到如下图程序结果,由结果可知,通过 BP 求解参数梯度,再利用梯度下降法,损失函数整体是减小的。

▲ 图9.权重和偏置更新


更多阅读





#投 稿 通 道#

 让你的论文被更多人看到 



如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。


总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 


PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。


📝 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向) 

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接 

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志


📬 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site 

• 所有文章配图,请单独在附件中发送 

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通



🔍


现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧



关于PaperWeekly


PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。



登录查看更多
2

相关内容

反向传播一词严格来说仅指用于计算梯度的算法,而不是指如何使用梯度。但是该术语通常被宽松地指整个学习算法,包括如何使用梯度,例如通过随机梯度下降。反向传播将增量计算概括为增量规则中的增量规则,该规则是反向传播的单层版本,然后通过自动微分进行广义化,其中反向传播是反向累积(或“反向模式”)的特例。 在机器学习中,反向传播(backprop)是一种广泛用于训练前馈神经网络以进行监督学习的算法。对于其他人工神经网络(ANN)都存在反向传播的一般化–一类算法,通常称为“反向传播”。反向传播算法的工作原理是,通过链规则计算损失函数相对于每个权重的梯度,一次计算一层,从最后一层开始向后迭代,以避免链规则中中间项的冗余计算。
专知会员服务
43+阅读 · 2020年12月28日
最新《自动微分》综述教程,71页ppt
专知会员服务
21+阅读 · 2020年11月22日
【2020新书】傅里叶变换的离散代数,296页pdf
专知会员服务
113+阅读 · 2020年11月2日
最新《高斯过程回归简明教程》,19页pdf
专知会员服务
70+阅读 · 2020年9月30日
【经典书】概率统计导论第五版,730页pdf
专知会员服务
237+阅读 · 2020年7月28日
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
Python导论,476页pdf,现代Python计算
专知会员服务
259+阅读 · 2020年5月17日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
172+阅读 · 2020年5月6日
一文搞懂反向传播
机器学习与推荐算法
18+阅读 · 2020年3月12日
三次简化一张图:一招理解LSTM/GRU门控机制
机器之心
15+阅读 · 2018年12月18日
博客 | Tensorflow系列专题(五):BP算法原理
AI研习社
4+阅读 · 2018年11月22日
教程 | PyTorch经验指南:技巧与陷阱
机器之心
15+阅读 · 2018年7月30日
误差反向传播——CNN
统计学习与视觉计算组
30+阅读 · 2018年7月12日
浅显易懂的分布式TensorFlow入门教程
专知
7+阅读 · 2018年6月22日
用Python实现BP神经网络(附代码)
七月在线实验室
4+阅读 · 2017年12月4日
神经网络bp算法推导
统计学习与视觉计算组
11+阅读 · 2017年11月17日
Arxiv
0+阅读 · 2021年4月22日
q-Space Novelty Detection with Variational Autoencoders
Arxiv
5+阅读 · 2018年5月1日
Arxiv
5+阅读 · 2018年1月30日
Arxiv
8+阅读 · 2018年1月12日
VIP会员
相关VIP内容
专知会员服务
43+阅读 · 2020年12月28日
最新《自动微分》综述教程,71页ppt
专知会员服务
21+阅读 · 2020年11月22日
【2020新书】傅里叶变换的离散代数,296页pdf
专知会员服务
113+阅读 · 2020年11月2日
最新《高斯过程回归简明教程》,19页pdf
专知会员服务
70+阅读 · 2020年9月30日
【经典书】概率统计导论第五版,730页pdf
专知会员服务
237+阅读 · 2020年7月28日
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
Python导论,476页pdf,现代Python计算
专知会员服务
259+阅读 · 2020年5月17日
一份循环神经网络RNNs简明教程,37页ppt
专知会员服务
172+阅读 · 2020年5月6日
相关资讯
一文搞懂反向传播
机器学习与推荐算法
18+阅读 · 2020年3月12日
三次简化一张图:一招理解LSTM/GRU门控机制
机器之心
15+阅读 · 2018年12月18日
博客 | Tensorflow系列专题(五):BP算法原理
AI研习社
4+阅读 · 2018年11月22日
教程 | PyTorch经验指南:技巧与陷阱
机器之心
15+阅读 · 2018年7月30日
误差反向传播——CNN
统计学习与视觉计算组
30+阅读 · 2018年7月12日
浅显易懂的分布式TensorFlow入门教程
专知
7+阅读 · 2018年6月22日
用Python实现BP神经网络(附代码)
七月在线实验室
4+阅读 · 2017年12月4日
神经网络bp算法推导
统计学习与视觉计算组
11+阅读 · 2017年11月17日
Top
微信扫码咨询专知VIP会员