本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com
我们都知道BP神经网络初始化的重要性,
但是我们写自己的BP神经网络代码时往往都没有对权值阈值初始化方法进行深入设计,这就严重影响了我们神经网络的效果。
笔者通过阅读matlab工具箱源码,发现matlab工具箱在权重阈值的初始化上采用的是《nguyen_Widrow法》。
本文结合matlab的源代码与《nguyen_Widrow法》原文整理出初始化的原理和思路。
通过本文,可以学习和理解BP神经网络初始化的原理,是之后我们复现工具箱源代码的基础。
对于神经元的初始化,以单输入网络为例,我们希望网络初始化成以下的形式:
可以看到,我们的目的就是让各个隐节点均匀分布在输入数据的范围。
这样的初始化的好处有两点
(1) 每个神经元都充分被利用
(2) 输入域(即x轴)处处都被神经元的非线性区间覆盖到
下面我们推导出这种初始化方法的具体数学表达。
w 的取值
每个tansig需要覆盖的长度:2/hn
设数据的范围在[-1,1]之间(长度为2),
则每个隐节点非线性部分需要覆盖的长度为:
2/hn
(hn指隐节点个数)
tansig(wx+b) 非线性部分的长度:2/w
设tansig(x)的非线性区间为[-1,1],
tansig(x)的非线性区间长度为2,
则tansig(wx+b)的非线性区间长度就为2/w,
w的取值
要求 tansig(wx+b) 非线性部分 覆盖住 2/hn,
则有:
2/W = 2/hn
可得:
w =hn
如果需要让每个区间有部分重叠,可以适当放宽非线性部分的长度,
例如 w = 0.7hn
b 的取值
b 的作用就是使每个隐节点均匀地落在输入域。
每个tansig需要落在的中心点:输入范围线性均匀分布。
线性生成每个隐节点的中心
例如
现在有5个隐节点,那么在输入域[-1,1]之间线性生成中心:
c1=-1,c2=-0.5,c3=0,c4=0.5,c5=1.
将tansig平移到各个中心点:b= -wc 。(c是要平移到的中心点)
将第i个隐节点移到第i个中心点。
如下表示:
tansig(w(x-c)) = tansig(wx-wc)
可得
b = -wc
下面我们仍然按此思路,扩展到多输入。
输入为多维时,要比一维更复杂一些些
例如二维
我们可以看到,它实际上每个区域都有自己的特性,我们需要每个区域都照顾到位。
(一) 多输入网络的参数意义
用二维举例
WX+b就是 的中心线,
|W| 控制了 的宽度,
W的方向控制了的方向 ,
则是原点到中心线的距离,即控制了垂直于W方向的平移距离。
(二) W的初始化
1. 每个tansig需要覆盖的长度:
我们企图 把各个tansig分布到 输入区域划分成的 个网格中去(N为输入的维度),
每维划分的网格个数 取决于我们有多少个隐神经元,
即网格个数等于隐神经元个数:
(即 )
由于每个变量范围在 [-1,1] (长为2),
则算得每个网格长为
即每个tansig需要覆盖的范围为
2. tansig 的有效范围
设 tansig(x)的非线性区间为 [-1,1],
的有效范围,即 -1< WX+b < 1,
用二维的情况来看,即 与 两平面间的距离
3. W的取值
要求tansig的覆盖范围满足要求,则有:
即
为了让区间之间有一定重叠,加以一个系数,例如0.7
4. 随机化方向的单位W: (W为随机数)
W的方向确定了tansig的方向 ,
这里,我们随机化方向,并将它归一化。
假设有3个输入 ,则生成方法如下:
(1)随机生成 W = [w1,w2,w3]
(2)将 W 归一化:
这样,就生成了方向随机的单位W。
5. 总的W
即(4)中生成的随机化方向的单位W,乘以(3)中确定的宽度:
这里的W是随机数
这里的公式有些不严谨,请结合之前的讨论理解
(三)b的初始化
在确定了W之后,b则确定了平移距离,
由于每个输入的范围是 [-1, 1] ,则对 hn个隐节点,我们平移距离 d 均匀分布在 [-1,1]之间,
例如,hn=5,则
由 ,可得,
理论暂且分析到这里。想真正了解每一个步骤,还是需要读代码,
《梯度下降法求解BP-代码》里有初始化权值阈值的代码,想掌握得更具体的同学请耐心阅读代码。
End