1 2
使用链式法则,分别列出平方误差?? 对所有网络参数的导数: ????v ???
???(t?? z)
???????? yi , i?? 0,1, 2, ?bi ?v
, m
???
???????? bi , i?? 1, 2, ?yi ?v
, m
???????????????ui???yi??ui???yi (1? e?ui )2
???????ui???????????????????? x j , i?? 1, 2, ?a ji ?ui??a ji ?ui
???????在实际的编程过程中,我们需要的是 也可以直接采用以下整理之后的形式:
, i?? 1, 2, , m
, m, j?? 0,1, 2, , n
???????bi
和 ?a ji ,所以如果有需要,
????a ji
??????(t?? z)?? yi , i?? 0,1, 2, ?bi
, m
, m, j?? 0,1, 2, , n
e?ui
???(t?? z)?? bi??????????? x j , i?? 1, 2,
(1?? e?ui )2
研究表明,两层网络在其隐层中使用 S 形激励函数,在输出层中 使用线性传输函数,就几乎可以以任意精度逼近任意感兴趣的函数,
只要隐层中有足够的单元可用。
问题 1:
试使用 BP 神经网络去逼近正弦函数的正半周,如下:
t?? sin(x), x??[0,? ]
由于输入量 x 仅有一维,故 BP 神经网络结构可以设计为: Page 9 of 25
x y0?? 1 0?? 1 a01 ????y1 a02 b1 b0 ??1 z a11 b2 a y2 12 x1?? x ????各个神经元的输入输出关系为:
??1 yi???1 1?? e?ui , ui??
a ji j ,x i?? 1, 2 j??0 2 z?? v, v???? bi iy i??0 根据之前的推导,平方误差
?? 对所有网络参数的导数为: ??? ?b???(t?? z)?? yi , i?? 0,1, 2 i
??????(t?? z)?? be?ui
?ai??????????? ji
(1?? e x j?u , i?? 1, 2, j?? 0,1
i )2
网络参数修正方程为:
bk??1
???i ?? ibk???????k
?b? bi?????? (t?? z)?? yi , i?? 0,1, 2 i
a k??1 ? a?? ????????? ak
ji?????? (t?? z)?? bi????????????a x j , i?? 1, 2, j?? 0,1 ???????ji
ji
ji (1?? 为加快寻找最优权值的速度,可以使用动量法。之前的方法中, 收敛到最优权值的速度取决于学习率的大小,但是过大的学习率会导
致来回震荡,不能稳定到最优权值点。动量法的引入,使得较大的学
习率也可以具有较好的稳定性,即提供了在学习期间到达最优权值时
Page 10 of 25
k
的稳定性。这种方法基本上是将过去权值变化的平均值附加到每一次 权值变化的新权值增量,从而使网络权值的变化更平滑。数学表示如
下:
?wk??1????????wk?? (1??? )?????? (????? ) ?w 式中,?? 是一个在 0 和 1 之间的动量参数,??wk 是在前一个训练
时间里的权值变化。使用动量法的实际效果是:基本上,如果以前积
累的变化与之前方向所暗示的是同一个方向时,动量部分就会加速当
前权值改变;如果当前积累的变化是相反的方向,动量将阻止当前的
变化。
据此编写 MATLAB 程序,源代码如下:
beta = 0.1; miu = 0.8;
for i = 1 : 1 : 101;
x1(1, i) = (i - 1) * pi / 100; t(1, i) = sin(x1(1, i)); end x0 = 1; y0 = 1; a01 = rand(); a02 = rand(); a11 = rand(); a12 = rand(); b0 = rand(); b1 = rand(); b2 = rand(); delta_a01 = 0; delta_a02 = 0; delta_a11 = 0; delta_a12 = 0; delta_b0 = 0; delta_b1 = 0; delta_b2 = 0; k = 1;
total_error = 0;
Page 11 of 25
while 1
u1 = a01 * x0 + a11 * x1(1, k);
u2 = a02 * x0 + a12 * x1(1, k);
temp1 = exp(-u1) / ((1 + exp(-u1)) ^ 2); temp2 = exp(-u2) / ((1 + exp(-u2)) ^ 2); y1 = 1 / (1 + exp(-u1)); y2 = 1 / (1 + exp(-u2));
z = b0 * y0 + b1 * y1 + b2 * y2;
total_error = total_error + (t(1, k) - z) ^ 2 / 2;
delta_b0 = miu * delta_b0 + (1 - miu) * beta * sum((t(1, k) - z) * y0);
b0 = b0 + delta_b0;
delta_b1 = miu * delta_b1 + (1 - miu) * beta * sum((t(1, k) - z) * y1);
b1 = b1 + delta_b1;
delta_b2 = miu * delta_b2 + (1 - miu) * beta * sum((t(1, k) - z) * y2);
b2 = b2 + delta_b2;
delta_a01 = miu * delta_a01 + (1 - miu) * beta * sum((t(1, k) - z) * b1 * temp1 * x0);
a01 = a01 + delta_a01;
delta_a02 = miu * delta_a02 + (1 - miu) * beta * sum((t(1, k) - z) * b2 * temp2 * x0);
a02 = a02 + delta_a02;
delta_a11 = miu * delta_a11 + (1 - miu) * beta * sum((t(1, k) - z) * b1 * temp1 * x1(1, k));
a11 = a11 + delta_a11;
delta_a12 = miu * delta_a12 + (1 - miu) * beta * sum((t(1, k) - z) * b2 * temp2 * x1(1, k));
a12 = a12 + delta_a12; k = k + 1;
if k == length(x1) + 1
total_error k = 1;
if total_error < 0.001
break; else
total_error = 0; end end end
clear u1 u2 temp1 temp2 y1 y2 z x0 y0;
Page 12 of 25