老饼讲解:一步一步上手学习
RBF神经网络(Radial Basis Function Neural Network)起源于RBF插值,它是一种以RBF函数作为激活函数的神经网络,一般可以用来解决任意的数值拟合问题,这节我们就一起来看看RBF神经网络是个什么东西,并看看在matlab如何实现一个RBF神经网络,用来解决数值拟合问题。
由于RBF神经网络就是基于RBF函数的一种神经网络,所以我们先来看看RBF函数,再来说RBF神经网络。
RBF函数,也就是径向基函数(Radial Basis Function),它是一种形态为钟形的函数,如下:

我们也不讲RBF函数的具体定义是什么了,大家应该都能get到它的特点,就是像一个古钟一样。
好了,最常见的RBF函数就是高斯函数,如下:
其中,当都取为0时,,此时它以0为中心,可以认为它是标准形态的RBF,进一步地,加入参数后,则是对标准形态进行平移和拉伸。
当x为多维时,高斯函数则进一步表示为:
其中,代表向量的二范数,也就是所有元素的平方和再开根号
知道了RBF函数,我们就可以开始了解RBF神经网络了。
我们以"2个输入、3个RBF、1个输出"的RBF神经网络为例,RBF神经网络的拓扑结构如下:

如图所示,RBF神经网络由输入层、RBF层(隐层)和输出层构成,所以它是一个三层的神经网络。
我们先来看它外层的结构,也就是输出层与RBF层的关系,如下:
也就是说,输出y就是各个RBF之和,然后再加上一个阈值。其中,代表第i个输出与第j个RBF的连接权重,代表第i个输出的阈值,总的来说,RBF神经网络,其实就是由一堆RBF函数组成的模型。
进一步地,各个就是输入层到RBF层的运算了,也就是把输入映射为一个一个的RBF。

好了,那各个RBF具体又是什么呢?使用不同的RBF函数,就会有不同的表示,但一般来说,我们都是使用高斯函数来作为RBF函数,也就是:
其中,代表输入层与第i个RBF的权重,实际它代表了第i个RBF的中心
代表输入层与第i个RBF的阈值,实际它代表了第i个RBF的宽度
好了,我们直接拉点数据出来,说说RBF神经网络是怎么计算的吧,这样就具体多了。
以2个输入,3个隐节点,2个输出的RBF神经网络为例,设模型的权重、阈值如下:
1. 隐层的权重、阈值为:
备注:的第i行代表第i个隐节点(RBF)的权重和阈值。
2. 输出层的权重、阈值为:
备注:的第i行代表第i个输出节点的权重和阈值
假设模型的输入为,则RBF神经网络的输出如下计算:
Step-1. 计算隐层激活值(也就是径向基的值):
Step-2.计算输出值
仔细看一遍上面的计算过程,就可以非常具体的了解RBF神经网络的结构细节了~
RBF神经网络一般有三种训练方法:
1. 插值法 :matlab的工具箱中的newrbe函数
2. OLS法 :matlab的工具箱中的newrb函数
3. K-means聚类法 :matlab不提供该方法
下面我们来说说这三种方法分别是什么。
插值法是训练RBF神经网络的一种最基础的方法,它会以每个样本为中心,各自生成一个RBF,然后再求解最外层的参数,从而使模型的输出与样本的真实y完全一致。
在matlab的工具箱中,可以通过newrbe函数,就会使用插值法来构建一个RBF神经网络。
插值法虽然能够让模型的输出与真实y完全一致,但它为每个样本都生成一个RBF,这使得模型非常庞大,而且容易过拟合,而OLS法则是在插值法的基础上,逐个添加RBF,直到模型误差小于目标值。

在matlab的工具箱中,可以通过newrb函数,就会使用插值法来构建一个RBF神经网络。
kmeans法是指,先用kmeans对样本聚类,再以聚类中心来生成RBF,进一步求解最外层的参数。在matlab的RBF神经网络工具箱中不提供kmeans法。
三种方法中,一般都使用OLS法,它使用较少的隐节点的同时,又能保证训练精度。
好了,下面我们就使用matlab的newrb函数,实现一个RBF神经网络拟合样本数据。
具体代码实现如下:
% 本代码用于展示如何用matlab构建一个RBF神经网络
% 本代码来自《老饼讲解-神经网络》www.bbblearn.com ,matlab版本:2018a
close all
x = [-2 -1 0 1 2]; % 输入数据
y = [3 2 3 1 2]; % 输出数据
[net,tr] = newrb(x, y, 0.01, 0.5); % 用X,y构建RBF神经网络,目标误差0.01,宽度参数0.5
simY = sim(net,x) % 用建好的网络拟合原始数据
perf = tr.perf % 误差下降记录
t = -2:0.1:2; % 生成拟合曲线的x
simt = sim(net,t); % 拟合曲线的y
plot(x,y,'*',t,simt ,'r') % 画出拟合曲线可以看到,在代码中我们使用了newrb来构建RBF神经网络,也就是使用OLS法,所以它会逐个添加隐节点来构建RBF神经网络,直到最后的误差满足我们的要求。
代码运行结果如下:

从拟合曲线图可以看到,训练的RBF神经网络基本能拟合我们的训练样本。

perf展示了逐个添加隐节点时,模型误差的下降情况,也就是没有任何隐节点时,模型误差为0.56,添加了一个隐节点后,误差为0.4255,由于我们设置的目标误差为0.01,所以它会继续添加下去,直到添加了4个隐节点,最后误差为0。
总的来说,RBF神经网络就是一种以RBF作为隐层节点的三层神经网络,训练方法主要有插值法、OLS法、kmeans法,但一般都使用OLS法,它在保障满足误差精度的前提下,使用尽量少的隐节点来构建模型,划算极了。
评论