- 締切済み
C言語で準ニュートン法(DFP法)でヘッセ逆行列を近似する
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「きちんと出力できない」とか「エラーが出る」といわれても, それらがどういうことか全く分かりません. 具体的に何がどう「きちんと出力できない」のか, あるいは「どのようなエラーが出るのか」を書いてください. もっとも, DFP はわりと厳しいようなので BFGS の方が使いやすいかもしれん.
- Tacosan
- ベストアンサー率23% (3656/15482)
「ヘッセ行列の逆行列」の更新ができているなら, その逆行列を求めるだけ, じゃないかな. もちろんヘッセ行列そのものを別途更新してもいいけど.
補足
更新式はできているので、求めることはできていると思うのですが、なぜかヘッセ行列の逆行列をDFP公式通りに更新してもきちんと出力ができずにエラーが出てきてしまいます。
関連するQ&A
- 4階層型ニューラルネットワークで学習(準ニュートン法)
準ニュートン法の学習方法の中に出てくるヘッセ行列の逆行列の近似行列Hについてなんですが、よく最適化についての本に更新式が載っているのを見るのですけど、(DFP法やBFGS法)アルゴリズムの中に探索方向の計算についてあるんですが、4層のニューラルネットに準ニュートン法を導入すると、それぞれ入力層-中間層1と中間層1-中間層2と中間層2-出力層の3つの所でそれぞれ重みwや微分式∇f(w)の更新を行うと思うのですが、このときにHをそれぞれの層間で探索方向を用いて次のHを更新するみたいですが、このHはよく初期値として単位行列を設定しているようなのですが、これはそれぞれの層のユニット数を同じにする必要とかあるのでしょうか?例えば中間1-2層のユニット数は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という出力になってしまいます。
- 締切済み
- C・C++・C#
- 準ニュートン法による連立方程式の解法
勾配をZeroに収束させることで最適化させる資料は見かけますが、連立方程式を解く場合についても近似ヘッセ行列の更新方法は同じでしょうか?ご回答ないしはサイトをご存知でしたら教えて頂ければと思います。
- 締切済み
- 数学・算数
- 4階層型ニューラルネット(逆伝播法)
現在、実験のために4階層型のニューラルネットを作成しているのですが上手く収束しません。使用は入力層、中間層2層、出力層の計4層です。 各変数はo1が入力ユニットからの出力、o2とo3は中間層ユニットの出力、o4が出力層ユニットの出力です。w43,w32,w21はそれぞれの結合強度です。biasはそのままバイアスです。変数の前にdがついてるものは変化を表したものです。etaは学習率、alphaは慣性項係数です。この値と中間層ユニット数を変更してみても収束しませんでした。 問題があるのは逆伝播法での結合強度の更新です。以下にそのルーチンを示しますのでお気づきの点がありましたらお願いします。特に問題があるのは中間層~入力層間についてだと思うのですが。。 ご意見お願いします。また、よろしければ4層以上のニューラルネットについてのサイトがあればお願いします。
- 締切済み
- C・C++・C#
- バックプロパゲーション(誤差逆伝播法)について質問です
ニューラルネットのバックプロパゲーション(BP)について勉強してますが、いまいち理解できないところがあります。どなたかご教示ください。 中間層のあるニューロンj の結合加重を更新するとき 一つ後の層のニューロンの誤差の総和を反映させると書いてあったのですが、 誤差 E は E = 1/2Σ(t_k - out_k)^2 t_k=ニューロンkの教師信号、out_k=kの出力 で与えられますが、 例えば仮に10層くらいのネットワークがあって、第3層の あるニューロンj の結合加重を更新するときも、その一つ後ろの第4層のニューロンの誤差の総和を計算する必要があるんですか?。誤差って何と何の誤差なんでしょうか? またそのニューロンj は教師信号と関わってくるんでしょうか?、 説明が分かりにくかったらすいません…どなかご存知でしたら教え下さい。
- 締切済み
- 科学
- ニューラルネットの教師あり学習について質問です。
最近誤差逆伝搬法を用いたニューラルネットについて プログラムを組んで実装してみようと思ったのですが あまり理解できていない部分があるのでよろしくお願いします。 私が作りたいのはフォントの違う数字画像の認識を 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個つ用意する必要が ありますよね・・・? いま一つ理解できていないのでよろしくお願いします。
- ベストアンサー
- その他([技術者向] コンピューター)
- 準ニュートン法の直線探索と収束性
プログラムとして直線探索を実装した準ニュートン法を作成しました。 これについて、2次関数で試行すると、ヘッセ行列の逆は理論値の[0.5 0; 0 0.5]に収束することが確認できました。 他方で、直線探索を外し、一定値の間隔で進む?ようにしますと、逆行列の理論値から外れた値に収束することが見受けられました(探索点は2次関数の最小値に収束します)。 これは、プログラムミスなのか、準ニュートン法で直線探索をしないことによる帰結なのか、どちらなのでしょうか?また、後者であれば、その理由は数学的に明らかにされているのでしょうか?
- 締切済み
- 数学・算数
- 階層ニューラルネットワークにおける入出力層の数について
ある問題を解くのに,入力層5個,出力層10個の階層ニューラルネットワークを用いています.このように入力層よりも出力層の方が多くても正しく計算されるのでしょうか?また,中間層の決定はどのように行うのが一番いいのでしょうか?よろしくお願いいたします.
- ベストアンサー
- 数学・算数
- ある行列とその転置行列の積の逆行列は?
今エクセルで行列を使って問題を解いています。 問題は 行列X、A、Yがあり、Xは1行4列、Aは1行2列、Yは1行4列です。 X・A=Y という式があり、Aの行列は未知数a,bの要素からなっています。 X,Yはそれぞれ数値として要素が決まっています。 ここからはヒントとして表示されていました。 そこでXの逆行列を両辺の左からかけるとAは求まるはずですが、 Xは正方行列ではないので、Xの転置行列を左からかけます。 X(T)・Xは正方行列になるのでこれを行列Pとおくと Pの逆行列を求められ、右辺にP^-1をかけるとAが求まる。 というものです。 エクセルで書かれている通りにやってみて、エラーになるので調べてみると、XとXの転置行列の積の行列式は要素にかかわらず0になるようです。 実際に数値ではなく、abcdでやってみたところ0のようです。 この場合、逆行列は存在しないのではないかと思いますが、このヒントが間違っているとはあまり思えず、困っています。 補足ですが、この問題は最小二乗法をエクセルで行列を用いて行うという趣旨です。 もとのデータとして(x、y)の座標が4点与えられており、行列Xはxの要素を縦にならべたもの、Aは最小二乗法で求める一次関数式のパラメーターa,bで、YはXと同様座標のy要素です。 私の理解が間違っていて、何行何列という部分に誤りがあるなどの指摘があれば、ぜひお願いいたします。 そもそもある行列とその転置行列の積の逆行列は存在するのかどうかもお願いします。 締め切りが近く、ちょっとあせっています。 よろしくお願いします!!
- ベストアンサー
- 数学・算数
- 最小二乗法について調べていたんですが、測定値と近似モデルの
最小二乗法について調べていたんですが、測定値と近似モデルの 誤差eの二乗和がS=eTeという形になるのがわかりません。Tは転置行列です。 わかるかたがいましたらおしえてください。 ネットでは http://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95 で調べました。
- 締切済み
- 数学・算数
補足
説明不足で申し訳ないです。 まず誤差評価関数E(w)=0.5*Σ(y-t)^2 y:出力(4層ニューラルで中間1,2と出力層はシグモイド関数を通しています) t:教師データ(sinc関数の値を[-15,15]範囲で格納しています) をDFP法を用いて減少させていくことを目的としています。 そのために結合荷重wを更新する式w(k+1)=w(k)-αH(k)∇w(k): を用いて学習を行いたいのですが、H(k):ヘッセ逆行列の近似(DFP)、H(0)=I(単位行列)、α:学習係数(黄金分割法)、∇w(k):勾配ベクトル 学習回数kが2程になってしまうと1.#qNaN0が出力され、後は-1.#ind00が出力されるようになってしまいます。例えば出力層が31ユニット(i)、中間層が30ユニット(j)ある間で更新する時にはH3[i][j][k+1] = H3[i][j][k]+… のように行っていますが、この考え方自体が間違っているのでしょうか? 初期行列が単位行列なので対角成分だけを更新に用いるべきとか。