• 締切済み

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

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

  • 科学
  • 回答数1
  • ありがとう数2

みんなの回答

  • walkingdic
  • ベストアンサー率47% (4589/9644)
回答No.1

プログラムを組んだのはもうかなり昔のことなので、正確に覚えていませんが、わかる範囲で書くと、 誤差Eを最小とするように各層の結合加重wを変えていくわけなのですが、そのための、wを変化させる修正量Δwは、dE_k/dw(偏微分)になるので(E_kはニューロンkの誤差、E=Σ E_k)、を計算すれば出力層の入力部結合加重wの修正量Δwは計算できます。 実際の計算では上記の通りEをそのまま計算するのではなく、偏微分した式で計算します。で、中間層については、その前段の修正量Δwから計算できる仕組みです。つまり最終段では教師信号t_kが出てきますけど、中間層では後段の修正量から求めることになります。 つまり誤差としては、教師信号と実際の出力信号の差の二乗なのですが、中間層ではその誤差を逆に伝播させます。その伝播のさせ方として、後段の修正量Δw(これに誤差Eが含まれている)を利用して伝播していくことになります。

mgh072
質問者

お礼

お返事ありがうございます。 なんか分かりかけてきたような気がします… 実際にプログラムを組んでやってみます…ありがとうございました

関連するQ&A

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

    最近誤差逆伝搬法を用いたニューラルネットについて プログラムを組んで実装してみようと思ったのですが あまり理解できていない部分があるのでよろしくお願いします。 私が作りたいのはフォントの違う数字画像の認識を 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階層型ニューラルネット(逆伝播法)

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

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

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

  • C言語で準ニュートン法(DFP法)でヘッセ逆行列を近似する

    階層型ニューラルネットワーク(4層)で準ニュートン法を用いて関数近似を 行っているのですが、ヘッセ行列の逆行列をDFP法を用いて更新を行っています。しかしヘッセ行列の更新をどのように行えばいいのかわからず、そのためにプログラムの誤差評価関数(error)の式がうまく出力できません。なぜか-1.#ind00や1.#qNaN(?)のようなエラーが出てきてしまいます。どなたか教えていただけると助かります。

  • プログラミングの問題

    1.皮膚感覚における情報処理機構及び機能に関する神経細胞の働きにはどういったことがありますか? 2.3層階層型ニューラルネットに誤差逆伝搬学習アルゴリズム適用して符号化問題の機能を実現するプログラムを自作し実行するやり方を教えて下さい。プログラムを自作したら、学習パターンと教師信号の組をランダムに入力して学習し、学習終了後の結合荷重を用いて学習入力、学習出力、教師信号を対比して示してほしいです。また、学習後の結合荷重としきい値は機能を実現するための内部表現になっているのでその特徴を教えてほしいです。 符号化問題 入力ユニット数:8、隠れユニット数:3、出力ユニット数:8として、入力信号と教師信号が同じになるように、それぞれ下記の8つの信号を学習させる情報圧縮ニューラルネット・学習終了後の入力パターンに対する出力ユニット及び隠れユニットの出力値の示して下さい。 入力信号(1,0,0,0,0,0,0,0),(0,1,0,0,0,0,0,0),・・・(0,0,0,0,0,0,0,1)         ↓          ↓             ↓ 教師信号(1,0,0,0,0,0,0,0),(0,1,0,0,0,0,0,0),・・・(0,0,0,0,0,0,0,1) どうかよろしくお願いします。

  • 階層型NNの複数INPUTパターンへの対応

    現在、階層型(3層)ニューラルネットワークを利用して、システムパラメタのメモリとして活用しようと考えております。 現在、良く分からない問題点が、複数のINPUTパターンに対してNNの出力がうまく教師信号に対応することができないことです。もちろん、ひとつのINPUTパターンではうまくいきます。 この問題点を例を挙げて説明します。 (1)複数のINPUTパターンとそれに対応する教師信号を乱数で生成します。 -*-*-*-*- INPUT -*-*-*-*- | -*-*-*-*- 教師信号 -*-*-*-*- 0.015 0.845 0.112 | 0.551 0.456 0.121 0.225 0.365 0.555 | 0.841 0.453 0.231 0.199 0.846 0.745 | 0.715 0.166 0.011 (2)back propagationを用いてNNの学習 もちろんだと思いますがここが一番重要で、現在使用しているアルゴリズムの方法論を以下にmatlab形式の擬似言語で流れを書きました。 For 1:loopNUM % 複数INPUTパターンの繰り返し学習ループ dataNUM = 1; % INPUTパターンの初期化 For 1:dataNUM % INPUTパターンの変更ループ For 1:learningNUM % 各INPUTパターンの学習回数 NNOUTPUT = NN(INPUT(dataNUM,:)); % NNの出力 ERROR = ERROR_BP(NNOUTPUT,TEACH(dataNUM,:)); % このときの出力と教師信号との誤差(hidden layer, output layer) WEIGHT = weightUPDATE(ERROR); % 誤差から重み係数(閾値も)を学習。更新 end end end という感じでプログラムを進行させ、この後複数のINPUTをNNに順番に入力したところ、上手くいきませんでした。HIDDEN層の数を変えてみたり(だいたい10個前後)しましたが、だめでした。 ふがいない説明で申し訳ありませんが、どなたかご教授お願い致します。

  • 階層型ニューラルネットに準ニュートン法の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という出力になってしまいます。

  • サーミスタの電気抵抗測定実験の誤差について

    抵抗の誤差の計算方法がわかりません。 ホイートストン・ブリッジを用いて、半導体の抵抗の温度依存についての実験をしました。 この際に、原理として R=R0*e^(Eg/2kT) ・・・(1) は与えられています。(R0:273.15℃での抵抗[Ω]、 k:ボルツマン定数=1.38*10^(-23)[J/K]、 Eg:エネルギーギャップ=8.8605*10^(-20)[J]、T:水温[K]) 温度の誤差は約1℃として求める、とあるので、 dT=1[K] これと(dR/dT)の値を dR=(dR/dT)*dT に代入すれば、抵抗の測定誤差dRを求められると思うのですが、 (dR/dT)の値がうまく計算できていないように感じます。 上式のRを微分すると、 (dR/dT)=R0*(-1)*(Eg/2k)*e^(Eg/2kT) となると思うのですが、最小二乗法で求めたRo=28675[Ω],(Eg/2k)=3208.8[Ω/K] という値を代入すると、 (dR/dT)=-1.16*10^13[Ω] となり、 dR=(dR/dT)*dT   =-1.16*10^13*1 =-1.16*10^13[Ω] と、恐ろしく大きくなってしまいます。 ところが過去レポを見たところ、(1)式が y=23485*e^(-0.03/T) (dR/dT)=23485*(-0.03)e^(-0.03*23) =-353.385[Ω] となっています。 これを見る限り(Eg/2k)の値が違うようなのですが、 (Eg/2k)は 自分の値:Eg=8.8605*10^(-20)[J] 過去レポ:Eg=9.12921*10^(-20)[J] でほぼ差がないことや、テキストによるとEg=0.5~0.6[eV]であることから[J]に換算しても Egの値は間違っていないと思います。また、kはボルツマン定数であるので、 なぜここまで値が異なるのか、途方にくれています。 なぜeの指数で23をかけているのかもよくわかりません。 非常に分かりづらい説明で心苦しいのですが、回答お願いします。

  • 実際のニューロンの出力先が複数か単数かについて

    いくら探しても無かったので質問させていただきます。 今私はニューラルネットワークを学ばんとす。 階層型NNだと出力が配列になっていて、例えばある入力層の素子からは全ての中間層の素子に向かって軸索が伸びています。 では実際の、私たちの頭の中のニューロンは、出力先が複数あるのですか? いろんなサイトを見ていますと、「出力先は1つである」という明記が無いけれども、イラストなんかを見てると必ず出力次数が1なんですよ。入力次数は4つとかあって。 で、出力次数が1の場合を考えていましたら、「無意味な閉回路」「フィードバックはありえない」というおかしな問題に気付きました。 「ニューロンABCDがあります。A→B→C→Dという順に出力先を結合します」 「次に、Dの出力先を辿るとAがある場合、閉回路ができあがり、このニューロン集合からはいかなる出力も生み出されません。Dの出力先を辿ってもAが絶対に出ない場合、ラストは末端の出力素子につながっていると考えられますが、フィードバックを利用するようなNNは作れない」 ということです。やはり生ニューロンの出力軸索は複数本あるのですか?どんなイラストを見ても1本なのですが。 伝わりましたでしょうか。随時補足させて頂きます。宜しくお願いします。

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

    ニューラルネットワークについて 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.について御教授お願いします.