• 締切済み

3層の階層型ニューラルネット(逆誤差伝播法)

入力層、中間層、出力層の計3層です。 中間層の出力関数にはシグモイド関数、出力層の出力関数には線形関数を用います。閾値はありません。 わからないのは逆方向処理のところです。慣性項を付加したプログラムを組もうと思っているのですが、結合荷重の修正量を求めるところがわかりません。 素人なのでわかりにくい書き方かもしれませんがよろしくお願いします。

みんなの回答

  • hotap
  • ベストアンサー率12% (11/90)
回答No.3

ぱっと見たんでアルゴニズムを忠実に再現できているかは確認していませんが d_wkj[k][j]= ETA*d_k[k]*y[j]; を d_wkj[k][j]= ETA*d_k[k]*y[j] + alpha*d_wkj[k][j]; alpha(0<=alpha<1) にすれば良いはずです。 各バイアスや中間層の結合加重にしても同じです。

goo_taro1982
質問者

お礼

どうもありがとうございます。 もう少し勉強してみます。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

プログラム化する式と、分かっている分(「慣性項を付加」していないもの)をプログラムにしたもの、それとそのプログラム内の変数と元の式の要素との対応関係を補足説明していただくことはできますか。 もちろん、元の式やプログラムを全部提示するのは分量的に無理でしょう(し、そうされても読む人はあまりいないでしょう)から、要点部分のみのほうが望ましいです。 なお、要点を挙げるにあたっては 「真・技術系メーリングリスト FAQ」 http://www.geocities.co.jp/SiliconValley/5656/  第5章 質問はしてみたけれど・・・   Q:「ソースを見せてください」と言われました。 守秘義務があるので見せられないのですが、どうすれば良いでしょうか? が参考になるかと思います。(これ以外の項目も、メーリングリストに限らず、質問を行う場合に役に立つ情報なので必読です。)

goo_taro1982
質問者

補足

iMAX:入力層の数 x:入力層 jMAX:中間層の数 y:中間層 kMAX:出力層の数 z:出力層 wkj:結合荷重(出力層) d_j:中間層のユニットに対する誤差 d_k:出力層のユニットに対する誤差 ts:目標出力 Ep:入力信号と目標出力との相対誤差 ETA:学習率 for(k=0; k<kMAX; k++){ d_k[k]= ts[k]-z[k]; Ep[p]= fabs(ts[k]-z[k])/ts[k]; } for(k=0; k<kMAX; k++){ for(j=0; j<jMAX; j++){ d_wkj[k][j]= ETA*d_k[k]*y[j]; wkj[k][j]= wkj[k][j]+ d_wkj[k][j]; } } for(j=0; j<jMAX; j++){ sum[j]= 0.0; for(k=0; k<kMAX; k++){ sum[j]= sum[j]+ d_k[k]* wkj[k][j]; } d_j[j]= sum[j]*y[j]*(1.0-y[j]); } 慣性項を付加していない場合のプログラムです。中間層の結合荷重の修正部分は出力層のそれと変数が変わるだけで基本的に同じなので省略させていただきます。よろしくお願いします。

noname#29127
noname#29127
回答No.1

誤差逆伝播法に関して勉強してみてください。 下記で修正量計算のサンプルプログラムもあったと思います。 http://www.cmplx.cse.nagoya-u.ac.jp/~tokura/data/NNstudy/

関連するQ&A

  • 4階層型ニューラルネット(逆伝播法)

     現在、実験のために4階層型のニューラルネットを作成しているのですが上手く収束しません。使用は入力層、中間層2層、出力層の計4層です。  各変数はo1が入力ユニットからの出力、o2とo3は中間層ユニットの出力、o4が出力層ユニットの出力です。w43,w32,w21はそれぞれの結合強度です。biasはそのままバイアスです。変数の前にdがついてるものは変化を表したものです。etaは学習率、alphaは慣性項係数です。この値と中間層ユニット数を変更してみても収束しませんでした。  問題があるのは逆伝播法での結合強度の更新です。以下にそのルーチンを示しますのでお気づきの点がありましたらお願いします。特に問題があるのは中間層~入力層間についてだと思うのですが。。  ご意見お願いします。また、よろしければ4層以上のニューラルネットについてのサイトがあればお願いします。

  • 3層構造 階層型ニューラルネットワークについて

    入力層、中間層、出力層の3層構造からなる基本的な階層型ニューラルネットワークの結合荷重値はどのようにして与えられるのでしょうか? また、中間層のニューロンの数はどのようにして決められるのでしょうか?入力層のニューロンの数と相関があるのでしょうか?中間層が多層の場合、1層のニューロンの数はみな同じですか?

  • ニューラルネットの教師あり学習について質問です。

    最近誤差逆伝搬法を用いたニューラルネットについて プログラムを組んで実装してみようと思ったのですが あまり理解できていない部分があるのでよろしくお願いします。 私が作りたいのはフォントの違う数字画像の認識を 3つの特徴量(a,b,c)、3層のニューラルネット、 閾値関数にシグモイド関数、教師有り学習で作りたいのですが、 私の理解があっているかわからないのでご指摘をお願いします。 ・入力層は特徴量が3つなのでニューロンは3つ(a,b,cを入力)。 ・中間層は任意でいいということなので10つ。 ・出力層は数字が0~9までなので10つ。 教師ベクトルの与え方なのですが 出力層(0~9番とします)において各数字に対応する番号のニューロンは1、それ以外は0、 つまり 出力層の0番の教師ベクトルは{1,0,0,0,0,0,0,0,0,0} 1番目の教師ベクトルは{0,1,0,0,0,0,0,0,0,0} 9番目の教師ベクトルは{0,0,0,0,0,0,0,0,0,1} (シグモイド関数のため正確には0、1にはなりませんが・・) とあらかじめ決めておき、 教師ベクトルの学習の際は 0の画像ならば出力層は{1,0,0,0,0,0,0,0,0,0}^T となるように誤差逆伝搬を用いて中間層・出力層の重みの修正を行い、 同様に1~9の教師画像も対応する出力の番号以外0となるように 学習を行い、 識別を行いたい画像の特徴量を入力した際は 重みの修正は行わず 10この出力の誤差が最小となる教師ベクトルが第一候補、 誤差が最大となる教師ベクトルが第10候補 ということでよろしいのでしょうか? でもそうすると重みの値が一番最後に学習した教師ベクトルに 対応する重みになっているから ニューラルネット自体を10個つ用意する必要が ありますよね・・・? いま一つ理解できていないのでよろしくお願いします。

  • 4階層型ニューラルネットワークで学習(準ニュートン法)

    準ニュートン法の学習方法の中に出てくるヘッセ行列の逆行列の近似行列Hについてなんですが、よく最適化についての本に更新式が載っているのを見るのですけど、(DFP法やBFGS法)アルゴリズムの中に探索方向の計算についてあるんですが、4層のニューラルネットに準ニュートン法を導入すると、それぞれ入力層-中間層1と中間層1-中間層2と中間層2-出力層の3つの所でそれぞれ重みwや微分式∇f(w)の更新を行うと思うのですが、このときにHをそれぞれの層間で探索方向を用いて次のHを更新するみたいですが、このHはよく初期値として単位行列を設定しているようなのですが、これはそれぞれの層のユニット数を同じにする必要とかあるのでしょうか?例えば中間1-2層のユニット数は10個とか

  • バックプロパゲーション(誤差逆伝播法)について質問です

    ニューラルネットのバックプロパゲーション(BP)について勉強してますが、いまいち理解できないところがあります。どなたかご教示ください。 中間層のあるニューロンj の結合加重を更新するとき 一つ後の層のニューロンの誤差の総和を反映させると書いてあったのですが、 誤差 E は    E = 1/2Σ(t_k - out_k)^2       t_k=ニューロンkの教師信号、out_k=kの出力 で与えられますが、 例えば仮に10層くらいのネットワークがあって、第3層の あるニューロンj の結合加重を更新するときも、その一つ後ろの第4層のニューロンの誤差の総和を計算する必要があるんですか?。誤差って何と何の誤差なんでしょうか? またそのニューロンj は教師信号と関わってくるんでしょうか?、 説明が分かりにくかったらすいません…どなかご存知でしたら教え下さい。

  • ニューラルネットワークの正規化されたデータを元に戻すには

    ニューラルネットワークで正規化し、パラメータを求めた後、パラメータの正規化をもとに戻したいのですが、方法が分かりません。 以下は、私がやっている途中を示します。 たとえば、データの入力が年齢と身長、出力が体重のデータがあるとします。 年齢x1  身長x2   体重y 21    160     55 24    172     63 私は、正規化するために  x1’=(x1-ave(x1))/std(x1)  x2’=(x2-ave(x2))/std(x2)  y’=(y-ave(y))/std(y) として正規化しました。aveは平均、stdは標準偏差 ニューラルネットとしては、次の式で表される三層パーセプトロンを利用しています。  f=W0+Σ{Wj*hj} Σはj=1からJまで  (中間層-出力層)  hj=sigmoid(Σ{Wjk*xk’}) Σはk=1,2  (入力層-中間層)  Error=(f-y’)*(f-y’) 入力層のバイアスはなしで、中間層のバイアスはありを考えています。 活性化関数は、中間層がシグモイド関数、出力層が線形関数です。 正規化したxとyに対して各wを求めるプログラムは作れたのですが、 ここからどうやってwの正規化を解除すればよいか分かりません。 正規化する方法は載っているサイトはいくつかあるのですが、解除する 方法が載っているのは見つかりませんでした。 回答よろしくお願いします。

  • 階層型ニューラルネットに準ニュートン法のDFPを用いて学習するプログラムをC言語で作成する

    //出力層と中間層2の結合荷重を更新 for ( i = 0; i < NUM_hh+1; i++)   {  for ( j = 0; j < NUM_o; j++) { deltaw3[i][j][ilearn+1] = (y[j] - teach[j]) * y[j] * (1.0 - y[j]) * hh[i]; w3[i][j][ilearn+1] = w3[i][j][ilearn] -0.05 * H2[i][j][ilearn] * deltaw3[i][j][ilearn]; //中間層2と中間層1の結合荷重更新 for ( i = 0; i < NUM_hh+1; i++ )  {   net_input1[j] = 0;  for ( j = 0; j < NUM_o; j++ )   { net_input1[j] += w3[i][j][ilearn] * deltaw3[i][j][ilearn];   }     net_input1[i] = net_input1[j];  } for ( i = 0; i < NUM_h+1; i++)  {  for ( j = 0; j < NUM_hh; j++)   { deltaw2[i][j][ilearn+1] = net_input1[j] * (1.0 - hh[j]) * h[i]; w2[i][j][ilearn+1] = w2[i][j][ilearn] - (0.005 * H2[i][j][ilearn] * deltaw2[i][j][ilearn] );   }  } //中間層1と入力層の結合荷重更新 for ( i = 0; i < NUM_h; i++ )  {  net_input2[j] = 0;  for ( j = 0; j < NUM_hh; j++ )   {  net_input2[j] += w2[i][j][ilearn] * deltaw2[i][j][ilearn];   }  net_input2[i] = net_input2[j];  } for ( i = 0; i < NUM_i+1; i++)  {  for ( j = 0; j < NUM_h; j++)   { deltaw1[i][j][ilearn+1] = net_input2[j] * (1.0 - h[j]) * x[i]; w1[i][j][ilearn+1] = w1[i][j][ilearn] - (0.005 * H2[i][j][ilearn] * deltaw1[i][j][ilearn] );   }  } for ( i = 0; i < NUM_h; i++) // Hの更新 //  {   for ( j = 0; j < NUM_hh; j++)   { sigma2[i][j] = w2[i][j][ilearn+1] - w2[i][j][ilearn]; gamma2[i][j] = deltaw2[i][j][ilearn+1] - deltaw2[i][j][ilearn];   }  } for ( i = 0; i < NUM_h; i++) {  for ( j = 0; j < NUM_hh; j++)   { H2[i][j][ilearn+1] = H2[i][j][ilearn] + ((sigma2[i][j] * sigma2[j][i]) / (sigma2[j][i] * gamma2[i][j])) - ((H2[i][j][ilearn]*gamma2[i][j]*gamma2[j][i]*H2[i][j][ilearn])/(gamma2[j][i]*H2[i][j][ilearn]*gamma2[i][j]));   } } プログラムの最初に戻り学習を繰り返す。 準ニュートン法(DFP)を階層型ニューラルネットに用いて学習を行うプログラムを作成しているのですが、ヘッセ行列の逆行列を更新がうまくできず、学習ができません。どこに問題があるのかわからず困っています。。 ※各層のニューロン数は、NUM_i:5 NUM_hhとNUM_h:30 NUM_o:31 w123は結合荷重、deltaw123は勾配 gamma2は勾配の差分 sigma2は結合係数の差分 学習結果を見るために関数近似を行ってます。誤差は二乗誤差を用いているのですが、結果が学習回数2回目辺りから1.#qNaN0になり、それ以降は-1.#ind00という出力になってしまいます。

  • 単層パーセプトロンで非線形は表せない?

    単層パーセプトロンは,線形非分離な問題は解けないと以下の記事に書かれています. (http://wkp.fresheye.com/wikipedia/%E3%83%91%E3%83%BC%E3%82%BB%E3%83%97%E3%83%88%E3%83%AD%E3%83%B3?pg=1) 単層パーセプトロンの出力fは,  f=g(ΣWi*Xi) と表せます. 考えやすいように,入力は,2次元と仮定します. ΣWi*Xiは,線形なので直線でデータを分割していると考えられます. g(・)が符号関数なら,0か1を出力するので,直線でデータを0か1という二つのグループに分割します.つまり,線形分離のみ解ける. g(・)が非線形関数の場合がよくわかりません. 私のイメージでは,g(・)がシグモイド関数なら,データを分割する もとの識別面は直線であるが,シグモイド関数は非線形なので, 識別面は非線形化される気がしてます. つまり,非線形な識別面で分割するので,非線形分離の問題も解ける気 がしてならないのですが,とらえかたとしてどこが間違っているのでしょうか? 幾何的イメージが与えられるとありがたいです. 回答よろしくお願いします.

  • ニューラルネットワークでのバイアス項と活性化関数について

    ニューラルネットワークについて http://mars.elcom.nitech.ac.jp/java-cai/neuro/menu.html を参考に勉強しています. 1. ニューラルネットワークのあるノードの出力は,前層のノードの重み和で表され,  out_i = Σ{W_ji*x_j}  from j=0~n となる. ここで,バイアス項として,W_0i,x_j0=1.0 というのがあるのですが, このバイアス項はどういう役割をするためにあるのでしょうか? 2. ノードx_iへの出力は,活性化関数g を用いて,  x_i = g(out_i) となる. ここで,「活性化関数は非線形関数でなければならない」というふうに 言われているのですが,なぜ非線形でなければならないのでしょうか? 以上の1.2.について御教授お願いします.

  • ロジスティックとニューラルネットワークの違い

    ロジスティック回帰分析とニューラルネットワークの明確な違いを説明できる方がおられましたら、教えていただけないでしょうか。 ニューラルネットワーク(多層構造&バックプロパゲーション)も中間層での計算は、ロジスティックなので、考え方によっては2重、3重のロジスティックと考えられないこともないと思うのですが・・・(慣性項は含まれていますが)。

専門家に質問してみよう