「机器学习」RBF神经网络
前言
之前做的项目尝试对一个对象的增益进行拟合,采用支持向量机回归的效果不太理想,进而打算用 RBF 神经网络来试试看效果。
网络介绍
RBF网络是人工神经网络的一种,它采用径向基函数作为激活函数。 网络的形式为三层:
输入层
隐藏层(RBF函数)
线性输出层
给定输入 $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网络能以任意精度近似任意连续函数
网络中需要确定的参数有:
权重$\alpha_i$
基函数中心$c_i$
基函数的方差$\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) |