编程实现单层RBF神经网络,并在异或数据集上进行了实验。
相关源代码托管于Github:PnYuan/Machine-Learning_ZhouZhihua,欢迎访问.
题目
注:本题程序基于Python实现(这里查看完整代码和数据集)。
RBF网络基础知识回顾
RBF网络采用RBF(Radial Basis Function函数)作为隐层神经元激活函数,是一种局部逼近神经网络,下面先分析其激活函数RBF,然后分析RBF神经网络的结构。
径向基函数(RBF)
径向基函数是一类取值依赖样本于到中心点距离的函数,本题基于常用的高斯径向基函数(gaussian RBF)开展实验。下面是高斯径向基函数形式书p108式(5.19):
这里的 β 为尺度系数, c_i 为中心点(维度由输入决定),函数的取值取决于样本 x 到中心点的距离(2-范数),该函数的参数为 (β, c_i)。
如下图示为高斯径向基函数示意图(绘图程序):
RBF网络
RBF神经网络一般指一种单隐层前馈神经网络,它使用径向基函数作为隐层神经元激活函数,而输出是隐层输出的线性组合,网络结构示意如下:
参考书p108式(5.18),该神经网络的输出为:
进一步分析,一般函数均可表示成一组基函数的线性组合,而RBF网络相当于用隐层神经元构建了这样一组基函数,由输出层进行线性组合,从而实现函数逼近的功能。
RBF网络实现
这里RBF神经网络建模的过程分一下两步:
- 确定神经元对应的高斯径向基函数中心 c ;
- 利用BP算法来训练剩余参数 w, β ;
下面依次讨论其实现:
RBF中心参数获取
RBF的中心参数 c 的获取方法有以下一些:
- 从输入数据样本中抽取,这就要求输入样本具有较好的代表性;
- 自组织生成,如聚类法生成,采用聚类中心来作为中心参数 c ,同时根据各中心的距离来初始化尺度系数 β ;
RBF-BP算法推导
参考神经网络基础 - 编程实现标准BP算法,这里隐层激活函数为RBF,输出层神经元数为 1 ,激活函数为 y=f(x)=x 。
BP算法采用梯度下降法进行参数迭代更新,参考书p102-103,进行RBF-BP算法中基于梯度下降的参数更新推导如下:
在完成基础推导之后,给出RBF网络的BP算法如下所示:
RBF-BP算法实现
样例代码如下:
1 | def BackPropagateRBF(self, x, y): |
异或问题实验
准备数据
首先基于numpy.array生成异或数据,该数据为2输入,1输出,如下所示:
样例代码:
1 | # train set |
样例数据:
>>> X_trn
array([[0, 0],
[1, 1],
...
>>> y_trn
array([False, False, ...
参数之-RBF中心点
这里由于采用异或数据,其中心点可以简单设置如下:
centers = np.array([[0,0],[0,1],[1,0],[1,1]])
同时取隐节点数目为4。
生成模型并训练
样例代码如下:
1 | # construct the network |
绘制出训练过程中的均方误差变化曲线如下图:
由上图可以看到,曲线收敛十分迅速,说明这里的RBF网络训练异或数据集十分轻松,这也和我们所生成的数据的完备无误有关。
测试模型
按照训练集数据生成方法生成测试集数据,通过模型预测,得出结果如下:
test error rate: 0.000
即测试错误率为0,可知我们的模型预测十分准确的,泛化性能优秀(主要得益于XOR预测模型对RBF网络来说太过简单)。
本题小结
回顾RBF网络工作原理,如参考书p108式(5.18)-(5.19)。RBF网络建模类似于非线性模型中的基函数建模,进一步,我们可将其与广义可加模型联系起来。RBF网络采用径向基函数作为单隐层激活函数(即核函数),又可将其与SVM with RBF kernel联系起来。
回顾RBF网络实现过程,我们或可将该方法视为一种半监督的学习方法,具体有:
- step 1:无监督的学习,从数据中获取中心参数,常用聚类方法;
- step 2:有监督的学习,基于数据训练参数,过程一般基于BP算法实现;
相关参考
下面列出一些参考内容: