算我后知后觉,神经网络的BP算法原来是这么简单的东西。它是用梯度递降法来减小输出平方误差的方法。多隐藏层可以学习任意连续的映射直到任意精度,但通常一个隐藏层就足够了。它使用的激活函数必须满足以下几个条件:连续,可微,单调非减,有渐进的最小最大值,函数还要相对容易计算。比如
等。
算法描述
- 输入层输出层权重均赋值为小随机数例如unif(-0.5,0.5)。
- 当停止条件为false时,执行3-10
- 对每对训练数据x:t执行4-9
- 每个输入层给数据到隐藏层,也就是发出一个输入向量x
- 输入向量x和输入权重向量v作内积,得到的向量z_in被激活函数f映射到隐藏层上,隐藏层广播该隐藏层向量z
- 该向量和输入权重向量w作内积,得到的向量y_in被激活函数映射输出,得到结果向量y
- 计算输出权重向量w的改变向量delta_y为学习速率alpha,绝对误差(t-y),f'(y_in)还有z的乘积。(以向量的component来看)
- 计算输入权重向量v的改变向量delta_z等于学习速率alpha,w与delta_y的内积,f'(z_in),还有x的乘积。
- 修正w与v
- 检验停止条件
初始权重的选择
这会影响到收敛速度,更甚会导致收敛以致误差是局部最小值而不是全局最小值。初始权重要很小,以免求导得到的值几乎为零。另一方面,权重太小,输出值会很小,也会导致学习速度很慢。
Nguyen_Widrow方法
以输入权重向量为例,随机赋值后,不看biais的权重,使用欧式范数归一化,然后乘以0.7*隐藏层元数的输入层元数分之一次方,biais的权重取正负以上乘积之间的一个随机实数。注意此方法使用tanh(x)作为激活函数。
何时停止
Hecht-Nielsen(1990)建议
数据对分为两个部分,一部分用来训练,一部分用算误差来测试停止。如果误差递减就继续,如果误差增加了,则停止。
需要多少训练对
Baum-Haussler(1989)
假设一共有W个权重,为了使得(1-e)这个比例的同样本空间的结果正确,需要使用W/e对训练数据对得到(1-e/2)的正确率。
修改版BP算法
带动量的BP算法
权重的更改不是用朝着梯度的方向改,而是朝着现梯度和前梯度的方向张成的平面上的一个方向来改,具体的就是在老方法中权重改变量的基础上加上mu乘以上次的改变量。mu的取值是0到1的随机数,不取0和1。带动量的Momentum的BP算法可以避免错误的数据对的影响。如果训练数据对有小部分和其他的很不一样,需要使用小的学习速率,而训练数据对如果相对相似,快速的训练也是可以的。
广义学习速率
每个权值有自己的学习速率alpha,而且学习速率会随着时间改变。简单说来就是,如果改对了方向,学习速率就变大,改错了方向,学习速率就变小。比如Delta-Bar-Delta方法。但是不能保证这种方法一定会起作用。
Additional comments powered by BackType

我上大学的时候用BP算法做过神经网络应用于机械故障诊断..呵呵..6年之前的事情了..看了你的文章,又似乎有点记忆了.