少女祈祷中...

算我后知后觉,神经网络的BP算法原来是这么简单的东西。它是用梯度递降法来减小输出平方误差的方法。多隐藏层可以学习任意连续的映射直到任意精度,但通常一个隐藏层就足够了。它使用的激活函数必须满足以下几个条件:连续,可微,单调非减,有渐进的最小最大值,函数还要相对容易计算。比如 \frac{1}{1+\exp(-x)} 等。

算法描述

  1. 输入层输出层权重均赋值为小随机数例如unif(-0.5,0.5)。
  2. 当停止条件为false时,执行3-10
  3. 对每对训练数据x:t执行4-9
  4. 每个输入层给数据到隐藏层,也就是发出一个输入向量x
  5. 输入向量x和输入权重向量v作内积,得到的向量z_in被激活函数f映射到隐藏层上,隐藏层广播该隐藏层向量z
  6. 该向量和输入权重向量w作内积,得到的向量y_in被激活函数映射输出,得到结果向量y
  7. 计算输出权重向量w的改变向量delta_y为学习速率alpha,绝对误差(t-y),f'(y_in)还有z的乘积。(以向量的component来看)
  8. 计算输入权重向量v的改变向量delta_z等于学习速率alpha,w与delta_y的内积,f'(z_in),还有x的乘积。
  9. 修正w与v
  10. 检验停止条件

初始权重的选择

这会影响到收敛速度,更甚会导致收敛以致误差是局部最小值而不是全局最小值。初始权重要很小,以免求导得到的值几乎为零。另一方面,权重太小,输出值会很小,也会导致学习速度很慢。

    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方法。但是不能保证这种方法一定会起作用。

: http://www.deuxmille.org/archives/1598

本文相关评论 - 仅仅只有一条评论
Richie
2010-08-18 09:45:50

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

  • :em14:
  • :em04:
  • :em11:
  • :em32:
  • :em08:
  • :em05:
  • :em17:
  • :em19:
  • :em24:
  • :em00:
  • :em31:
  • :em33:
  • :em06:
  • :em26:
  • :em27:
  • :em03:
  • :em28:
  • :em30:
  • :em13:
  • :em23:
  • :em21:
  • :em16:
  • :em20:
  • :em15:
  • :em07:
  • :em29:
  • :em02:
  • :em12:
  • :em18:
  • :em10:
  • :em01:
  • :em09:
  • :em22:
  • :em25:

Additional comments powered by BackType