• 締切済み

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

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

みんなの回答

  • eh02m031
  • ベストアンサー率0% (0/0)
回答No.1

上の質問のプログラムです。 void Bprop(p) int p; { int i,j,k,l; /*loop counter*/ double d2[nnuni],d3[nnuni2],d4[out]; /*temp*/ double sum[nnuni2],sum2[nnuni]; for(k=0;k<nnuni2;k++){ sum[k]=0.0; for(l=0;l<out;l++){ d4[l] = (t[p][l]-o4[l])*o4[l]*(1-o4[l]); dw43[l][k] = eta*d4[l]*o3[k] + alpha*dw43[l][k]; w43[l][k] += dw43[l][k]; sum[k] += d4[l]*w43[l][k]; } } for(l=0;l<out;l++){ dbias4[l] = eta*d4[l] + alpha*dbias4[l]; bias4[l] += dbias4[l]; } for(j=0;j<nnuni;j++){ sum2[j] = 0.0; for(k=0;k<nnuni2;k++){ d3[k] = o3[k]*(1-o3[k])*sum[k]; dw32[k][j] = eta*d3[k]*o2[j] + alpha*dw32[k][j]; w32[k][j] += dw32[k][j]; sum2[j] += d3[k]*w32[k][j]; } } for(k=0;k<nnuni2;k++){ dbias3[k] = eta*d3[k] + alpha*dbias3[k]; bias3[k] += dbias3[k]; } for(i=0;i<in;i++){ for(j=0;j<nnuni;j++){ d2[j] = o2[j]*(1-o2[j])*sum2[j]; dw21[j][i] = eta*d2[j]*o1[p][i] + alpha*dw21[j][i]; w21[j][i] += dw21[j][i]; } } for(j=0;j<nnuni;j++){ dbias2[j] = eta*d2[j] + alpha*dbias2[j]; bias2[j] += dbias2[j]; } }

関連するQ&A

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

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

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

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

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

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

  • 階層ニューラルネットワークにおける入出力層の数について

    ある問題を解くのに,入力層5個,出力層10個の階層ニューラルネットワークを用いています.このように入力層よりも出力層の方が多くても正しく計算されるのでしょうか?また,中間層の決定はどのように行うのが一番いいのでしょうか?よろしくお願いいたします.

  • ニューラルネットワーク

    0~9までの7セグメントディスプレイで表す数字を識別するニューラルネットワークを作成したいのですがなかなかわからないので質問したい所存です。 7セグメントを1~7のノードに割り振り中間層に10個のノード8~17でつなぎ出力するノードを18~27として18から0~9まで出力するようにしたいのですが、やり方としてまず、 27個のノードの結合関係を隣接行列で表す。 つぎに内部状態と重みのとる値の範囲を示す。 そしてそのニューラルネットワークに入力を与え、出力を計算する手順を説明するとのことなのですが。 よろしければアドバイス等お願いいたします。

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

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

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

    ニューラルネットワークで正規化し、パラメータを求めた後、パラメータの正規化をもとに戻したいのですが、方法が分かりません。 以下は、私がやっている途中を示します。 たとえば、データの入力が年齢と身長、出力が体重のデータがあるとします。 年齢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の正規化を解除すればよいか分かりません。 正規化する方法は載っているサイトはいくつかあるのですが、解除する 方法が載っているのは見つかりませんでした。 回答よろしくお願いします。

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

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

  • ニューラルネットワークとAI

    まさに今、書籍でもマスコミでもなんでもこの方面が賑やかのように見えます。 実際に本を読んでみてそれを実行するという面ではそれほどハードルが高くないように思えます(基礎理論は軽い線形代数と微積を少々)(これを考え付いた人はエライですが)。システムの枠組みがあってデータを学習させてシステムの変数を同定していくということですかね。そのため逆にいうと独自性を出すところとか頭1つ他よりも上に行くのは難しいだろうと思いますが、私の立場は単純にユーザです。言われた通りのことをやってみるってだけのことです。そういう立場で見ると、入力層とか出力層は問題設定で決まらざるを得ないのですが、中間層のノード数、層数はどうやって決めていくのかな?という疑問があります。教科書のサンプル例では中間層が1層で5ノードとかの事例が示されています。1層5ノードとなっているところを4層で各層10ノードとかに設定したとしてもプログラム自体は特に問題なく動くように思えます。今どきのコンピュータだと苦も無く計算してしまいそうです。ただし、そうなると学習させるデータがそれに見合って多くないと意味がないかもしれませんが。中間層の層数・ノード数の決め方に何か指標があるでしょうか。未知の変数が多くなるので十分学習すれば複雑な問題に対応できるのかもしれませんが、そこまでしなくていいだろうというような感じなのでしょうか。 また、AIって結局ニューラルネットワークのことだ、と思っていいのでしょうか。多分、ビッグデータがあるから皆出来るようになったんだなと思いますが。

  • ニューラルネットワークの入力層の選択

    ニューラルネットワークで入力層・中間層・出力層があるわけですが、入力層をインプットとして出力層を推定するモデリングを考えていくのが基本だろうと思います。 そこで質問なのですが、出力層というのアウトプットとして欲しいものであり、入力層はそれを説明するに足りる情報だとみなすことができるように思います。という風に考えると入力層は説明には足りない数だとなっていた場合、十分学習した後、アウトプットはどのように変化していくものでしょうか。不安定とか発散とかそういう結果になるのでしょうか。また、正しくモデリングするためには入力層はある程度の数が必要ということになるのでしょうか。つまり必要な数よりも少ないとダメだけど、少々多いのは構わないということになるのでしょうか。それともモデリングの対象ごとにいろいろ違うということになるものでしょうか。また、入力層として必要なデータは理屈で考えて因果関係が説明できるものから選ぶというのが基本なのでしょうか。”風が吹けば桶屋が儲かる”ということで、風のデータは入力層に必ず含め、桶屋の収入をアウトプットとするという風にする、ということですが。 よろしくお願いします。

専門家に質問してみよう