人工神经网络及其应用实例—-毕业论文设计 下载本文

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