本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com
本文是笔者细扒matlab的newrb函数后,
总结得到的径向基神经网络(newrb)算法流程,所述的,即newrb的内部原理。
本文只讲解newrb的算法流程和实现细节,
对newrb的代码复现在《径向基-自实现代码》中(本文就是该代码的解释)。
matlab中newrb使用的是OLS算法,OLS算法的原理推导详见《OLS正交最小二乘算法》。
告读者
本文写得不够清晰,明朗,暂时无能力用文字表达清晰,
当聊胜于无,仅作为读者阅读《径向基-自实现代码》时的辅助文章,不建议直接阅读本文。
径向基的核心目的就是优化精确径向基隐节点过多的问题。
OLS算法
OLS算法就很好的解决这个问题,
径向基在所有样本生成的隐神经元中,挑出尽量少的隐神经元来满足目标误差。
OLS逐个贪婪式添加隐节点.
每次在剩余的神经元中,找出能令误差最大下降的神经元添加进来,
直到满足目标误差,则停止添加。
符号说明
W21:输入层到隐层的权重。
B2:隐层的阈值。
W32:隐层到输出层的权重。
B3:输出层的阈值。
主流程
1、W21、B2的初始化
2、计算所有样本生成的待选隐节点激活值。
3、从待选隐节点中,选择一个使误差下降最大的隐节点,添加到网络(即添加到W21)。
4、计算网络的训练误差,如果小于目标误差,或所有隐节点已被选择,则终止隐节点选择,否则重复3.
5、将已选隐节点的激活值与输出y进行最小二乘法,求得W32和B3。
6、输出网络的参数W21,B2,W32,B3和最终网络训练误差。
1、B2、W21的初始化
B2的生成
B2由spread生成,B2是径向基肥瘦的控制参数,
如果直接设置B2比较盲目,一般由spread参数来确定。
它的意义是,当数据与径向基的中心距离为spread时,径向基的值为0.5
(径向基最大值为1,也即是径向基最大值的一半)
W21的初始化
W21先初始化为空,后面逐步往网络添加隐节点的同时,也就是往W21添加行。
2、计算待选隐节点的激活值
用所有训练样本生成的径向基生成待选隐节点,待选隐节点的激活值矩阵用A表示。
代表第i个样本的第j个隐节点的激活值。
备注:A的每j列记录了所有训练样本在第j个隐神经元的值。
3、从待选隐节点中逐个添加隐节点
隐节点的添加使用的是OLS算法,它的算法具体执行流程与步骤查看本文第四部分《OLS法添加隐节点》
4 、计算W32,B3
将挑出的隐节点用最小二乘法计算出令预测误差最小的W32,B3。
即求的最小二乘解 ,
其中 为A中选择的隐神经元的组成的子集。
可由求解公式解得:
5、输出结果
输出 模型的权重和阈值:W21,B2,W32,B3
符号说明
已选列池S(select):从A中选出的列子集,用于拟合y
待选列池R(rest):所有未被选入的列的集合
单位正交待选列池sR( standar Rest):由待选列池所有列,对已选列池中所有列进行正交,并单位化后得到
流 程
(1) 初始化已选列池,待选列池,单位正交待选列池
已选列池:初始化为空,
待选列池:初始化为A,
单位正交待选列池:将待选列池各列单位化,作为单位正交待选列池的初始化
(2) 计算待选列的误差下降量
通过公式,计算单位正交待选列池各列的误差下降量,
选择a列带来的误差下降量 如下计算:
y为单列时:
y为多列时可以参考使用
(3) 选择使误差下降最大的列
获取本次选择的列:
通过比较各列的 ,得到使误差下降最大的列,假设为k,
更新待选列池R、已选列池S:
将待选列池的第k列移到已选列池。
更新单位正交待选列池sR:
理论上将sR的第k列移除,将sR各列与正交化后的S进行正交化,但事实不必如此。
由于之前sR已经与未加入新列的S正交化了,因此,只需将sR对新列正交化即可。
实际操作:将sR各列(第k列除外)对第k列进行正交化,并单位化,然后移除第k列。
用向量a生成与向量b的正交量d的公式: (即a减去a在b的投影向量)
(4) 检查是否满足终止条件,否则继续步骤(2)、(3)
终止条件如下:
(1) 计算S的最小二乘误差,如果小于目标误差,则终止。
(2) 待选列池为空,则终止。
End