前言

之前做的项目尝试对一个对象的增益进行拟合,采用支持向量机回归的效果不太理想,进而打算用 RBF 神经网络来试试看效果。

网络介绍

RBF网络是人工神经网络的一种,它采用径向基函数作为激活函数。 网络的形式为三层:

  1. 输入层

  2. 隐藏层(RBF函数)

  3. 线性输出层

给定输入 $x\in \mathbb{R}^n$,网络的输出为

$$ \phi(x)=\sum_{1}^N \alpha_i \rho (||x-c_i||) $$ 其中 $N$ 为隐藏层神经元的个数,$c_i$ 为第$i$个神经元的中心向量,$\alpha_i$为第$i$个神经元对线性输出层的权重。径向基函数通常采用高斯函数形式,即

$$ \rho (||x-c_i||) = exp[-\beta_i ||x-c_i||^2] $$

含有足够多的隐藏层神经元的RBF网络能以任意精度近似任意连续函数

网络中需要确定的参数有:

  1. 权重$\alpha_i$

  2. 基函数中心$c_i$

  3. 基函数的方差$\beta_i$

训练

RBF网络的训练通常采用两步法:

step 1:选择中心向量$c_i$,几种常见的做法like:随机从样本中抽取,k均值聚类。

step 2:训练权重系数,比如最小化预测值的MSE,也可以加入正则化项来确保光滑性。

应用

内插

RBF网络可以用来内插函数,给定$N$个样本,每一个训练样本都作为一个径向基和中心,计算核矩阵$K_{N,N}$,则有$KW=Y$,权重向量可以直接矩阵求逆得到。

函数近似

RBF的宽度可以固定为某个常数(正比于所选中心的最大距离)。

当中心固定后,RBF网络具有显示的解析解,伪逆:$W=G^+Y$

梯度下降训练权重

这几个概念需要理清楚:

  • 导数(单变量函数)
  • 偏导数(多变量函数)
  • 导数方向(任意方向的导数)
  • 梯度(变化最大方向的导数方向)

MATLAB仿真

下面根据上述算法进行RBF神经网络的训练

首先生成数据,$x$为输入,$y$为目标值,也就是要训练$y=f(x)$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
% generate data from Logistic map
% x(t+1) = 4x(t)(1-x(t))
z = zeros(201,1);
x = zeros(200,1);
y = zeros(200,1);
z(1) = 0.1;
for t = 2:201
    z(t) = 4*z(t-1)*(1-z(t-1)); 
end
y = z(2:201);
x = z(1:200);

假设神经元的个数、方差和基向量事先定好

1
2
3
N = 7; % the number of neuron
beta = 5; % predefine the variance of RBF function
c = x(1:30:181); % random select the centers

定义RBF函数和梯度向量

1
2
3
4
5
6
rbfoutput = @(x,a,c) a(1)*exp(-5*(x-c(1)).^2)+a(2)*exp(-5*(x-c(2)).^2)+...
    a(3)*exp(-5*(x-c(3)).^2)+a(4)*exp(-5*(x-c(4)).^2)+a(5)*exp(-5*(x-c(5)).^2)...
    +a(6)*exp(-5*(x-c(6)).^2)+a(7)*exp(-5*(x-c(7)).^2);
rbf_grad = @(x,c) [exp(-5*(x-c(1)).^2);exp(-5*(x-c(2)).^2);exp(-5*(x-c(3)).^2);...
    exp(-5*(x-c(4)).^2);exp(-5*(x-c(5)).^2);exp(-5*(x-c(6)).^2);...
    exp(-5*(x-c(7)).^2)];

采用随机梯度下降进行线性权重的寻优,即每次从样本中随机挑选一个样本进行训练

1
2
3
4
5
a = 0.01*ones(N,1);
for i = 1:10000000
    t = unidrnd(200);
    a = a - 0.01 * (rbfoutput(x(t),a,c)-y(t))* rbf_grad(x(t),c);
end

作图比较实际数据和RBF神经网络的预测输出

1
2
3
4
5
6
7
8
figure
scatter(x,y,'o');
hold on
x_test = (0:0.01:1);
scatter(x_test,rbfoutput(x_test,a,c),'*')
legend('true function','approximation')
xlabel('x(t)')
ylabel('x(t+1)')

newrb函数的使用

MATLAB也自带了RBF神经网络函数,不过它采用的隐藏层略微不同,方差多了个平方同时输出层多了个偏置项。

$$ \phi(x)=\sum_{1}^N \alpha_i \rho (||x-c_i||) + bias $$

$$ \rho (||x-c_i||) = exp[-(\beta_i ||x-c_i||^2)^2] $$

训练则很简单了

1
net = newrb(x',y',error,spread,MN,DF)

其中$x,y$为训练数据,一列为一个样本;error为期望的误差,spread为径向基函数的扩展速度,它决定了基函数围绕中心点的宽度(The larger spread is, the smoother the function approximation)其实就是控制方差,MN为神经元的最大个数,DF为两次显示之间所添加的神经元数目,默认值为25。

训练结束后进行预测直接

1
y_test=sim(net,x_test)