• 沒有找到結果。

未來研究建議

在文檔中 碩 士 論 文 中 華 大 學 (頁 63-97)

第五章 結論與建議

5.3 未來研究建議

未來的研究方向包括:

(1) 探討決定參數 的自動化方法

類神經網路最為人詬病的原因之一,就是其所需要的參數太多,然而如果可 以自動且正確的找出合適的參數,將使類神經網路使用性更便利、更普遍。

(2) 探討 MRNN 在迴歸問題的效果

類神經網路在處理分類與迴歸的方法幾乎相同,因此使用上非常的便利,應 用也十分廣泛。MRNN在分類問題上確實表現比傳統的類神經網路還優,另外在 迴歸問題上則可繼續探討。

參考文獻

1. 葉怡成,類神經網路模式應用與實作,儒林,台北 (2000)。

2. Rumelhart, D.E., Hinton, G.E., and Williams, R.J., “Learning representations by back-propagation errors,’’ Nature, Vol. 323, pp. 533-536 (1986).

3. Hinton, G. E. and Camp, D., “Keeping the neural networks simple by minimizing the description length of the weights,” Proceedings of the Sixth Annual

Conference on Computational Learning Theory, pp. 5-13 (1993).

4. Treadgold, N.K. and Gedeon, T.D., “Simulated Annealing and Weight Decay in Adaptive Learning: the SARPROP Algorithm,” IEEE Transactions on Neural

Networks, Vol.9, No.4, pp. 662-668 (1998).

5. Krogh, A. and Hertz, J. A., “A Simple Weight Decay Can Improve Generalization,” In J.E. Moody, S.J. Hanson, and R.P. Lippmann, editors,

Advances in Neural Information Processing Systems 4, pages 450--957, San

Mateo, CA (1992).

6. Gupta, A. and Lam, S.M., “Weight decay backpropagation for noisy data,” Neural

Networks, Vol.11, No. 6, pp. 1127-1137 (1998).

7. Cortes, F., and Vapnik, V., 1995, “Support Vector Networks”, Machine Learning, Vol. 20, No. 3, pp.273-297 (1995).

8. Vapnik V.N., The Nature of Statistical Learning Theory, Springer-Verlag: New York (1995).

9. Drucker, H., Wu, D., and Vapink V., “Support vector machines for spam categorization”, IEEE Transactions on Neural Networks, Vol.10, No. 5, pp.1048-1054 (1999).

10. Burges, C., “A tutorial on support vector machines for pattern recognition”, Data

Mining and Knowledge Discovery, Vol. 2, No. 2, pp.121-167 (1998).

11. Blackard, J.A., “Comparison of Neural Networks and Discriminant Analysis in Predicting Forest Cover Types,” Ph.D. Dissertation, Department of Forest Sciences, Colorado State University. Fort Collins, Colorado (1998).

12. 鄒明誠、孫志鴻,「預測型模式在空間資料探勘之比較與整合研究」,地理學 報,第三十八期,第93-109 頁 (2004)。

13. UCI Machine Learning Repository Content Summary, Spambase Database, 2006,

(http://www.ics.uci.edu/~mlearn/MLSummary.html)

14. SAS Institute, Data mining using SAS Enterprise Miner: A case study approach (2nd), SAS Institute (2006).

15. 李御璽、顏秀珍、鄭郁翰、張韋豪、楊乃樺、賴郁菁、廖晨涵,「運用分類技 術發掘潛在中小企業借貸戶之研究」,2006 年資訊管理暨電子商務經營管理 研討會,新竹 (2006)。

附錄一 MRNN程式

A-1 使用手冊

MRNN 程式是由 BCB 5.0 開發之 DOS 模式執行檔。針對某資料做探勘 時,只要MRNN 所需之參數檔(pcn.net)、訓練範例檔(pcn.tra)、測試範例檔(pcn.tes) 與MRNN.EXE 放置同一個目錄下即可。

以下針對MRNN.EXE 執行所需的相關檔案介紹:

參數檔(pcn.net),格式如附錄表 A1-1。

附錄表A1 - 1 參數檔格式

序號

(行數) 名稱 參數

1 Ninp。輸入變數數目 依題目而定

2 Nhid1。第一隱藏層數目 依題目而定

3 Nhid2。第二隱藏層數目 依題目而定

4 Nout。輸出變數數目 依題目而定

5 Ntrain。訓練範例數目 依題目而定

6 Ntest。測試範例數目 依題目而定

7 Ncycle。訓練循環次數 1-30000, 通常為1000

8 N_test_period。測試週期數目 通常為訓練範例數/100

9 Ibatch。是否更新權重值 Yes=1, No=0

10 I_input_weight。是否由檔案輸入權重值 Yes=1, No=0

11 w_bound。權值初始值 通常為0.3

12 random_seed。亂數種子 0~1, 通常為0.456

13 eta。學習速率之下限值 通常為1

14 eta_rate。慣性項值 通常為0.95

15 eta_min。慣性項值更新速率 0~1, 通常為0.1

16 Alpha。慣性因子初始值 通常為0.5

17 alpha_rate。慣性因子更新速率

18 alpha_min。慣性因子下限值 通常為0.1

19 Gamma。 參數 0.0001~100

20 RModel。執行模式 1.Train/Test;2.Verify/Recall

訓練範例檔(pcn.tra)與測試範例檔(pcn.tes),兩檔案格式應該一致,格式如附 錄表A1-2。

附錄表A1 - 2 訓練與測試檔格式

X

1

X

2

X

Ninp

Y

1

Y

2

Y

Nout

1 2 3

n n=原始資料總筆數;

X

Ninp=輸入變數;

Y

Nout=輸出變數。

確認無誤後,即可執行MRNN.EXE 檔,學習完畢後隨即產生結果檔

(pcn.res)、誤差均方根檔(pcn.cvr)、連結權值檔(pcn.wei)等相關檔案,如下介紹:

結果檔(pcn.res)

此檔所存放的值為測試範例的實際(目標)輸出向量與推論輸出向量值,可利 用此值計算出判定係數(

R ),判斷二個連續變數之間的相關性。其檔案內容格式

2 如附錄表A1-3。

附錄表A1 - 3 結果檔格式

T

1

T

2

T

Nout

Y

1

Y

2

Y

Nout

1

2 3

Ntest

Ntest=測試範例數;

T

Nout 實際(目標)輸出向量數;

Y

Nout 推論輸出向量數。

收斂檔(pcn.cvr)

此檔存放兩種數值:(1) 誤判率:誤判的資料數佔整體資料的比例,數值愈 小表示該分類模型愈準確;(2)誤差均方根:可了解該預測模型所衡量的實際變 數Y 與預測變數 Y 的接近程度。其檔案內容格式如附錄表 A1-4。

附錄表A1 - 4 誤差均方根檔格式 週期 訓練範例

誤判率

測試範例 誤判率

訓練範例 RMS

測試範例 RMS

1

2

n

第一筆資料為尚未學習前的資訊;筆數n=學習循環數/測試週期數+1

連結權值檔(pcn.wei)

此檔存放著最後一次學習循環時每筆樣本所產生的最適權值,可以了解到輸 入變數的重要性及輸入變數對輸出變數間的關係。如表 A1-5 所示:

附錄表A1 - 5 連結權值格式

輸入層到隱藏層加權值

W

11

W

12

W

1 N, Inp

W

21

W

22

W

2 N, Inp

: : : :

1 ,

W

Nhid

W

Nhid,2

W

Nhid,NInp

隱藏層門限值 1 2Nhid

隱藏層到輸出層加權值

W

11

W

12

W

1,Nhid

W

21

W

22

W

2,Nhid

: : : :

1 ,

W

Nout

W

Nout,2

W

Nout,Nhid

輸出層門限值 1 2Nout

Ninp=輸入變數筆數;Nout=輸出變數筆數;Nhid=隱藏變數筆數。

A-2 使用範例

此處將以人為的線性二次(迴歸)例題(amsnn-10v)做為使用範例,以便使用者 熟悉操作此分類探勘程式。將逐步介紹所有操作步驟及所產生的相關輸出檔之檔 案內容解說,使用者可方便看出變數的特性,及變數之間的關係,進而了解本程 式。

範例說明:

] ) 5 . 0 (

8 ) 5 . 0 ( 4 ) 5 . 0 ( 2

) 5 . 0 ( 1 ) 5 . 0 ( 0 [ 4 8 4 2 1 0

2 10

2 9

2 8

2 7

2 6

5 4 3 2 1

X X

X

X X

X X X X X Y

在執行該程式前,首先,需備妥訓練範例檔(pcn.tra)、測試範例檔(pcn.tes) 與參數檔(pcn.net),隨後將執行檔(MRNN.EXE)與這三個數據檔放在同一資料 匣,即可執行。步驟如下:

步驟一、資料檔準備

將數據分成訓練範例檔(1000 筆樣本)與測試範例檔(100 筆樣本),兩範例檔 的資料都必需有10 個輸入變數與 2 個輸出變數。兩檔格式相同,只有數據不同,

如附錄圖A2-1 與附錄圖 A2-2 所示。X1~X10 分別屬於輸入變數,Y1、Y2 為輸 出變數。

附錄圖A2 - 1 訓練範例檔

步驟二、參數設定

附錄表A1-1 已有參數的格式介紹。此範例的參數設定方式,依順序分別為 輸入變數數目、第一隱藏層數目、第二隱藏層數目、輸出變數數目、訓練範例數 目、測試範例數目、訓練循環次數、測試週期數目…等,另外此範例中的 Gamma 值為1.0e-03。設定方式如附錄表 A2-1:

附錄表A2 - 1 參數設定檔

步驟三、程式執行

將MRNN.EXE 與訓練範例檔、測試範例檔及參數檔等放在同一資料匣,執 行MRNN.EXE。執行過程如附錄圖 A2-3,可以看到參數檔內的參數設定會在程 式執行前顯示,之後才顯示執行過程,執行過程中會顯示每次學習循環的訓練、

測試範例的誤判率及訓練、測試範例的誤差均方根。訓練完畢後,即產生收斂檔 (pcn.cvr)、結果檔(pcn.res),可從這些資料檔中得到有用的探勘資訊。

附錄圖A2 - 3 MRNN 執行畫面 步驟四、結果檢視

訓練完畢後,即產生收斂檔(pcn.cvr)、結果檔(pcn.res),可從這些資料檔中 得到有用的探勘資訊。各別說明如下:

收斂檔(pcn.cvr)

由收斂檔可得知在每一訓練循環過程中的收斂程度,愈小即表示收斂效果愈 好;若是值愈變愈大,則表示有發散情形發生。收斂檔結果如附錄圖A2-4。

附錄圖A2 - 4 收斂檔結果

結果檔(pcn.res)

結果檔裡存放的數據為「目標輸出向量」與「推論輸出向量」,將這兩組數 據載入Excel 檔裡,繪出散佈圖,由此圖可判斷這兩組輸出向量的相關性,其判 定係數愈大,則相關性愈大,代表此模型預測的愈準確。結果如附錄圖A2-5 所 示。

左邊為訓練範例誤差 均方根;右邊為測試 範例誤差均方根 左邊為訓練範例誤判

率;右邊為測試範例 誤判率

附錄圖A2 - 5 結果檔數據 A 欄為目標輸出向量;

B 欄為推論輸出向量

判定係數

A-3 流程圖

附錄圖A3 - 1 MRNN 之主要流程圖

訓練範例測試 循環開始

計算推論輸出向量 Y : (a) 計算隱藏層輸出向量 H (b) 計算推論輸出向量 Y

Itrain++

false

Itrain=0

Itrain<Ntrain

true

結束 計算訓練範例之 RMS

Error Rate

附錄圖A3 - 2 MRNN 之訓練範例測試循環流程圖

測試範例測試 循環開始

計算推論輸出向量 Y : (a) 計算隱藏層輸出向量 H (b) 計算推論輸出向量 Y

Itest++

false

Itest=0

Itest<Ntest

true

結束 計算測試範例之 RMS

Error Rate

附錄圖A3 - 3 MRNN 之測試範例測試循環流程圖

true

計算推論輸出向量 Y 學習循環開始

結束 false

Itrain<Ntrain Itrain=0

Itrain++

計算差距量δ

計算加權值矩陣修正量 ,

及門限值向 量修正量

更新加權值矩陣 ,

及門限值向量

附錄圖A3 - 4 MRNN 之學習循環流程圖

A-4 原始碼簡介

一、資料結構

此程式執行時,所使用的陣列結構如下列說明:

訓練與測試檔的陣列結構

X[Ninp]:存放訓練(或測試)範例的輸入向量。

H[Nhid]:存放訓練(或測試)範例的隱藏向量。

Y[Nout]:存放訓練(或測試)範例的目標輸出向量。

W_hy[][]:<hidden> to <output>權重值 W_xh[][]:<input> to <hidden>權重值 dW_xh[][]:W_xh加權值矩陣修正量 dW_hy[][]:W_hy加權值矩陣修正量 Theta_h:<hidden>門限值向量 Theta_y:<output>門限值向量

dTheta_h[]:<hidden>門限值向量修正量 dTheta_y[]:<output>門限值向量修正量 delta_h[]:<hidden>加權矩陣修正量 delta_y[]:< output >加權矩陣修正量

二、演算法

整個演算法的核心包括「測試循環」與「學習循環」。而「測試循環」包含 了「訓練範例測試循環」與「測試範例測試循環」,詳細解說如下:

初始設定

(1) 讀入控制參數:將參數檔(pcn.net)、訓練範例檔(pcn.tra)及測試範例檔(pcn.tes) 的輸入向量及目標輸出向量分別載入程式相對應的變數及二維陣列裡:

(2) 初始化相關參數 測試循環

(1) 求出「訓練範例測試循環」與「測試範例測試循環」的推論輸出向量 Y。

學習循環

(1) 計算推論輸出向量 Y。

(a) 計算隱藏層輸出向量 H (b) 計算推論輸出向量 Y (2) 計算差距量 δ

(a) 計算輸出層差距量 δ (b) 計算隱藏層差距量 δ

(3) 計算加權值矩陣修正量,及門限值向量修正量

(a) 計算輸出層加權值矩陣修正量,及門限值向量修正量 (b) 計算隱藏層加權值矩陣修正量,及門限值向量修正量 (4) 更新加權值矩陣,及門限值向量

(a) 更新輸出層加權值矩陣,及門限值向量 (b) 更新隱藏層加權值矩陣,及門限值向量

(5) 重覆步驟 1 至步驟 4,直到收斂。

A-5 原始碼列出

#include <stdio.h>

#include <float.h>

#include <math.h>

#include <time.h>

main() {

float rand_0_1(float r);

float sexp(float x);

float W_xh[50][50],W_hy[50][50];

float dW_xh[50][50],dW_hy[50][50];

float Theta_h[50],Theta_y[50];

float dTheta_h[50];

float dTheta_y[50];

float X[50],H[50],Y[50],desire_Y[50];

float delta_h[50]; //隱藏層加權矩陣修正量 float delta_y[50]; //輸出層加權矩陣修正量

float eta,eta_rate,eta_min;

float alpha,alpha_rate,alpha_min;

/* For MRNN -- begin */

float gamma;

float lambda1;

float lambda2;

/* For MRNN -- end */

float w_bound,random_0_1,random_seed;

float sum,max,min;

float rms_test,rms_train;

float error_train,error_test;

int i,h,j;

int Ninp,Nhid,Nout;

int Nhid1,Nhid2;

int Icycle,Itrain,Itest;

int Ncycle,Ntrain,Ntest;

int N_test_period;

int I_input_weight,Ibatch;

int jmaxY,jmaxY_desire;

int now1,now2,now3,now4;

int RModel;

FILE *file5,*file6,*file7,*file8,*file9,*file10,*file12,*fopen();

file5=fopen("pcn.net","r");

file6=fopen("pcn.res","w");

file7=fopen("pcn.tra","r");

file8=fopen("pcn.cvr","w");

file9=fopen("pcn.tes","r");

file10=fopen("pcn.wei","r");

file12=fopen("pcn.tm3","w");

//STEP 1 :

/*--- input control parameter ---*/

/* */

/* */

/*---*/

printf("Input Hiden1 Hiden2 Output \n");

fscanf(file5,"%d %d %d %d",&Ninp,&Nhid1,&Nhid2,&Nout);

printf("%-10d%-10d%-10d%-10d\n",Ninp,Nhid1,Nhid2,Nout);

printf("Ntrain Ntest Ncycle N_test_period\n");

fscanf(file5,"%d %d %d %d",&Ntrain,&Ntest,&Ncycle,&N_test_period);

printf("%-10d%-10d%-10d%-10d\n",Ntrain,Ntest,Ncycle,N_test_period);

printf("Ibatch I_input_weight\n");

fscanf(file5,"%d %d",&Ibatch,&I_input_weight);

printf("%-10d%-10d\n",Ibatch,I_input_weight);

printf("w_bound random_seed\n");

fscanf(file5,"%f %f",&w_bound,&random_seed);

printf("%-10.5f%-10.5f\n",w_bound,random_seed);

fscanf(file5,"%f %f %f",&eta,&eta_rate,&eta_min );

printf("%-10.5f%-10.5f%-10.5f\n",eta,eta_rate,eta_min);

printf("alpha alpha_rate alpha_min\n");

fscanf(file5,"%f %f %f",&alpha,&alpha_rate,&alpha_min );

printf("%-10.5f%-10.5f%-10.5f\n",alpha,alpha_rate,alpha_min);

/* For MRNN -- begin */

printf("gamma\n");

fscanf(file5,"%f",&gamma );

printf("%-10.5f\n",gamma );

lambda1 = gamma / sqrt(Ninp*Nhid1);

lambda2 = gamma / sqrt(Nhid1*Nout);

/* For MRNN -- end */

fscanf(file5,"%d",&RModel);

printf("Run Model (Train=1, Verify or Apply=2): %1d\n\n",RModel);

Nhid=Nhid1;

if(RModel==2) {

Ntrain=1;

Ncycle=1;

N_test_period=1;

eta=0.0;

eta_min=0.0;

I_input_weight=1;

}

//STEP 2 : 以均佈隨機亂數設定加權值矩陣 、門限值向量初始值 。 /*--- initial dW ---*/

for(j=0;j<Nout;j++) {

for(h=0;h<Nhid;h++) {

dW_hy[h][j]=0.0;

}

}

for(j=0;j<Nout;j++) {

dTheta_y[j]=0.0;

}

for(h=0;h<Nhid;h++) {

for(i=0;i<Ninp;i++) {

dW_xh[i][h]=0.0;

} }

for(h=0;h<Nhid;h++) {

dTheta_h[h]=0.0;

}

//STEP 3 : 輸入一個訓練範例的輸入向量

/*--- initial W ---*/

switch(I_input_weight) {

case 1: //當 RModel = 2 時, I_input_weight = 1.

for(h=0;h<Nhid;h++) {for(i=0;i<Ninp;i++)

{ fscanf(file10,"%f",&W_xh[i][h]); } }

for(h=0;h<Nhid;h++)

{ fscanf(file10,"%f",&Theta_h[h]); }

for(j=0;j<Nout;j++) {for(h=0;h<Nhid;h++)

{ fscanf(file10,"%f",&W_hy[h][j]); } }

for(j=0;j<Nout;j++)

{ fscanf(file10,"%f",&Theta_y[j]); }

default:

random_0_1=rand_0_1(random_seed);

for(j=0;j<Nout;j++) {

for(h=0;h<Nhid;h++) {

random_0_1=rand_0_1(random_0_1);

W_hy[h][j]=w_bound*(2.0*random_0_1-1.0);

} }

for(j=0;j<Nout;j++) {

random_0_1=rand_0_1(random_0_1);

Theta_y[j]=w_bound*(2.0*random_0_1-1.0);

}

for(h=0;h<Nhid;h++) {

for(i=0;i<Ninp;i++) {

random_0_1=rand_0_1(random_0_1);

W_xh[i][h]=w_bound*(2.0*random_0_1-1.0);

} }

for(h=0;h<Nhid;h++) {

random_0_1=rand_0_1(random_0_1);

Theta_h[h]=w_bound*(2.0*random_0_1-1.0);

}

} /* end of switch */

/*--- start learning ---*/

/* */

/* */

/*---*/

printf("Train Train Test Train Test\n");

printf("Cycle Error Rate Error Rate RMS RMS \n");

for (Icycle=0;Icycle<Ncycle;Icycle++) {

/*--- start testing ---*/

/* */

/*---*/

if( ( (Icycle+1) % N_test_period )==0 || Icycle==0 ) {

/*--- training examples testing ---*/

fseek(file7,0,0);

rms_train=0.0;

error_train=0.0;

for (Itrain=0;Itrain<Ntrain;Itrain++) {

for(i=0;i<Ninp;i++) //Input Data

{fscanf(file7,"%f",&X[i]);/*printf("X=%f\n",X[i]);*/}

for(j=0;j<Nout;j++) //Output Data

{fscanf(file7,"%f",&desire_Y[j]);/*printf("Y=%f\n",desire_Y[j]);*/}

for(h=0;h<Nhid;h++) {

sum=0.0;

for(i=0;i<Ninp;i++) {

sum=sum+X[i]*W_xh[i][h];

}

H[h]=1.0/(1+sexp(-(sum-Theta_h[h])));

}

for(j=0;j<Nout;j++) {

sum=0.0;

for(h=0;h<Nhid;h++) {

sum=sum+H[h]*W_hy[h][j];

}

}

for(j=0;j<Nout;j++) {

rms_train=rms_train+(Y[j]-desire_Y[j])*(Y[j]-desire_Y[j]);

}

max=-1.e+10;

jmaxY=0;

for(j=0;j<Nout;j++) {

if(Y[j]>max) {

max=Y[j];

jmaxY=j;

} }

max=-1.e+10;

jmaxY_desire=0;

for(j=0;j<Nout;j++) {

if(desire_Y[j]>max) {

max=desire_Y[j];

jmaxY_desire=j;

} }

if(jmaxY!=jmaxY_desire)error_train=error_train+1;

}

/*--- testing examples testing ---*/

fseek(file9,0,0);

rms_test=0.0;

error_test=0.0;

for (Itest=0;Itest<Ntest;Itest++) {

for(i=0;i<Ninp;i++)

{fscanf(file9,"%f",&X[i]);/*printf("X=%f\n",X[i]);*/}

for(j=0;j<Nout;j++)

{fscanf(file9,"%f",&desire_Y[j]);/*printf("Y=%f\n",desire_Y[j]);*/}

for(h=0;h<Nhid;h++) {

sum=0.0;

for(i=0;i<Ninp;i++) {

sum=sum+X[i]*W_xh[i][h];

}

H[h]=1.0/(1+sexp(-(sum-Theta_h[h])));

}

for(j=0;j<Nout;j++) {

sum=0.0;

for(h=0;h<Nhid;h++) {

sum=sum+H[h]*W_hy[h][j];

}

Y[j]=1.0/(1+sexp(-(sum-Theta_y[j])));

}

/*--- Output results ---*/

if(Icycle==Ncycle-1) {

for(j=0;j<Nout;j++) {

fprintf(file6,"%5.3f ",desire_Y[j]);

if( ((j+1)%40)==0 ) fprintf(file6,"\n");

}

for(j=0;j<Nout;j++) {

fprintf(file6,"%5.3f ",Y[j]);

if( ((Nout+j+1)%40)==0 ) fprintf(file6,"\n");

}

fprintf(file6,"\n");

}

for(j=0;j<Nout;j++)

rms_test=rms_test+(Y[j]-desire_Y[j])*(Y[j]-desire_Y[j]);

}

max=-1.e+10;

jmaxY=0;

for(j=0;j<Nout;j++) {

if(Y[j]>max) {

max=Y[j];

jmaxY=j;

} }

max=-1.e+10;

jmaxY_desire=0;

for(j=0;j<Nout;j++) {

if(desire_Y[j]>max) {

max=desire_Y[j];

jmaxY_desire=j;

} }

if(jmaxY!=jmaxY_desire)error_test=error_test+1;

}

/*--- output rms_test ---*/

rms_train=sqrt(rms_train/(Ntrain*Nout));

rms_test=sqrt(rms_test/(Ntest*Nout));

error_train=error_train/Ntrain;

error_test =error_test /Ntest ;

printf("%5d %10.5f %10.5f %10.5f %10.5f\n", Icycle+1,error_train,error_test,rms_train,rms_test);

fprintf(file8,"%5d %10.5f %10.5f %10.5f %10.5f\n", Icycle+1,error_train,error_test,rms_train,rms_test);

} /* end of testing */

/*--- input one training example ---*/

/* */

/*---*/

fseek(file7,0,0);

if(Icycle==0) time(&now1);

for (Itrain=0;Itrain<Ntrain;Itrain++) {

for(i=0;i<Ninp;i++) {fscanf(file7,"%f",&X[i]);}

for(j=0;j<Nout;j++)

{fscanf(file7,"%f",&desire_Y[j]);}

/*... compute H, Y ...*/

//Step 4-a : 計算隱藏層輸出向量 for(h=0;h<Nhid;h++)

{

sum=0.0;

for(i=0;i<Ninp;i++) {

sum=sum+X[i]*W_xh[i][h];

}

H[h]=1.0/(1+sexp(-(sum-Theta_h[h])));

}

//Step 4-b : 計算推論輸出向量 for(j=0;j<Nout;j++)

{

sum=0.0;

for(h=0;h<Nhid;h++) {

sum=sum+H[h]*W_hy[h][j];

}

Y[j]=1.0/(1+sexp(-(sum-Theta_y[j])) );

}

// 5-a : 輸出層差距量 for(j=0;j<Nout;j++) {

delta_y[j]=Y[j]*(1.0-Y[j])*(desire_Y[j]-Y[j]);

//=(Tj-Yj) * Yj * (1-Yj) }

// 5-b : 隱藏層差距量 for(h=0;h<Nhid;h++) {

sum=0.0;

for(j=0;j<Nout;j++) {

sum=sum+W_hy[h][j]*delta_y[j];

}

delta_h[h]=H[h]*(1.0-H[h])*sum;

}

//STEP 5 : End

/*... compute dW ...*/

//STEP 6 : 計算加權值矩陣修正量,及門限值向量修正量 if(Ibatch==0) //一般都為 0

{

//6-a : 計算輸出層加權值矩陣修正量,及門限值向量修正量 for(j=0;j<Nout;j++)

{

for(h=0;h<Nhid;h++) {

/* For MRNN -- begin */

double fSum = 0.0;

double fSubSum = 0.0;

int I,K;

for(I=0;I<Ninp;I++) {

for(K=0;K<Nhid;K++) {

fSubSum +=

(Y[j]*(1-Y[j]))*(H[K]*(1-H[K]))*(W_xh[I][K]*W_hy[K][j]);

}

fSum += (Y[j]*(1-Y[j]))*(H[h]*(1-H[h]))*fSubSum*W_xh[I][h];

}

在文檔中 碩 士 論 文 中 華 大 學 (頁 63-97)

相關文件