现在很多人都说,做it门槛很低,脑子灵活点,愿意去熬的,培训个几个月就可以,无非是调调函数而已。
确实,现在一些程序员的工作,调调函数掌握得好的话,也是能够胜任的。但是,想要更进一步,还得不断提升自己,努力理解各种算法结构。
(类)神经网络算法在深度学习等领域应用十分广泛。
而负反馈BP神经网络其中应用最多的一种,很多神经网络的算法都是在BP神经网络上进行优化的。所以,理解一下BP神经网络是很有必要的。
关于神经网络的知识请自行谷歌。
BP(Back Propagation)神经网络分为两个过程
(1)工作信号正向传递过程
(2)误差信号反向传递过程
四个步骤:
两个步骤
为了便于理解,后面一律用“残差(error term)”这个词来表示误差的偏导数。
输出层→隐藏层:残差 = -(输出值-样本值) * 激活函数的导数
隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 激活函数的导数
如果用Sigmoid(logsig)作激活函数,那么:Sigmoid导数 = Sigmoid*(1-Sigmoid)
输出层→隐藏层:残差 = -(Sigmoid输出值-样本值) * Sigmoid*(1-Sigmoid) = -(输出值-样本值)输出值(1-输出值)
隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)* 当前节点的Sigmoid*(1-当前节点的Sigmoid)
残差全部计算好后,就可以更新权重了:
输入层:权重增加 = 输入值 * 右层对应节点的残差 * 学习率
隐藏层:权重增加 = 当前节点的Sigmoid * 右层对应节点的残差 * 学习率
偏移值的权重增加 = 右层对应节点的残差 * 学习率
学习率是一个预先设置好的参数,用于控制每次更新的幅度。
此后,对全部数据都反复进行这样的计算,直到输出的误差达到一个很小的值为止。
以上介绍的是目前最常见的神经网络类型,称为前馈神经网络(FeedForward Neural Network),由于它一般是要向后传递误差的,所以也叫BP神经网络(Back Propagation Neural Network)。
文字的公式看上去有点绕,下面是一个详细的计算过程(非机器封包直接计算):
问题描述中,x1、x2 是神经网络的两个输入值,而y就是实际输出值
初始权重(层与层之间边的值),是一个(-1,1) 的随机数
可以通过Python 的random库获取
import random
print random.random()
print random.random()
print random.random()
print random.random()
print random.random()
print random.random()
#结果
0.543717672492
0.0976781735159
0.373970033901
0.596229996543
0.741053525016
0.0915456485905
[Finished in 0.2s]
#这里的计算还是借助工具比较好
import math
print 1.0/(1+math.e**(-0.5))
print 1.0/(1+math.e**(-0.14))
#结果
0.622459331202
0.534942945158
[Finished in 0.2s]
至此,完成了一次的“学习”(也就是梯度下降)
后续就是一次次 往这个神经网络放进输入值和输出值,不断更新权重。
足够的学习次数之后,就是最终的结果。
有兴趣可以动手试试。