• 締切済み

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

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

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

多層ニューラルネットなので, そのようにわけて考えるのが本来のやりかただろうと思います. まぜて (150+900+930)×(150+900+930) とすれば性能はいいと思いますが, なんか邪道っぽい気がします.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

こっそり #2 で書いてありますが, ヘッセ行列の次数は「重みの個数」と一致します (行列 H の次数も当然に一致する). 例えば, 「ある層に 5個, 次の層に 10個のユニットがあり, すべてのユニット間に結合がある」場合を考えてみます. この場合には 2つの層の間に 50個の結合があり, そのすべての結合に対して重みがありますからヘッセ行列は 50×50 の行列となります. もちろん「あるユニットとあるユニットの間には結合がない」というようなときには (それに対応する重みも存在しないので) ヘッセ行列はもっと小さなものとなります. ということで, 教師データの個数とも無関係です.

G_MANT
質問者

お礼

<例えば, 「ある層に 5個, 次の層に 10個のユニットがあり, すべてのユニット間に結合がある」場合を考えてみます. この場合には 2つの層の間に 50個の結合があり, そのすべての結合に対して重みがありますからヘッセ行列は 50×50 の行列となります. やはりそっちでしたか。。自分がやっている実装では入力層のユニット数が5個(任意)、中間層1と2はそれぞれ30個、出力層は31個(教師データが31個のため)なので、全部の層間に139500個の重みが存在するということでヘッセ行列は139500×139500の行列になるということですね。 …これはもしかしてメモリの問題が関わってくるかもしれないですね。 Visual C++で実装を行っているのですが、素直に入力層のユニット数を2,3個にした方がいいかな。。 返信有難うございました。いろいろ試してみて頑張ってみます。

G_MANT
質問者

補足

度々すいません。。お礼に書いてあるのでは無く、入力層と中間層1の間で重み(w1)が150個なので、ヘッセ行列(H1)は150×150の行列で、中間層1-中間層2の間で重み(w2)が900個だからヘッセ行列(H2)は900×900の行列,中間層2-出力層は重み(w3)が930個より、ヘッセ行列(H3)は930×930の行列である。みたいに分けて行うのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「ヘッセ行列」は 2階偏微分をならべた行列ですから, 重み w を変数とする関数 f(w) においては行数・列数ともに「w の個数」であるような正方行列になります. H はその逆行列 (を近似した行列) ですから, 行数・列数はヘッセ行列と等しくなります. ひょっとすると (i, j) 要素を「ある層のユニットi と次の層のユニットj で決まる何か」と思ったのかもしれませんが, そうではありません. ですので, 各層のユニット数が等しい必要性はありません.

G_MANT
質問者

お礼

返信有難うございます。 >ひょっとすると (i, j) 要素を「ある層のユニットi と次の層のユニットj で決まる何か」と思ったのかもしれませんが, そうではありません. まさにその通りでした。。自分は参考にしている文献で、中間層1(L-1層目)と中間層2(L層目)での結合荷重w(k+1)[L,ユニットj:L-1,ユニットi]やHを更新する式から、他の層間でもHを独立に更新するからユニット数を同じにすると思いました。どうやらヘッセ行列の事について理解が足りないみたいです。。今、勉強しているのは一変数関数の近似を行って学習を行い、その過程でニューラルネットの誤差評価関数Errというのを最小化していくということです。教師データ:31個でErr=0.5*ΣΣ(ユニットからの出力値-教師データ)^2なのですが、出力値は重みwによって出力されるので31個の正方行列にすればよいのでしょうか? 度々すいません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えぇと.... どうして「それぞれの層のユニット数を同じにする必要とかあるのでしょうか」と思ったのでしょうか? それぞれの層の間で結合の重みを独立に変えるのがいいかどうかは知らないけど, 「ユニット数を等しくする」必要は全くありません. 関連して, 最後の「例えば」の文は意図がわかりません? 「それぞれの層のユニット数を同じにする」と言っているにもかかわらず「中間1-2層のユニット数 (って何だ?)」としか書いていないのは不自然です. 「それぞれ」の中には入力層や出力層も含まれると読んでしまうのが普通でしょう. ついでだけど, 老婆心ながら文をもっと短くした方がいい. 特に, 最初の「準ニュートン法の」から「あるのでしょうか」までが 1文だけど, いくらなんでも長過ぎ. もっと各文を短くして, 「それぞれの文で言いたいこと」を明確にした方がいいと思うよ.

G_MANT
質問者

お礼

間違えて補足に打ってしまいました。。

G_MANT
質問者

補足

回答ありがとうございます。文章を書くのは少々苦手でして申し訳ないです えと、Hの初期値を単位行列に設定するということなので行と列は同じ数であるから、どれかの層間でHを探索方向の計算に利用するにはユニット数を同じにする必要があると考えました。 後、例えで書いたことなんですが、ある文献で中間層1-中間層2において重みwや微分式∇f(w)やHの更新や探索方向の計算式が書いてあり、ユニット数がそれぞれ同じであったのでこうする必要があるのかなと思いました。。そのために中間層1-中間層2は更新できるが、その他の層間ではユニット数が違うのにどうするのだろ?と疑問に思ってしまいました。

関連するQ&A