實驗部分:
①輸入、輸出矢量及問題的闡述
由題意輸入變量取值范圍為e={-2,-1,0,1,2}和ec={-2,-1,0,1,2},則輸入矢量有25種情況,分別如下所示:
則由T=int((e+ec)/2) ,采用向下取整,可得輸出矢量T為:
該問題可描述為通過訓練BP神經網絡實現模糊控制規則T=int((e+ec)/2),並達到網絡輸出與期望值誤差小於0.001。選取較好的BP神經網絡參數,包括隱含層節點個數、學習速率等。同時對不同的學習訓練算法進行比較,並通過內插方法測試網絡。
②給出網絡結構
由於有兩個輸入量,所以輸入層采用兩個神經元,輸出為單值即僅需采用一個神經元。網絡采用一個隱含層,假設其神經元節點個數為S1,則網絡結構可寫為2- S1-1。其中隱含層采用S型激活函數,輸出層采用線性激活函數。
針對不同的S1,采用固定誤差目標為Err_goal=0.001,固定學習速率0.1,最大迭代次數Max_iteration=10000,采用標准梯度下降訓練算法,並通過對網絡訓練時所需要的循環次數和訓練時間的情況觀察網絡求解效果。
考慮到在不同初始權重和偏差下神經網絡性能也可能不同,所以在確定隱含層神經元個數下,選取三次不同初始值,根據平均訓練時間和循環次數以及所能達到的精度來確定S1。
表一 隱含層節點尋優
S1 |
時間/s |
循環次數 |
結果SEE |
||||||
3 |
10 |
10 |
10 |
10000 |
10000 |
10000 |
0.0470 |
0.0326 |
0.0645 |
10 |
|
|
10000 |
|
|
> |
|
||
8 |
10 |
10 |
10 |
10000 |
10000 |
10000 |
0.0059 |
0.0378 |
0.0013 |
10 |
|
|
10000 |
|
|
> |
|
||
9 |
7 |
11 |
5 |
7070 |
10000 |
5593 |
0.0010 |
0.0237 |
0.0010 |
7.6 |
|
|
7553 |
|
|
> |
|
||
10 |
10 |
8 |
6 |
9232 |
7325 |
6522 |
0.0010 |
0.0010 |
0.0010 |
8 |
|
|
7692 |
|
|
= |
|
||
11 |
4 |
2 |
10 |
3667 |
2921 |
9601 |
0.0010 |
0.0010 |
0.0010 |
5.3 |
|
|
5394 |
|
|
= |
|
||
12 |
5 |
11 |
8 |
5419 |
10000 |
7831 |
0.0010 |
0.0039 |
0.0010 |
8 |
|
|
7750 |
|
|
> |
|
||
13 |
4 |
3 |
6 |
4840 |
4054 |
6762 |
0.0010 |
0.0010 |
0.0010 |
4.3 |
|
|
5218.6 |
|
|
= |
|
||
14 |
1 |
6 |
3 |
994 |
6576 |
3394 |
0.0010 |
0.0010 |
0.0010 |
3.3 |
|
|
3654 |
|
|
= |
|
通過上表實驗數據,對比可知,當隱含層神經元個數大於10個時結果開始趨於穩定,故選取S1=10,並固定三次訓練中最好結果的的初始值,即誤差平方和SEE=0.0010,迭代時間為6s,迭代次數為6522次的實驗數據。
該網絡權重和偏差初始值分別如下:
其中 W^1和 b^1分別為隱含層的權重和偏差,W^2 和 b^2分別為輸出層的權重和偏差。
確定好S1后,固定隨機初始值開始對學習速率進行尋優
表二 學習速率尋優
時間/s |
循環次數 |
結果SEE |
|
0.07 |
11 |
9225 |
0.00100 |
0.08 |
9 |
8100 |
0.00100 |
0.09 |
8 |
7223 |
0.00100 |
0.10 |
7 |
6522 |
0.00100 |
0.11 |
6 |
5948 |
0.00100 |
0.12 |
6 |
5470 |
0.00100 |
0.13 |
6 |
5066 |
0.00100 |
0.14 |
5 |
4721 |
0.00100 |
0.15 |
5 |
4423 |
0.00100 |
0.16 |
4 |
4163 |
0.00100 |
0.17 |
4 |
3935 |
0.00100 |
0.20 |
3 |
3254 |
0.00099 |
0.25 |
12 |
10000 |
0.00361 |
由上圖可觀察到在學習速率小於0.16時,誤差SEE能夠平滑快速下降,當 0.17時有毛刺跡象,實驗可得0.25時發散,故選擇 =0.16。
當采用變學習速率的學習算法,即triangda算法時實驗結果如下:
表三 自適應學習速率訓練情況
時間/s |
循環次數 |
結果SEE |
4 |
3192 |
0.0010 |
可見自適應算法的收斂速度要快。
③學習方法(包括所采用的改進方法);
對於不同的權值訓練方法,采用S1=10, =0.16,目標精度為0.001,最大迭代次數為10000次,保持參數不變。實驗結果如下表所示:
表四 不同學習訓練算法對比分析
函數 |
算法描述 |
時間/s |
迭代次數 |
結果 |
traingd |
標准梯度下降 |
4 |
4163 |
0.0010 |
traingdm |
附加動量,mc=0.9 |
11 |
10000 |
0.0204 |
traingda |
變學習速率 |
4 |
3192 |
0.0010 |
traincgf |
Fletcher-Powell共軛 |
2 |
108 |
0.00099 |
traincgp |
Powell-Ribiere共軛 |
<1 |
103 |
0.00093 |
trainscg |
Scaled共軛 |
<1 |
94 |
0.00095 |
trainbfg |
BFGs擬牛頓 |
1 |
65 |
0.00081 |
trainoss |
正割擬牛頓 |
<1 |
183 |
0.00099 |
trainrp |
彈性BP算法 |
<1 |
184 |
0.00098 |
trainlm |
Levenberg-Marquardt |
<1 |
29 |
0.00090 |
④初始化及必要的參數選取;
初始化必要參數選擇(對於標准梯度下降算法):網絡結構2-10-1,即S1=10, =0.16,最大迭代次數10000次,初始化權重和偏差如W^1,b^1,W^2 ,b^2分 所示。
⑤最后的結果,循環次數,訓練時間,其中着重討論:
a)不同隱含層S1時的收斂速度與誤差精度的對比分析,詳細分析見表一。
b)當S1設置為較好的情況下,在訓練過程中取始終不變的學習速率lr值時,對lr值為不同值時的訓練時間,包括穩定性進行觀察比較,詳細分析見表二。
c)當采用自適應值學習速率時,與單一固定的學習速率lr中最好的情況進行對比訓練的觀察,詳細分析見表三。
d)給出結論或體會。
本次實驗首先通過對標准梯度下降學習算法的最佳隱含層節點個數和最佳學習速率的尋優,充分了解掌握了BP神經網絡的訓練方法和結果分析。同時對其他不同的學習算法進行實驗分析,其中效果最佳的為Levenberg-Marquardt法,僅需要29次迭代就可以達到目標精度,次優的為BFGs擬牛頓法,需要65次迭代達到目標精度。通過這次實驗收獲很大。
⑥驗證,采用插值法選取多於訓練時的輸入,對所設計的網絡進行驗證,給出驗證的A與T值。
采用內插值,可知輸入變量取值范圍為 e=[-2,2]和ec=[-2,2],選取 30組內插測試集,並通過計算得到期望輸出矢量T_test。輸入矢量有30種情況,分別如下所示:
通過測試,得到測試結果為:
則E=T_test-Y 為:
可以看到在30組的測試集中有4組是有誤差的,分析原因可知當 的值存在0.5左右的小數時,結果很可能出錯,這可能是在得到 和 時采用round()四舍五入運算,而訓練樣本采用向下取整。

P = [-2 -2 -2 -2 -2 -1 -1 -1 -1 -1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2; -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2 -2 -1 0 1 2]; %T = [-2 -1 -1 -1 0 -1 -1 -1 0 0 -1 -1 0 0 1 -1 0 0 1 1 0 0 1 1 2]; T = [-2 -2 -1 -1 0 -2 -1 -1 0 0 -1 -1 0 0 1 -1 0 0 1 1 0 0 1 1 2]; P_test=[-1.0557 -1.3090 1.2044 1.1025 -0.8188 1.0945 -1.4473 -1.2423 -1.4905 -1.4868 -0.9071 -0.5317 -1.2507 -0.9795 -1.9378 1.8502 -1.9682 -0.5628 0.1633 0.0684 -1.4024 -1.7638 0.8895 0.6688 0.3943 -0.2545 -1.0839 0.0455 -0.6156 0.5526; -0.8437 -1.2052 -0.8015 0.7111 0.9226 1.6034 1.1763 -1.8841 -1.4651 1.7410 1.7707 -1.0552 0.1826 -0.7767 0.3500 1.3994 0.5361 -1.5438 -0.3343 1.5445 -0.2613 -0.4759 -1.6195 -0.8144 -1.3926 -1.9493 -0.9453 -1.1397 0.9913 1.4901]; T_test=zeros(1,30); for i=1:30 T_test(1,i)=round((P_test(1,i)+P_test(2,i))/2); end %T_test % for i=1:25 % plot3(P(1,i),P(2,i),T(i),'ro') % hold on % end w1=[-1.4806 -1.6455 -1.8388 -1.2325 2.2000 -0.2448 -1.6214 -1.5070 -1.0210 1.9641 -2.0718 -0.7795 -0.6118 -2.1274 -1.6455 -1.4806 1.9736 -1.0025 -1.2304 -1.8401]; b1=[4.4272 3.4434 -2.4595 1.4757 0.4919 -0.4919 -1.4757 -2.4595 3.4434 -4.4272]; w2=[0.0109 0.5229 0.2621 -0.8202 -0.8383 0.5545 0.8103 0.0675 -0.7817 0.6516]; b2=-0.3238; net=newff([-2 2;-2 2],[10,1],{'tansig','purelin'},'trainlm'); %創建兩層前向回饋網絡 net.trainParam.epochs=10000; %初始化訓練次數 net.trainParam.goal=0.001; net.trainParam.lr=0.16; net.trainParam.show = 25; %顯示循環間隔 %在開始訓練之前我們需要知道權重和偏差的隨機初始值 % net.IW{1} % net.b{1} % net.LW{2} % net.b{2} %初始值負值 net.IW{1}=w1; net.b{1}=b1; net.LW{2}=w2; net.b{2}=b2; [net,tr]=train(net,P,T); %訓練網絡 round(sim(net,P)) T_test Y=round(sim(net,P_test)) %計算結果 E=T_test-Y sumsqr(E) % net.IW{1} % net.b{1} % net.LW{2} % net.b{2}