BP算法初识(附代码)

论坛 期权论坛 期权     
leo的成长屋   2019-7-21 14:03   3209   0
“ 本文约1500字,阅读建议5分钟”





深度学习之所以性能奇佳,不仅仅因为有一个“无监督”的逐层预训练,预训练的 “微调”还是需要“有监督”BP算法作为支撑。


01



BP算法认知

熟悉神经网络发展史的人都知道BP算法占据着重要地位,可惜我还不是很熟悉,就先默认它是举足轻重的地位吧。BP算法,通常强调的是反向传播,本质上是一个优化函数,其实是一个双向算法,分两步走:(1)正向传播输入信息,实现分类功能;(2)反向传播误差,调整网络权值。
我们通过一个三层神经网络图来阐述BP算法如何运作的:




正向传播时,输入样本从输入层进入网络,经隐层逐层传递至输出层,如果输出层的实际输出与期望输出(导师信号)不同,则转至误差反向传播;如果输出层的实际输出与期望输出(导师信号)相同,结束学习算法。

反向传播时,将输出误差(期望输出与实际输出之差)按原通路反传计算,通过隐层反向,直至输入层,在反传过程中将误差分摊给各层的各个单元,获得各层各单元的误差信号,并将其作为修正各单元权值的根据。这一计算过程使用梯度下降法完成,在不停地调整各层神经元的权值和阈值后,使误差信号减小到最低限度。

权值和阈值不断调整的过程,就是网络的学习与训练过程,经过信号正向传播与误差反向传播,权值和阈值的调整反复进行,一直进行到预先设定的学习训练次数,或输出误差减小到允许的程度。 [1]

02




BP算法实战

接下来我们开始感性的认知BP算法,基于python先搭建一个小型的网络,在网络中,每个神经元都有自己的职责,比如,它维护着输入神经元的权值以及自身的偏置(bias)的更新、计算自己的输出等。利用一个字典来描述一个神经元与其他神经元连接的权值,“weights”是字典的“key”,具体权值是字典的“value”部分,value部分用一个列表实现,里面有不同的值,表示的是该神经元与其他多个神经元之间的连接。如果某一层中有多个神经元,则用多个这样的字典表示。然后将不同层追加叠放在一起,用一个更大的列表来存放它们。




Initialize_network()创建的小网络接受三个参数:输入神经元的数量(n_inputs)、隐含层神经元的个数(n_hidden),输出神经元的个数(n_outputs)
【运行结果】




输出的是各个层的权值,即神经元的存在性表示。初始化时指定了输入层的维度 。
网络构建好之后,就要进行训练数据的前向传播,即给定一个输入,计算一个输出。
神经元激活函数用来计算输入的加权和,包含两个子过程:(1)求出输入的加权和,激活神经元;(2)在传递函数的作用下输出。用两个函数来分别表示各个部分:




第5行代码中,weights[-1]表示倒数第一个权值,即偏置,它作为加权和的初始值。第6~7行,以weights*input的模式计算加权。
当神经元被激活后,它的输出取决于传递函数的特性,传递函数有很多种,如sigmoid、Tanh或ReLU等,这里选择传统的sigmoid,毕竟它比较简单。




下面,设计一个前向传播函数forward_propagate(),它把原始数据的每一行作为一个输入,然后计算一次输出。




【运行结果】




在计算出网络的正向输出后,接下来就该计算误差了,即预期输出和正向传播的实际输出之间的差值。这个差值作为网络权值调控的信号,反向传递给各个隐含层,让其按照预定的规则更新权值。
反向传播过程中要用到传递函数的导数,前面我们用sigmoid作为传递函数,现在对其求导:




然后,误差反向传播代码化:




通过直接给定一个预期的输出值expected,将它和输出层的实际输出相减,就计算出输出误差。再利用这些误差和激活函数的导数,计算出输出层纠偏的责任(responsibility)(第22行),这些输出层的责任,反向传播到隐含层进行加工处理(第7~15行)。

将前面正向输出的结果直接当作网络目前的一个状态,测试反向传播
【运行结果】



从输出结果可以看出,反向传播后,网络的权值并没有发生变化。因为为了简化网络的方向传播过程,还未添加权值更新的操作。

附上完整代码:

链接:https://pan.baidu.com/s/1YHGXwd0mn5CG5RCmtFqx4Q
提取码:0ouw

参考资料
1. 哈宗泉,喻晗编著.神经网络控制:西安电子科技大学出版社,2009.01
2. 张玉宏,深度学习之美[M],北京:电子工业出版社,2018.220-254.
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP