深度学习中基本神经网络(三)

0. 引言

1985年,Powell提出了多变量插值的径向基函数(Radical Basis Function,RBF)方法。1988年,Moody和Darken提出了一种神经网络结构,即RBF神经网络,它属于前向神经网络类型,并能够以任意精度逼近任意连续函数,适合于解决分类问题。

1. RBF神经网络模型的提出

考虑到一个由 N N N维输入空间到一维输出空间的映射。设 N N N维空间有 P P P个输入向量, p = 1 , 2 , . . . , P p=1,2,...,P p=1,2,...,P,它们在输出空间响应的目标值为 d p , p = 1 , 2 , . . . , P d^{p},p=1,2,...,P dp,p=1,2,...,P,这 P P P对输入-输出样本构成了训练样本集合。插值的目的是寻找一个非线性映射函数 F ( X ) F(X) F(X),使其满足以下条件:
F ( X p ) = d p , p = 1 , 2 , . . . , P F(X^{p})=d^{p},p=1,2,...,P F(Xp)=dp,p=1,2,...,P

式子中的函数 F ( . ) F(.) F(.)实际上描述了一个插值曲面,即该插值曲面必须通过所有训练数据点。采用径向基函数解决插值问题方法即为,选择 P P P个基函数,每一个基函数对应一个训练数据,各个基函数形式为
ϕ ( ∣ ∣ X − X p ∣ ∣ ) , p = 1 , 2 , . . . , P \phi(||X-X^{p}||),p=1,2,...,P ϕ(XXp),p=1,2,...,P

其中,基函数 ϕ \phi ϕ是非线性函数,训练数据点 X p X^{p} Xp ϕ \phi ϕ的中心,基函数以输入空间的点 X X X与中心 X p X^{p} Xp的距离作为函数的自变量。由于距离是径向同性的,所以函数 ϕ \phi ϕ被称作为径向基函数。基于径向基函数技术的插值函数定义为基函数的线性组合:
F ( X ) = ∑ p = 1 P w p ϕ ( ∣ ∣ X − X p ∣ ∣ ) F(X)=\sum_{p=1}^{P}w_{p}\phi(||X-X^{p}||) F(X)=p=1Pwpϕ(XXp)

所以得到一个基本的线性方程组:
∑ p = 1 P w p ϕ ( ∣ ∣ X ( k ) − X p ∣ ∣ ) = d ( k ) , k = 1 , 2 , . . , P \sum_{p=1}^{P}w_{p}\phi(||X^{(k)}-X^{p}||)=d^{(k)},k=1,2,..,P p=1Pwpϕ(X(k)Xp)=d(k),k=1,2,..,P

ϕ k p = ϕ ( ∣ ∣ X ( k ) − X p ∣ ∣ ) = d ( k ) \phi_{kp}=\phi(||X^{(k)}-X^{p}||)=d^{(k)} ϕkp=ϕ(X(k)Xp)=d(k),那么上述式子可以改写为线性方程组的形式:
[ ϕ 11 ϕ 12 . . . ϕ 1 P ϕ 21 ϕ 22 . . . ϕ 2 P : : : : ϕ P 1 ϕ P 2 . . . ϕ P P ] [ w 1 w 2 : w P ] = [ d ( 1 ) d ( 2 ) : d ( P ) ] \left[\begin{array}{cccc} \phi_{11}&\phi_{12}&...&\phi_{1P}\\ \phi_{21}&\phi_{22}&...&\phi_{2P}\\ :&:&:&:\\ \phi_{P1}&\phi_{P2}&...&\phi_{PP} \end{array}\right] \left[\begin{array}{cccc} w_{1}\\ w_{2}\\ :\\ w_{P} \end{array}\right] =\left[\begin{array}{cccc} d^{(1)}\\ d^{(2)}\\ :\\ d^{(P)}\\ \end{array}\right] ϕ11ϕ21:ϕP1ϕ12ϕ22:ϕP2......:...ϕ1Pϕ2P:ϕPPw1w2:wP=d(1)d(2):d(P)

Φ \Phi Φ表示元素为 ϕ k p \phi_{kp} ϕkp P × P P\times{P} P×P阶矩阵, W W W d d d分别为系数矩阵和期望输出的向量,所以有
Φ W = d \Phi W=d ΦW=d

特别地,若 Φ \Phi Φ是可逆矩阵,即可以求出下面的系数向量 W W W,即
W = Φ − 1 d W=\Phi^{-1}d W=Φ1d

Micchelli定理给出了系数矩阵 Φ \Phi Φ可逆的条件,即
对于一大类函数,如果 X ( 1 ) , X ( 2 ) , . . . , X ( P ) X^{(1)},X^{(2)},...,X^{(P)} X(1),X(2),...,X(P)各不相同,则 P × P P\times{P} P×P阶插值矩阵是可逆的。
最常见的径向基函数有三种,其表达式如下所示:
(1) Gauss函数:
ϕ ( r ) = e x p ( − r 2 2 δ 2 ) \phi(r)=exp(-\frac{r^{2}}{2\delta^{2}}) ϕ(r)=exp(2δ2r2)

(2) Reflected sigmoidal (反演S型函数):
ϕ ( r ) = 1 1 + e x p ( r 2 δ 2 ) \phi(r)=\frac{1}{1+exp(\frac{r^{2}}{\delta^{2}})} ϕ(r)=1+exp(δ2r2)1

(3) Inverse multiquadrics (拟多二次)函数
ϕ ( r ) = 1 r 2 + δ 2 \phi(r)=\frac{1}{\sqrt{r^{2}+\delta^{2}}} ϕ(r)=r2+δ2 1

δ \delta δ常常称为该基函数的扩展常数或者宽度,当然基函数的宽度越小,越具有选择性。这三种径向基函数的图像如下所示:
径向基函数图像
其导函数的图像如下所示:
径向基函数导函数图像

2. RBF网络结构

RBF神经网络是一种三层神经网络,包括有输入层、隐藏层和输出层。从输入空间到隐藏层空间是非线性变换,而从隐藏层空间到输出层空间变换是线性的。其中隐藏层的非线性变换的激活函数是径向基函数,这一点基本和BP神经网络类似。RBF神经网络基本的思想是:用RBF作为隐藏单元的"基"构成隐含层空间,这样就可以输入矢量直接映射到隐藏层空间,而并不需要通过权重值连接。当RBF中心点确定之后,这种映射关系也就确定了。而隐含层空间到输出空间的映射是线性的,即网络的输出是隐藏层单元输出的线性加权和,此处的权即为网络可调参数。其中,隐藏层的作用是将向量从低维度映射到高维度,这样低维度线性不可分的情况到高纬度就可以变得线性可分了,这种思想主要是核函数思想。

3. 推导过程

设输入数据集为 D = { x k , d k } k = 1 N D=\{x_{k},d_{k}\}_{k=1}^{N} D={ xk,dk}k=1N。那么我们将介绍基本的RBF神经网路以及其变形的神经网络。

3.1 模型一:含有KMeans算法的RBF神经网络(最初模型)

这种模型中前向计算过程一共有两个,隐藏层输入,网络结构的输出。其中隐藏层的输入如下表示:
R ( x k ) = e x p ( − 1 2 σ 2 ( x k − μ ) 2 ) R(x_{k})=exp(-\frac{1}{2\sigma^{2}}(x_{k}-\mu)^{2}) R(xk)=exp(2σ21(xkμ)2)
其中 x x x径向神经网络的输出为:
y k = W R ( x k ) y_{k}=WR(x_{k}) yk=WR(xk)

定义损失函数
L ( d , y ) = 1 N ∑ k = 1 N L ( d k , y k ) L(d,y)=\frac{1}{N}\sum_{k=1}^{N}L(d_{k},y_{k}) L(d,y)=N1k=1NL(dk,yk)

L ( d k , y k ) = ∑ i = 1 m L ( d k i , y k i ) L(d_{k},y_{k})=\sum_{i=1}^{m}L(d_{ki},y_{ki}) L(dk,yk)=i=1mL(dki,yki)

显然,通过梯度的方法,我们对其参数求导数得到:
∂ L ∂ W i j = 1 N ∑ k = 1 N ∂ L ∂ y k i ⋅ ∂ y k i ∂ W i j \frac{\partial L}{\partial W_{ij}}=\frac{1}{N}\sum_{k=1}^{N}\frac{\partial L}{\partial y_{ki}}\cdot{\frac{\partial y_{ki}}{\partial W_{ij}}} WijL=N1k=1NykiLWijyki

回归问题中,为了使得数据能够更好地拟合原始数据信息,用最小二乘法定义损失函数(MSE损失函数):
L ( d k , y k ) = ( d k − y k ) T ( d k − y k ) L(d_{k},y_{k})=(d_{k}-y_{k})^{T}(d_{k}-y_{k}) L(dk,yk)=(dkyk)T(dkyk)

则偏导数公式为:
∂ L ∂ W i j = 1 N ∑ k = 1 N 2 ( y k i − d k i ) ∂ y k i ∂ W i j = 1 N ∑ k = 1 N 2 ( y k i − d k i ) R ( x k j ) \frac{\partial L}{\partial W_{ij}}=\frac{1}{N}\sum_{k=1}^{N}2(y_{ki}-d_{ki})\frac{\partial y_{ki}}{\partial W_{ij}}=\frac{1}{N}\sum_{k=1}^{N}2(y_{ki}-d_{ki})R(x_{kj}) WijL=N1k=1N2(ykidki)Wijyki=N1k=1N2(ykidki)R(xkj)

写成矩阵的形式为
∂ L ∂ W = 1 N ∑ k = 1 N 2 ( y k − d k ) ( R ( x k ) ) T \frac{\partial L}{\partial W}=\frac{1}{N}\sum_{k=1}^{N}2(y_{k}-d_{k})(R(x_{k}))^{T} WL=N1k=1N2(ykdk)(R(xk))T

对于分类问题中的交叉熵函数来说,网络的输出最后一层需要添加softmax函数:
r k = softmax ( y k ) r_{k}=\text{softmax}(y_{k}) rk=softmax(yk)

设损失函数为
L ( d k , y k ) = − d k T log ⁡ ( y k ) L(d_{k},y_{k})=-d_{k}^{T}\log(y_{k}) L(dk,yk)=dkTlog(yk)

则有
∂ L ∂ W = 1 N ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ W \frac{\partial L}{\partial W}=\frac{1}{N}\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial W}} WL=N1k=1NykLWyk

那么,根据推导(推导过程详细见笔者博客深度学习中基本神经网络(一))可以得到
∂ L ∂ y k = r k − d k \frac{\partial L}{\partial y_{k}}=r_{k}-d_{k} ykL=rkdk

同样可以得到
∂ y k ∂ W = ( R ( x k ) ) T \frac{\partial y_{k}}{\partial W}=(R(x_{k}))^{T} Wyk=(R(xk))T

所以我们得到了梯度最终的求解公式:
∂ L ∂ W = 1 N ∑ k = 1 N ( r k − d k ) ( R ( x k ) ) T \frac{\partial L}{\partial W}=\frac{1}{N}\sum_{k=1}^{N}(r_{k}-d_{k})(R(x_{k}))^{T} WL=N1k=1N(rkdk)(R(xk))T

在RBF神经网络中,参数 μ \mu μ指的是中心参数, σ \sigma σ指的是扩展系数或者宽度。学习过程中,这两个参数使用KNN算法来计算:
(1) 使用Kmeans算法计算中心向量 μ \mu μ
(2) 计算扩展系数 σ \sigma σ σ 2 = 1 K ∑ i = 1 K ( x k i − c i ) 2 \sigma^{2}=\frac{1}{K}\sum\limits_{i=1}^{K}(x_{ki}-c_{i})^{2} σ2=K1i=1K(xkici)2

3.2 模型二:梯度训练法RBF神经网络

在模型一种,Kmeans算法计算中心参数 μ \mu μ显得有些繁琐。所以为简便操作,中心参数 μ \mu μ以及扩展系数 σ \sigma σ都采用自学习方式来学习结果。其推导的方式如下。
通过梯度的方法,我们对其函数求导可得
∂ L ∂ σ j = 1 N ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ σ j \frac{\partial L}{\partial \sigma_{j}}=\frac{1}{N}\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial \sigma_{j}}} σjL=N1k=1NykLσjyk

∂ L ∂ μ j = 1 N ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ μ j \frac{\partial L}{\partial \mu_{j}}=\frac{1}{N}\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial \mu_{j}}} μjL=N1k=1NykLμjyk

同样对于MSE函数来说,有以下的结果:
∂ L ∂ σ j = 1 N ∑ k = 1 N 2 ( y k − d k ) ∂ y k ∂ σ j = 1 N ∑ k = 1 N 2 ( y k i − d k i ) W i j R σ ′ ( x k j ) \frac{\partial L}{\partial \sigma_{j}}=\frac{1}{N}\sum_{k=1}^{N}2(y_{k}-d_{k})\frac{\partial y_{k}}{\partial \sigma_{j}}=\frac{1}{N}\sum_{k=1}^{N}2(y_{ki}-d_{ki})W_{ij}R_{\sigma}^{'}(x_{kj}) σjL=N1k=1N2(ykdk)σjyk=N1k=1N2(ykidki)WijRσ(xkj)

写成矩阵形式为
∂ L ∂ σ = 1 N ∑ k = 1 N 2 R σ ′ ( x k ) ⊙ ( W T ( y k − d k ) ) \frac{\partial L}{\partial \sigma}=\frac{1}{N}\sum_{k=1}^{N}2R_{\sigma}^{'}(x_{k})\odot(W^{T}(y_{k}-d_{k})) σL=N1k=1N2Rσ(xk)(WT(ykdk))

同理,得到参数 μ \mu μ的梯度公式:
∂ L ∂ μ = 1 N ∑ k = 1 N 2 R μ ′ ( x k ) ⊙ ( W T ( y k − d k ) ) \frac{\partial L}{\partial \mu}=\frac{1}{N}\sum_{k=1}^{N}2R_{\mu}^{'}(x_{k})\odot(W^{T}(y_{k}-d_{k})) μL=N1k=1N2Rμ(xk)(WT(ykdk))

对于分类函数也可以得到其梯度求解公式:
∂ L ∂ σ = 1 N ∑ k = 1 N R σ ′ ( x k ) ⊙ ( W T ( r k − d k ) ) \frac{\partial L}{\partial \sigma}=\frac{1}{N}\sum_{k=1}^{N}R_{\sigma}^{'}(x_{k})\odot(W^{T}(r_{k}-d_{k})) σL=N1k=1NRσ(xk)(WT(rkdk))

∂ L ∂ μ = 1 N ∑ k = 1 N R μ ′ ( x k ) ⊙ ( W T ( r k − d k ) ) \frac{\partial L}{\partial \mu}=\frac{1}{N}\sum_{k=1}^{N}R_{\mu}^{'}(x_{k})\odot(W^{T}(r_{k}-d_{k})) μL=N1k=1NRμ(xk)(WT(rkdk))

3.3 模型三:三层梯度训练法RBF神经网络

三层梯度训练方法中的RBF神经网络和BP神经网络类似,包含有输入层、隐藏层以及输出层。网络的结构图如下所示:
RBF神经网络结构图

输入层到隐藏层是一个线性变换,然后经过径向函数作用,最后通过线性变换将值输出。其中表达式如下所示:
h k = W i x k + b i h_{k}=W_{i}x_{k}+b_{i} hk=Wixk+bi
y k = W o R ( h k ) + b o y_{k}=W_{o}R(h_{k})+b_{o} yk=WoR(hk)+bo

所以我们需要解决求导的参数矩阵有 W i , b i , W o , b o , μ , σ W_{i},b_{i},W_{o},b_{o},\mu,\sigma Wi,bi,Wo,bo,μ,σ。定义损失函数

L ( y , d ) = ∑ k = 1 N L ( y k , d k ) L(y,d)=\sum_{k=1}^{N}L(y_{k},d_{k}) L(y,d)=k=1NL(yk,dk)

我们对其进行求导处理,则会有

∂ L ∂ ( W i ) j t = ∑ k = 1 N ∂ L ∂ h k ⋅ ∂ h k ∂ ( W i ) j t = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ h k ⋅ ∂ h k ∂ ( W i ) j t \frac{\partial L}{\partial (W_{i})_{jt}}=\sum_{k=1}^{N}\frac{\partial L}{\partial h_{k}}\cdot{\frac{\partial h_{k}}{\partial (W_{i})_{jt}}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial h_{k}}}\cdot{\frac{\partial h_{k}}{\partial (W_{i})_{jt}}} (Wi)jtL=k=1NhkL(Wi)jthk=k=1NykLhkyk(Wi)jthk

∂ L ∂ ( W o ) j t = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ ( W o ) j t \frac{\partial L}{\partial (W_{o})_{jt}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial (W_{o})_{jt}}} (Wo)jtL=k=1NykL(Wo)jtyk

∂ L ∂ ( b i ) j = ∑ k = 1 N ∂ L ∂ h k ⋅ ∂ h k ∂ ( b i ) j = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ h k ⋅ ∂ h k ∂ ( b i ) j \frac{\partial L}{\partial (b_{i})_{j}}=\sum_{k=1}^{N}\frac{\partial L}{\partial h_{k}}\cdot{\frac{\partial h_{k}}{\partial (b_{i})_{j}}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial h_{k}}}\cdot{\frac{\partial h_{k}}{\partial (b_{i})_{j}}} (bi)jL=k=1NhkL(bi)jhk=k=1NykLhkyk(bi)jhk

∂ L ∂ ( b o ) j = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ ( b o ) j \frac{\partial L}{\partial (b_{o})_{j}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial (b_{o})_{j}}} (bo)jL=k=1NykL(bo)jyk

∂ L ∂ μ j = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ μ j = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ R ⋅ ∂ R ∂ μ j \frac{\partial L}{\partial \mu_{j}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial \mu_{j}}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial R}}\cdot{\frac{\partial R}{\partial \mu_{j}}} μjL=k=1NykLμjyk=k=1NykLRykμjR

∂ L ∂ σ j = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ σ j = ∑ k = 1 N ∂ L ∂ y k ⋅ ∂ y k ∂ R ⋅ ∂ R ∂ σ j \frac{\partial L}{\partial \sigma_{j}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial \sigma_{j}}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\cdot{\frac{\partial y_{k}}{\partial R}}\cdot{\frac{\partial R}{\partial \sigma_{j}}} σjL=k=1NykLσjyk=k=1NykLRykσjR

经过推导,用矩阵表达为:
∂ L ∂ W i = ∑ k = 1 N ∂ L ∂ y k ⊙ W o T R ′ ( h k ) ( x k ) T \frac{\partial L}{\partial W_{i}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\odot{W_{o}^{T}R^{'}(h_{k})(x_{k})^{T}} WiL=k=1NykLWoTR(hk)(xk)T

∂ L ∂ b i = ∑ k = 1 N ∂ L ∂ y k ⊙ W o T R ′ ( h k ) \frac{\partial L}{\partial b_{i}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\odot{W_{o}^{T}R^{'}(h_{k})} biL=k=1NykLWoTR(hk)

∂ L ∂ W o = ∑ k = 1 N ∂ L ∂ y k ( R ( h k ) ) T \frac{\partial L}{\partial W_{o}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}(R(h_{k}))^{T} WoL=k=1NykL(R(hk))T

∂ L ∂ b o = ∑ k = 1 N ∂ L ∂ y k \frac{\partial L}{\partial b_{o}}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}} boL=k=1NykL

∂ L ∂ μ = ∑ k = 1 N ∂ L ∂ y k ⊙ W o T R μ ′ ( h k ) \frac{\partial L}{\partial \mu}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\odot{W_{o}^{T}R_{\mu}^{'}(h_{k})} μL=k=1NykLWoTRμ(hk)

∂ L ∂ σ = ∑ k = 1 N ∂ L ∂ y k ⊙ W o T R σ ′ ( h k ) \frac{\partial L}{\partial \sigma}=\sum_{k=1}^{N}\frac{\partial L}{\partial y_{k}}\odot{W_{o}^{T}R_{\sigma}^{'}(h_{k})} σL=k=1NykLWoTRσ(hk)

这种由三层RBF径向基神经网络也可以推广为更深层次的径向基神经网络,层次更深的RBF也可以更好地拟合数据的效果,在高维空间中抽取数据中的特征信息来拟合函数。递推过程就不再叙述了。

4. 实际应用

在拟合数据的过程中,为避免网络的过拟合状态,所以在更新权重矩阵过程中,我们添加了正则化项系数 λ \lambda λ以及学习率 η \eta η来调节和平衡各个参数的状态信息。
W ← W − η ⋅ ( ∂ L ∂ W + λ ⋅ W ) W\leftarrow W-\eta\cdot{(\frac{\partial L}{\partial W}+\lambda\cdot{W})} WWη(WL+λW)

b ← b − η ⋅ ∂ L ∂ b b\leftarrow b-\eta\cdot{\frac{\partial L}{\partial b}} bbηbL

接下来我们详细介绍神经网络在实际中的应用。

4.1 回归问题(Regression)

我们这里使用到的数据集是数值预报模型温度预报的偏差校正数据集Bias correction of numerical prediction model temperature forecast Data Set

数值预报模型温度预报的偏差校正数据集图片
该数据用于对韩国气象局在韩国首尔市运行的LDAPS模型的第二天最高和最低气温预测进行偏差校正。该数据由2013年至2017年的夏季数据组成。输入数据主要由LDAPS模型的次日预报数据,当前实地最高和最低温度以及地理辅助变量组成。该数据有两个输出(即第二天的最高和最低气温)。在2015年至2017年期间进行了验证。所以我们这里测试的数据集输入为23个变量,输出为2个变量。数据中我们使用70%作为训练数据集,15%作为验证数据集,15%作为测试数据集。我们模型设计的核心使用到了三种RBF模型进行回归分析处理。

具体RBF神经网络核心代码如下所示:

class RBFRegression:
    def __init__(self,in_dim,out_dim,act_name = "Gauss"):
        self.in_dim = in_dim
        self.out_dim = out_dim
        self.act_func = select_func(act_name)()
        self.weight = np.random.rand(in_dim,out_dim)
        self.mu = np.random.rand(in_dim)
        self.sigma = np.random.rand(in_dim)
    def forward(self,input):
        hidden = self.act_func.forward(input-self.mu,self.sigma)
        return np.dot(hidden,self.weight)
    def backward(self,input,target,learning_rate,lambd):
        batch = input.shape[0]
        output = self.forward(input)
        delta = 2*(target-output)# size of (batch*out_dim)
        R_out = self.act_func.forward(input - self.mu, self.sigma)
        dW = np.dot(R_out.T,delta)/batch
        #Kmeans algorithm
        for k in range(self.in_dim):
            tmp = np.append(input[:,k],self.mu[k])
            index = 0
            for j in range(batch):
                if np.sum(np.square(tmp - tmp[j])) <np.sum(np.square(tmp - tmp[index])):
                    index = j
            self.mu[k] = tmp[index]
            self.sigma[k] = np.sum(np.square(tmp-self.mu[k]))/batch
        self.weight = self.weight-learning_rate*(dW + lambd*self.weight)
    def loss(self,output,target):
        return np.sum(np.square(output-target))

其他模型代码参见笔者github
笔者实现了numpy和theano两个版本的RBF神经网络。数据拟合的结果如下所示,模型的损失函数曲线变化趋势如下所示:
天气预报数据集损失值变化图

由图中可知,图中BP神经网络相对来说对数据集的处理结果不是非常好,但是最终训练的模型是符合结果的。综上三个模型比较,RBFBP模型显得拟合数据的效果会更好一些。

4.2 分类问题(Classification)

我们这里使用到的是葡萄酒分类问题的数据集:Wine Quality Data Set
葡萄酒数据集图片
数据中包含有红酒和白葡萄酒样本创建了两个数据集。输入包括客观测试(例如PH值),输出基于感官数据(葡萄酒专家至少进行3次评估的中位数)。每位专家对葡萄酒质量进行评分在0(非常差)和10(非常好)之间。实例数量包含有1599条红葡萄酒信息和4898条白葡萄酒信息。输入的数据为11个属性,输出为1个属性。

RBF模型的核心代码如下所示:

class RBFClassification:
    def __init__(self,in_dim,n_class,act_name = "Gauss"):
        self.in_dim = in_dim
        self.n_class = n_class

        self.act_func = select_func(act_name)()
        self.weight = np.random.rand(in_dim, n_class)
        self.mu = np.random.rand(in_dim)
        self.sigma = np.random.rand(in_dim)
        self.softmax = SoftMax()
    def forward(self,input):
        hidden = self.act_func.forward(input-self.mu,self.sigma)
        output = np.dot(hidden,self.weight)
        return self.softmax.forward(output,axis=0)
    def backward(self,input,target,learning_rate,lambd):
        batch = input.shape[0]
        output = self.forward(input)
        delta_r = output - target
        R_out = self.act_func.forward(input - self.mu, self.sigma)
        dW = np.dot(R_out.T, delta_r) / batch
        #Kmeans algorithm
        for k in range(self.in_dim):
            tmp = np.append(input[:,k],self.mu[k])
            index = 0
            for j in range(batch):
                if np.sum(np.square(tmp - tmp[j])) <np.sum(np.square(tmp - tmp[index])):
                    index = j
            self.mu[k] = tmp[index]
            self.sigma[k] = np.sum(np.square(tmp-self.mu[k]))/batch
        self.weight = self.weight-learning_rate*(dW + lambd*self.weight)
    def loss(self,output,target):
        return -np.sum(np.log(output) * target)

完整代码见笔者github
笔者实现了numpy和theano两个版本的RBF神经网络。由于数据分为白葡萄酒和红葡萄酒两个数据集,这两个数据集上模型的损失函数曲线变化趋势如下所示:
红葡萄酒集上的实验
红葡萄酒数据集上的损失变化图
白葡萄酒上的实验:
白葡萄酒数据集上的损失变化图
从图中可以看出,在模型RBFGrad模型上相对于另外两个模型比较差,但是BP神经网络和RBFBP神经网络的效果差不多,但是RBF类型的神经网络相对来说更好一些。

5. 小结

本节中详细介绍了RBF神经网络的结构、推导过程以及实际应用。最重要的掌握其中的原理和重要的梯度推导细节,以及如何利用RBF神经网络来有效地拟合数据。

参考资料

[1] 人工神经网络理论、设计及应用_第2版
[2] https://www.cnblogs.com/pinking/p/9349695.html
[3] https://www.cnblogs.com/wb-learn/p/11695433.html
[4] https://blog.csdn.net/weiwei9363/article/details/72808496

猜你喜欢

转载自blog.csdn.net/Zhang_Pro/article/details/105549636
今日推荐