RBF神经网络学习及实践
RBF神經網絡
在學習RBF神經網絡之前,最好先了解徑向基函數的相關知識,參見徑向基函數(RBF)插值。
RBF神經網絡模型是1988年由Moody和Darken提出的一種神經網絡結構,屬于前向神經網絡類型,能夠以任意精度逼近任意連續(xù)函數,特別適合于解決分類問題。RBF網絡是一種三層前向網絡,第一層為由信號源節(jié)點組成的輸入層,第二層為隱層,隱單元數視問題需要而定,隱單元的變換函數為非負非線性的函數RBF(徑向基函數),第三層為輸出層,輸出層是對隱層神經元輸出的線性組合[1]^{[1]}[1]。網絡結構大致如下圖所示。
其中,輸入向量 xxx 的維度為 ppp , 隱層大小為 hhh(神經元/中心點數量),p<hp<hp<h 。隱含層的作用是把向量從低維度p映射到高維度h,這樣低維度線性不可分的情況到高維度就變得線性可分了,實際上是核函數的思想。這樣,網絡由輸入到輸出的映射是非線性的,而網絡輸出對可調參數而言卻又是線性的。網絡的權就可由線性方程組直接解出,從而大大加快學習速度并避免局部極小問題。
徑向基神經網絡的激活函數可表示為:
R(xp?ci)=exp?(?12σ2∥xp?ci∥2)R\left(x_p-c_i\right)=\exp \left(-\frac{1}{2 \sigma^2}\left\|x_p-c_i\right\|^2\right) R(xp??ci?)=exp(?2σ21?∥xp??ci?∥2)
根據徑向基神經網絡的結構,可得到網絡的輸出為:
yj=∑i=1hwijexp?(?12σ2∥xp?ci∥2)j=1,2,?,ny_j=\sum_{i=1}^h w_{i j} \exp \left(-\frac{1}{2 \sigma^2}\left\|x_p-c_i\right\|^2\right) j=1,2, \cdots, n yj?=i=1∑h?wij?exp(?2σ21?∥xp??ci?∥2)j=1,2,?,n
采用最小二乘的損失函數表示[2]^{[2]}[2] :
σ=1P∑jm∥dj?yjci∥2\sigma=\frac{1}{P} \sum_j^m\left\|d_j-y_j c_i\right\|^2 σ=P1?j∑m?∥dj??yj?ci?∥2
網絡學習方法
RBF神經網絡求解的參數有3個:
求解上述參數,目前有如下三種學習方法:
自組織選取中心學習法
第一步:無監(jiān)督學習過程,求解隱含層基函數的中心與方差
第二步:有監(jiān)督學習過程,求解隱含層到輸出層之間的權值
首先,選取h個中心做k-means聚類,對于高斯核函數的徑向基,方差由公式求解:
其中 cmaxcmaxcmax 為所選取中心點之間的最大距離。
隱含層至輸出層之間的神經元的連接權值可以用最小二乘法直接計算得到,即對損失函數求解關于 www 的偏導數,使其等于0,可以化簡得到計算公式為:
直接計算法
隱含層神經元的中心是隨機地在輸入樣本中選取,且中心固定。一旦中心固定下來,隱含層神經元的輸出便是已知的,這樣的神經網絡的連接權就可以通過求解線性方程組來確定。適用于樣本數據的分布具有明顯代表性。
通過訓練樣本集來獲得滿足監(jiān)督要求的網絡中心和其他權重參數,經歷一個誤差修正學習的過程,與BP網絡的學習原理一樣,同樣采用梯度下降法。因此RBF同樣可以被當作BP神經網絡的一種[2]^{[2]}[2]。
RBF神經網絡特點
-
局部逼近
RBF神經網絡的隱神經元采用輸入向量與中心向量的距離(如歐式距離)作為函數的自變量,并使用徑向基函數(如Gaussian函數)作為激活函數。神經元的輸入離徑向基函數中心越遠,神經元的激活程度就越低(高斯函數)。RBF網絡的輸出與部分調參數有關,譬如,一個wijw_{ij}wij?值只影響一個yiy_iyi?的輸出,RBF神經網絡因此具有**“局部逼近”**特性。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xDQSMt2R-1667612060100)(https://gitee.com/mstifiy/img-load/raw/master/noteImg/OIP-C.GLdM4EpbPJngYMAZ_LAiGgHaFe)]
所謂局部逼近是指目標函數的逼近僅僅根據查詢點附近的數據。而事實上,對于徑向基網絡,通常使用的是高斯徑向基函數,函數圖像是兩邊衰減且徑向對稱的,當選取的中心與查詢點(即輸入數據)很接近的時候才對輸入有真正的映射作用,若中心與查詢點很遠的時候,歐式距離太大的情況下,輸出的結果趨于0,所以真正起作用的點還是與查詢點很近的點,所以是局部逼近。
-
訓練速度快
使用RBF的訓練速度快,一方面是因為隱含層較少,另一方面,局部逼近可以簡化計算量。對于一個輸入x,只有部分神經元會有響應,其他的都近似為0,對應的w就不用調參了。
完全內插法及其不足
之所以RBF能夠擬合任意函數,可以從內插法的角度去理解。要擬合一個曲線,我們可以通過內插法獲得這個曲線的表達函數,譬如:多項式插值、拉格朗日插值等。RBF 插值是一系列精確插值方法的組合;即表面必須通過每一個測得的采樣值。
對于RBF插值,其特點即為,在輸入數據集中,與中心點距離近的點對映射函數的貢獻最大。
完全內插法即要求所有插值點都經過曲面,由于RBF內插對于每個x都有用到,所以是一種完全內插的形式,存在的問題就是當樣本中包含噪聲時,神經網絡將擬合出一個錯誤的曲面,從而使泛化能力下降。另外,若樣本x的數據遠大于非線性函數φ,該求解變得不穩(wěn)定,即為解超定方程。因此需要引入正則化方法,正則化的方法即通常加上正則化項。
兩類徑向基神經網絡
正則化網絡
性質:
? 正則化網絡是一個通用逼近器,意味著,只要有足夠多的隱含節(jié)點,它就可以以任意精度逼近任意多遠連續(xù)函數。
? 給定一個未知的非線性函數f,總可以選擇一組系數,使得網絡對f 的逼近是最優(yōu)的。
特點:
? 隱含節(jié)點的個數等于輸入訓練樣本的個數,因此如果訓練樣本的個數N過大,網絡的計算量將是驚人的,從而導致過低的效率甚至根本不可能實現。計算權值wij時,需要計算N×N矩陣的逆,其復雜度大約是O(N3),隨著N的增長,計算的復雜度迅速增大。
? 矩陣過大,病態(tài)矩陣的可能性越高。矩陣A的病態(tài)是指,求解線性方程組Ax = b時,A中數據的微小擾動會對結果產生很大影響。病態(tài)成都往往用矩陣條件數來衡量,條件數等于矩陣最大特征值與最小特征值的比值。
廣義網絡
區(qū)別于正則化網絡:正則化網絡隱含節(jié)點數I等于輸入訓練樣本的個數M,即是I=M。但廣義網絡隱含層I個節(jié)點個數小于M個輸入節(jié)點,I<M[4]^{[4]}[4]。
代碼實現
下文代碼中RBF神經網絡采用直接計算法進行學習。代碼框架參考文章[3]^{[3]}[3]。
import time from scipy.linalg import norm, pinv from matplotlib import pyplot as plt import numpy as npclass RBFN:def __init__(self, indim, numCenters, outdim):self.indim = indim # 輸入層維度self.outdim = outdim # 輸出層維度self.numCenters = numCenters # 中心(隱層神經元)數量self.centers = [np.random.uniform(-1, 1, indim) for i in range(numCenters)] # 初始化中心self.beta = 8 # 方差初始化self.W = np.random.random((self.numCenters, self.outdim)) # 初始化權值def _basisfunc(self, c, d): # 激活函數定義assert len(d) == self.indimreturn np.exp(-(norm(c - d) ** 2) / (2 * self.beta ** 2))def _calcAct(self, X): # 計算激活函數# calculate activations of RBFsG = np.zeros((X.shape[0], self.numCenters), float)for ci, c in enumerate(self.centers):for xi, x in enumerate(X):G[xi, ci] = self._basisfunc(c, x)return Gdef _calcbeta(self): # 找到選取中心點最大值——及求解σ的值bate_temp = np.zeros((self.numCenters, self.numCenters)) # 定義一個矩陣 隱藏層中心值確定的for iindex, ivalue in enumerate(self.centers):for jindex, jvalue in enumerate(self.centers):bate_temp[iindex, jindex] = norm(ivalue - jvalue) # 依次求解各中心層的值return np.max(bate_temp) / np.sqrt(2 * self.numCenters)def train(self, X, Y):""":param X: 樣本數*輸入變量數:param Y:樣本數*輸出變量數:return:無"""# choose random center vectors from training setrnd_idx = np.random.permutation(X.shape[0])[:self.numCenters]self.centers = [X[i, :] for i in rnd_idx]# print("center", self.centers)self.beta = self._calcbeta() # 根據樣本中心計算σ值# print(self.beta)# calculate activations of RBFsG = self._calcAct(X)# print(G)# calculate output weights (pseudoinverse)self.W = np.dot(pinv(G), Y) # 偽逆法直接計算得到權值def test(self, X):""" X: matrix of dimensions n x indim """G = self._calcAct(X)Y = np.dot(G, self.W)return Ydef gen_data(x1, x2):y_all = np.sin(np.pi * x2 / 2) + np.cos(np.pi * x2 / 3)y_sample = np.sin(np.pi * x1 / 2) + np.cos(np.pi * x1 / 3)# set y and add random noise# y_sample += np.random.normal(0, 0.1, y_sample.shape)return y_sample, y_allif __name__ == '__main__':num_sample = 30# 數據生成x1 = np.linspace(-10, 10, num_sample).reshape(-1, 1)x2 = np.linspace(-10, 10, (num_sample - 1) * 20 + 1).reshape(-1, 1)y_sample, y_all = gen_data(x1, x2)# Enable interactive mode.plt.ion()# Create a figure and a set of subplots.figure, ax = plt.subplots()# plot original dataplt.plot(x2, y_all, 'r:')plt.ylabel('y')plt.xlabel('x')# plot input samplesfor i in range(len(x1)):plt.plot(x1[i], y_sample[i], 'go', markerfacecolor = 'none')# return AxesImage object for using.pre_lines, = ax.plot([], [])pre_lines.set_color('k')center_points, = ax.plot([], [])center_points.set_color('gray')center_points.set_marker('s')ax.set_autoscaley_on(True)# ax.set_xlim(min_x, max_x)ax.grid()# plot learned model dynamicallyfor n_center in range(2, num_sample):# RBF神經網絡訓練預測rbf = RBFN(1, n_center, 1)rbf.train(x1, y_sample)y_rec = rbf.test(x2)# update x, y datapre_lines.set_xdata(x2)pre_lines.set_ydata(y_rec)plt.title('RBFN interpolation:$y=sin(\pi x/2)+cos(\pi x/3)$ with ' + str(n_center) + ' centers')# update centerscenter_points.set_xdata(rbf.centers)center_points.set_ydata(np.zeros(rbf.numCenters))# Need both of these in order to rescaleax.relim()ax.autoscale_view()# draw and flush the figure .figure.canvas.draw()figure.canvas.flush_events()time.sleep(1)plt.figure(1)代碼中,方差 σ\sigmaσ 計算公式如下:
σ=dmax?2n\sigma=\frac{d_{\max }}{\sqrt{2 n}} σ=2n?dmax??
這里 dmax?\mathrmze8trgl8bvbq_{\max }dmax? 是選取中心的之間的最大距離。 n\mathrm{n}n 為隱函數節(jié)點的個數。防止徑向基函數出現過尖或過平的情況。
對于隱層神經元的選取,代碼中通過迭代尋找最優(yōu)隱函數節(jié)點個數。
上圖中,綠色空心圓點為輸入的訓練樣本,紅色虛線為實際值,黑色曲線為RBF神經網絡預測結果,其中x軸上的灰色方點為中心點。
參考
[1] 一文帶你了解RBF神經網絡
[2] RBF(徑向基)神經網絡
[3] python編寫自己的RBF徑向基神經網絡
[4] 所有神經網絡的特點及優(yōu)缺點分析總結
總結
以上是生活随笔為你收集整理的RBF神经网络学习及实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ML之FE:利用【数据分析+数据处理】算
- 下一篇: 揭秘鲜为人知的酒店管理“黑洞”