徑向基函數(RBF)神經網絡
RBF網絡能夠逼近任意的非線性函數,可以處理系統內的難以解析的規律性,具有良好的泛化能力,並有很快的學習收斂速度,已成功應用於非線性函數逼近、時間序列分析、數據分類、模式識別、信息處理、圖像處理、系統建模、控制和故障診斷等。
簡單說明一下爲什麼RBF網絡學習收斂得比較快。當網絡的一個或多個可調參數(權值或閾值)對任何一個輸出都有影響時,這樣的網絡稱爲全局逼近網絡。由於對於每次輸入,網絡上的每一個權值都要調整,從而導致全局逼近網絡的學習速度很慢。BP網絡就是一個典型的例子。
如果對於輸入空間的某個局部區域只有少數幾個連接權值影響輸出,則該網絡稱爲局部逼近網絡。常見的局部逼近網絡有RBF網絡、小腦模型(CMAC)網絡、B樣條網絡等。
徑向基函數解決插值問題
完全內插法要求插值函數經過每個樣本點,即。樣本點總共有P個。
RBF的方法是要選擇P個基函數,每個基函數對應一個訓練數據,各基函數形式爲,由於距離是徑向同性的,因此稱爲徑向基函數。||X-Xp||表示差向量的模,或者叫2範數。
基於爲徑向基函數的插值函數爲:
輸入X是個m維的向量,樣本容量爲P,P>m。可以看到輸入數據點Xp是徑向基函數φp的中心。
隱藏層的作用是把向量從低維m映射到高維P,低維線性不可分的情況到高維就線性可分了。
將插值條件代入:
寫成向量的形式爲,顯然Φ是個規模這P對稱矩陣,且與X的維度無關,當Φ可逆時,有。
對於一大類函數,當輸入的X各不相同時,Φ就是可逆的。下面的幾個函數就屬於這“一大類”函數:
1)Gauss(高斯)函數
2)Reflected Sigmoidal(反常S型)函數
3)Inverse multiquadrics(擬多二次)函數
σ稱爲徑向基函數的擴展常數,它反應了函數圖像的寬度,σ越小,寬度越窄,函數越具有選擇性。
完全內插存在一些問題:
1)插值曲面必須經過所有樣本點,當樣本中包含噪聲時,神經網絡將擬合出一個錯誤的曲面,從而使泛化能力下降。
由於輸入樣本中包含噪聲,所以我們可以設計隱藏層大小爲K,K<P,從樣本中選取K個(假設不包含噪聲)作爲Φ函數的中心。
2)基函數個數等於訓練樣本數目,當訓練樣本數遠遠大於物理過程中固有的自由度時,問題就稱爲超定的,插值矩陣求逆時可能導致不穩定。
擬合函數F的重建問題滿足以下3個條件時,稱問題爲適定的:
- 解的存在性
- 解的唯一性
- 解的連續性
不適定問題大量存在,爲解決這個問題,就引入了正則化理論。
正則化理論
正則化的基本思想是通過加入一個含有解的先驗知識的約束來控制映射函數的光滑性,這樣相似的輸入就對應着相似的輸出。
尋找逼近函數F(x)通過最小化下面的目標函數來實現:
加式的第一項好理解,這是均方誤差,尋找最優的逼近函數,自然要使均方誤差最小。第二項是用來控制逼近函數光滑程度的,稱爲正則化項,λ是正則化參數,D是一個線性微分算子,代表了對F(x)的先驗知識。曲率過大(光滑度過低)的F(x)通常具有較大的||DF||值,因此將受到較大的懲罰。
直接給出(1)式的解:
權向量********************************(2)
G(X,Xp)稱爲Green函數,G稱爲Green矩陣。Green函數與算子D的形式有關,當D具有旋轉不變性和平移不變性時,。這類Green函數的一個重要例子是多元Gauss函數:
。
正則化RBF網絡
輸入樣本有P個時,隱藏層神經元數目爲P,且第p個神經元採用的變換函數爲G(X,Xp),它們相同的擴展常數σ。輸出層神經元直接把淨輸入作爲輸出。輸入層到隱藏層的權值全設爲1,隱藏層到輸出層的權值是需要訓練得到的:逐一輸入所有的樣本,計算隱藏層上所有的Green函數,根據(2)式計算權值。
廣義RBF網絡
Cover定理指出:將複雜的模式分類問題非線性地映射到高維空間將比投影到低維空間更可能線性可分。
廣義RBF網絡:從輸入層到隱藏層相當於是把低維空間的數據映射到高維空間,輸入層細胞個數爲樣本的維度,所以隱藏層細胞個數一定要比輸入層細胞個數多。從隱藏層到輸出層是對高維空間的數據進行線性分類的過程,可以採用單層感知器常用的那些學習規則,參見神經網絡基礎和感知器。
注意廣義RBF網絡只要求隱藏層神經元個數大於輸入層神經元個數,並沒有要求等於輸入樣本個數,實際上它比樣本數目要少得多。因爲在標準RBF網絡中,當樣本數目很大時,就需要很多基函數,權值矩陣就會很大,計算複雜且容易產生病態問題。另外廣RBF網與傳統RBF網相比,還有以下不同:
- 徑向基函數的中心不再限制在輸入數據點上,而由訓練算法確定。
- 各徑向基函數的擴展常數不再統一,而由訓練算法確定。
- 輸出函數的線性變換中包含閾值參數,用於補償基函數在樣本集上的平均值與目標值之間的差別。
因此廣義RBF網絡的設計包括:
結構設計--隱藏層含有幾個節點合適
參數設計--各基函數的數據中心及擴展常數、輸出節點的權值。
下面給出計算數據中心的兩種方法:
- 數據中心從樣本中選取。樣本密集的地方多采集一些。各基函數採用統一的偏擴展常數:
dmax是所選數據中心之間的最大距離,M是數據中心的個數。擴展常數這麼計算是爲了避免徑向基函數太尖或太平。 - 自組織選擇法,比如對樣本進行聚類、梯度訓練法、資源分配網絡等。各聚類中心確定以後,根據各中心之間的距離確定對應徑向基函數的擴展常數。
λ是重疊係數。
接下來求權值W時就不能再用了,因爲對於廣義RBF網絡,其行數大於列數,此時可以求Φ僞逆。
數據中心的監督學習算法
最一般的情況,RBF函數中心、擴展常數、輸出權值都應該採用監督學習算法進行訓練,經歷一個誤差修正學習的過程,與BP網絡的學習原理一樣。同樣採用梯度下降法,定義目標函數爲
ei爲輸入第i個樣本時的誤差信號。
上式的輸出函數中忽略了閾值。
爲使目標函數最小化,各參數的修正量應與其負梯度成正比,即
具體計算式爲
上述目標函數是所有訓練樣本引起的誤差總和,導出的參數修正公式是一種批處理式調整,即所有樣本輸入一輪後調整一次。目標函數也可以爲瞬時值形式,即當前輸入引起的誤差
此時參數的修正值爲:
下面我們就分別用本文最後提到的聚類的方法和數據中心的監督學習方法做一道練習題。
考慮Hermit多項式的逼近問題
訓練樣本這樣產生:樣本數P=100,xi且服從[-4,4]上的均勻分佈,樣本輸出爲F(xi)+ei,ei爲添加的噪聲,服從均值爲0,標準差爲0.1的正態分佈。
(1)用聚類方法求數據中心和擴展常數,輸出權值和閾值用僞逆法求解。隱藏節點數M=10,隱藏節點重疊係數λ=1,初始聚類中心取前10個訓練樣本。
%%
% 根據以下鏈接中的思想,把C++代碼改寫成M文件
% http://www.cnblogs.com/zhangchaoyang/articles/2591663.html
clear;clc;
P=101;%訓練樣本共P個
X=[]; %訓練輸入
Y=[]; %訓練輸出
M=10; %數據中心的個數(或說隱藏層的個數)
centers=[];%存儲數據中心(或說核函數的個數)
deltas=[]; %存儲核函數的標準差
weights=[];%存放網絡的權值(或說每個核的權值)
set = {}; %存放不同簇所包含的所有樣例
gap=0.1; %這是用k_means法進行聚類的時候的停止規則
%**************************************************************************
%構造訓練樣本X,Y
X=[-4:0.08:4];
for i=1:P
Y(i)=1.1*(1-X(i)+2*X(i)^2)*exp(-X(i)^2/2);
end
Y=Y+0.1*randn(1,P);
%%
%**************************************************************************
%對輸入進行聚類,(獲得核函數的中心)
for i=1:M
%因爲我們的X是均勻分佈,所以初始化也爲均勻的
centers(i)= X( i*floor( P/10 ) );
end
done=0;
while(~done)
for i=1:M
set{i}=[];
end
%計算P中每個點所屬的簇
for i=1:P
distance=100;%設置一個比較大的值
for j=1:M
curr=abs(X(i)-centers(j));
if curr<distance
sets=j;
distance=curr;
end
end
set{sets}=[set{sets},X(i)];%把新分類的樣例添到相應的簇中
end
%重新計算每個簇的質心
for i=1:M
new_centers(i)=sum(set{i})/length(set{i});
end
%根據各簇中心的更新情況決定是否已完成循環
done=0;
% abs(centers-new_centers)
for i=1:M
if abs(centers(i)-new_centers(i))>gap
done=0;
break;
else
done=1;
end
end
centers=new_centers;
end
%計算出每個高斯核函數的標準差(重疊係數=1)
for i=1:M
curr=abs( centers-centers(i) );
[curr_2,b]=min(curr);
curr(b)=100;
curr_2=min(curr);
deltas(i)=1*curr_2;
end
%**************************************************************************
%根據d=sum(K*W)
%首先構造K爲P×M的
for i=1:P
for j=1:M
curr=abs(X(i)-centers(j));
K(i,j)=exp( -curr^2/(2*deltas(j)^2) );
end
end
%計算權值矩陣
weights=inv(K'*K)*K'*Y';
%**************************************************************************
%測試計算出函數的情況
x_test=[-4:0.1:4];
for i=1:length(x_test)
sum=0;
for j=1:M
curr=weights(j)*exp(-abs(x_test(i)-centers(j))^2/(2*deltas(j)^2));
sum=sum+curr;
end
y_test(i)=sum;
end
figure(1)
scatter(X,Y,'k+');
hold on;
plot(x_test,y_test,'r.-')