纯手工 一.BP(Back Propagation)神经网络二.工作信号正向传递过程四个步骤: 三.误差信号反向传递过程五个步骤 四.一些概念的解释五.开始计算
一.BP(Back Propagation)神经网络
分为两个过程:
(1)工作信号正向传递过程
(2)误差信号反向传递过程
1.输入层的每个节点,都要与的隐藏层每个节点做点对点的计算,计算的方法是加权求和+激活
2.利用隐藏层计算出的每个值,再用相同的方法,和输出层进行计算。
3.隐藏层用都是用Sigmoid作激活函数
4.起初输入层的数值通过网络计算分别传播到隐藏层,再以相同的方式传播到输出层,最终的输出值和样本值作比较,计算出误差,这个过程叫前向传播(Forward Propagation)
BP算法是一种计算偏导数的有效方法,它的基本原理是:
1、利用前向传播最后输出的结果来计算误差的偏导数(前向传播后求偏导),
2、再用这个偏导数和前面的隐藏层进行加权求和
3、如此一层一层的向后传下去(隐藏层间偏导加权求和)
4、直到输入层(不计算输入层)(也就是第一隐藏层到输入层的偏导加权求和)
5、最后利用每个节点求出的偏导数来更新权重。
为了叙述方便,后面用“残差(error term)”这个词来表示误差的偏导数。
输出层→隐藏层: 残 差 = − ( 输 出 值 − 样 本 值 ) ∗ 激 活 函 数 的 导 数 残差 = -(输出值-样本值) *激活函数的导数 残差=−(输出值−样本值)∗激活函数的导数
隐藏层→隐藏层: 残 差 = ( 右 层 每 个 节 点 的 残 差 加 权 求 和 ) ∗ 激 活 函 数 的 导 数 残差 = (右层每个节点的残差加权求和)* 激活函数的导数 残差=(右层每个节点的残差加权求和)∗激活函数的导数
注意:本文我们采用的激活函数是Sigmoid,而Sigmoid函数的导数就为
S i g m o i d ∗ ( 1 − S i g m o i d ) Sigmoid*(1-Sigmoid) Sigmoid∗(1−Sigmoid)。
想了解更多,我这里放了一个链接 常用的激活函数
大家可以自行提取。
残差全部计算好后,就可以更新权重了:
输入层→隐藏层: 权 重 增 加 = 输 入 值 ∗ 右 层 对 应 节 点 的 残 差 ∗ 学 习 率 权重增加 = 输入值 * 右层对应节点的残差 * 学习率 权重增加=输入值∗右层对应节点的残差∗学习率
隐藏层→输出层: 权 重 增 加 = 当 前 节 点 的 S i g m o i d ∗ 右 层 对 应 节 点 的 残 差 ∗ 学 习 率 权重增加 = 当前节点的Sigmoid * 右层对应节点的残差 * 学习率 权重增加=当前节点的Sigmoid∗右层对应节点的残差∗学习率
注意,本篇文章我们并没有考虑偏移,但是这不影响我们的思路,如果加上偏移值,结果确实会更好一点。
偏 移 值 的 权 重 增 加 = 右 层 对 应 节 点 的 残 差 ∗ 学 习 率 偏移值的权重增加 = 右层对应节点的残差 * 学习率 偏移值的权重增加=右层对应节点的残差∗学习率
学习率是一个预先设置好的参数,用于控制每次更新的幅度。
此后,对全部数据都反复进行这样的计算,直到输出的误差达到一个很小的值为止。
以上介绍的是目前最常见的神经网络类型,称为前馈神经网络(FeedForward Neural Network),由于它一般是要向后传递误差的,所以也叫BP神经网络(Back Propagation Neural Network)。
首先我们给出一个表格, x x x分别代表2个输入值, y y y代表给定的输出值。
x 1 x_1 x1 x 2 x_2 x2 y y y0.8-0.70.5
这里的初始权重是用Python库中的random随机生成的。
至此,我们就完成了一次的学习,后续就是一次次往这个神经网络放进输入值和输出值,不断更新权重。经过足够多的次数后,我们就能得到想要的结果。