一、大致介绍
BP算法的学习过程是由正向传播和反向传播组成的。在正向传播的过程中,输入的信息从输入层到隐含层处理 最后传向输出层,而且每一个神经元只能影响到下一层神经元的状态。当在输出层得不到期望的输出时,则转向反向传播,将误差信号按照连接通路反向计算,使用梯度下降法来调整每一层神经元的权值w,以此来减小误差。
二、逼近网络的结构
神经元结构:
三、计算开始(核心运算就是求导)
第一部分:前向传播
隐含层神经元的输入即为所有输入信号的加权和
x
j
=
∑
i
w
i
j
x
i
x_j=\sum_{i}{w_{ij}x_i}
xj=i∑wijxi
而隐含层的输出
x
j
′
x_j^{'}
xj′采用函数来激发
x
j
x_j
xj:
x
j
′
=
f
(
x
j
)
=
1
1
+
e
−
x
j
x_j^{'}=f(x_j)=\frac{1}{1+e^{-x_j}}
xj′=f(xj)=1+e−xj1
求导:
∂
x
j
′
∂
x
j
=
e
−
x
j
(
1
+
e
−
x
j
)
2
=
x
j
′
(
1
−
x
j
′
)
\frac{\partial{x_j^{'}}}{\partial{x_j}}=\frac{e^{-x_j}}{(1+e^{-x_j})^2}=x_j^{'}(1-x_j^{'})
∂xj∂xj′=(1+e−xj)2e−xj=xj′(1−xj′)
则很容易就得到输出层神经元的输出为隐含层输出加权和:
y
n
(
k
)
=
∑
j
w
j
2
x
j
′
y_n(k)=\sum_{j}{w_{j2}x_j^{'}}
yn(k)=j∑wj2xj′
误差为:
e
(
k
)
=
y
(
k
)
−
y
n
(
k
)
;
e(k)=y(k)-y_n(k);
e(k)=y(k)−yn(k);
准则函数设为误差平方和的一半:
E
=
e
(
k
)
2
2
E=\frac{e(k)^2}{2}
E=2e(k)2
只有正向传播还不可以,我们还需要反向传播来调整他们之间权值w
第二部分:反向传播
反向传播使用
δ
\delta
δ学习算法
输出层和隐含层之间的连接权值
w
j
2
w_{j2}
wj2学习过程(其他同理):
Δ
w
j
2
=
−
η
.
∂
E
∂
w
j
2
=
η
.
e
(
k
)
.
∂
y
n
∂
w
j
2
=
η
.
e
(
k
)
.
x
j
′
\Delta w_{j2}=-\eta .\frac{\partial{E}}{\partial{w_{j2}}}=\eta.e(k).\frac{\partial{y_n}}{\partial{w_{j2}}}=\eta. e(k) .x_j^{'}
Δwj2=−η.∂wj2∂E=η.e(k).∂wj2∂yn=η.e(k).xj′
因此修正后的k+1时刻的
w
j
k
w_{jk}
wjk可以表示为:
w
j
k
(
k
+
1
)
=
w
j
k
(
k
)
+
Δ
w
j
2
w_{jk}(k+1)=w_{jk}(k)+\Delta w_{j2}
wjk(k+1)=wjk(k)+Δwj2
隐含层与输入层之间连接权值
w
i
j
w_{ij}
wij的学习过程为:
Δ
w
i
j
=
−
η
.
∂
E
∂
w
i
j
=
η
.
e
(
k
)
.
∂
y
n
∂
w
i
j
=
η
.
e
(
k
)
.
x
j
′
=
w
j
2
.
x
j
′
.
(
1
−
x
j
′
)
.
x
i
\Delta w_{ij}=-\eta .\frac{\partial{E}}{\partial{w_{ij}}}=\eta.e(k).\frac{\partial{y_n}}{\partial{w_{ij}}}=\eta. e(k) .x_j^{'}=w_{j2}.x_j^{'}.(1-x_j^{'}).x_i
Δwij=−η.∂wij∂E=η.e(k).∂wij∂yn=η.e(k).xj′=wj2.xj′.(1−xj′).xi
因此修正后的k+1时刻的
w
i
j
w_{ij}
wij可以表示为:
w
i
j
(
k
+
1
)
=
w
j
k
(
k
)
+
Δ
w
i
j
w_{ij}(k+1)=w_{jk}(k)+\Delta w_{ij}
wij(k+1)=wjk(k)+Δwij
为了避免在学习过程中发生振荡现象,导致收敛速度变慢,我们需要引入动量因子
α
\alpha
α,把上次权值对本次权值变化的影响考虑进去,即:
w
j
2
(
k
+
1
)
=
w
j
2
(
k
)
+
Δ
w
j
2
+
α
(
w
j
2
(
k
)
−
w
j
2
(
k
−
1
)
)
w
i
j
(
k
+
1
)
=
w
i
j
(
k
)
+
Δ
w
i
j
+
α
(
w
i
j
(
k
)
−
w
i
j
(
k
−
1
)
)
w_{j2}(k+1)=w_{j2}(k)+\Delta w_{j2}+\alpha (w_{j2}(k)-w_{j2}(k-1))\\ w_{ij}(k+1)=w_{ij}(k)+\Delta w_{ij}+\alpha (w_{ij}(k)-w_{ij}(k-1))
wj2(k+1)=wj2(k)+Δwj2+α(wj2(k)−wj2(k−1))wij(k+1)=wij(k)+Δwij+α(wij(k)−wij(k−1))
η
为
学
习
速
率
∈
[
0
,
1
]
,
α
为
动
量
因
子
∈
[
0
,
1
]
\eta为学习速率\in[0,1],\alpha为动量因子\in[0,1]
η为学习速率∈[0,1],α为动量因子∈[0,1]
jacobian信息:对象输出对输入的敏感度
∂
y
(
k
)
∂
u
(
k
)
\frac{\partial{y(k)}}{\partial{u(k)}}
∂u(k)∂y(k),其值可以被神经网络辨识:
将BP网络的第一个输入称为u(k),可得:
∂
y
(
k
)
∂
u
(
k
)
≈
∂
y
n
(
k
)
∂
u
(
k
)
=
∂
y
n
(
k
)
∂
x
j
′
.
∂
x
j
′
∂
x
j
.
∂
x
j
∂
u
(
k
)
=
∑
j
w
j
2
x
j
′
(
1
−
x
j
′
)
w
1
j
\frac{\partial{y(k)}}{\partial{u(k)}}\approx \frac{\partial{y_n(k)}}{\partial{u(k)}}=\frac{\partial{y_n(k)}}{\partial{x_j^{'}}}.\frac{\partial{x_j^{'}}}{\partial{x_j}}.\frac{\partial{x_j}}{\partial{u(k)}}=\sum_{j}{w_{j2}x_j^{'}(1-x_j^{'})w_{1j}}
∂u(k)∂y(k)≈∂u(k)∂yn(k)=∂xj′∂yn(k).∂xj∂xj′.∂u(k)∂xj=j∑wj2xj′(1−xj′)w1j
至此,原理部分讲完了。
三、实例
对象
u
(
k
)
=
s
i
n
(
π
t
)
2
u(k)={sin(\pi t)}^{2}
u(k)=sin(πt)2,权值w1,w2分别取,
η
=
0.9
,
α
=
0.5
\eta=0.9,\alpha =0.5
η=0.9,α=0.5 取1000个点。
逼近曲线:
error:
code:
%%本脚本用于系统辨识 BP网络逼近函数
%2019-4-17 王萌
close all
clear all
clc
xite=0.9; %学习速率
alfa=0.5; %动量因子
%初始化权重 %%三个神经元 神经元个数提高,准确度也会提高
w2=rands(3,1);
w2_1=w2;
w2_2=w2_1;
w1=rands(2,3);
w1_1=w1;
w1_2=w1;
%初始化输入
dw1=0*w1;
x=[0 0]';
%初始化输出
I=[0,0,0]';
Iout=[0,0,0]';
FI=[0,0,0];
ts=0.01;%间隔
for k=1:1000 %
time(k)=k*ts;
u(k)=sin(pi*k*ts)^2; %%被逼近的函数 输入
y(k)=u(k); %输入
for j=1:size(w1,2)
I(j)=x'*w1(:,j); %激活函数
Iout(j)=1/(1+exp(-I(j)));
end
yn(k)=w2'*Iout; %神经网络的输出 6 维
e(k)=y(k)-yn(k); %误差计算
w2=w2_1+(xite*e(k)*Iout)+alfa*(w2_1-w2_2);%学习算法 隐含层与输出层
%%
for j=1:size(w1,2)
FI(j)=exp(-I(j))/(1+exp(-I(j)))^2; %激活函数的导数
end
%%增量计算
for i=1:size(w1,1)
for j=1:size(w1,2)
dw1(i,j)=e(k)*xite*FI(j)*w2(j)*x(i); %隐含层与输入层
end
end
w1=w1_1+dw1+alfa*(w1_1-w1_2); %学习算法 隐含层与输入层
%%下面计算jacobian信息
yu=0;
for j=1:size(w1,2)
yu=yu+w2(j)*w1(1,j)*FI(j);
end
dyu(k)=yu;
x(1)=u(k);
x(2)=y(k);
w1_2=w1_1;w1_1=w1;
w2_2=w2_1;w2_1=w2;
end
figure(1)
plot(time,y,'r',time,yn,'b');
xlabel('times');ylabel('y and yn');
figure(2)
plot(time,y-yn,'r');
xlabel('times');ylabel('error');
figure(3)
plot(time,dyu);
xlabel('times');ylabel('dyu');