ニューラルネットワークの学習で自由度を上げても誤差が改善しない

このQ&Aのポイント
  • ニューラルネットワークの学習について勉強中。
  • 最近、準ニュートン法での学習について考えている。
  • 中間層のユニット数を大きくしても誤差が変わらない結果が出た。
回答を見る
  • ベストアンサー

ニューラルネットワークについて

最近ニューラルネットについて勉強しています。 特に準ニュートン法での学習について考えています。 ある日手に入れたデータで学習したところ、誤差があまり小さくならなかったので(何度も学習を試し、ノイズ混入も試したので、ローカルミニマムに引っかかっている感じではないと思います)、中間層のユニット数を莫大に大きくしました(最初試したときの100倍以上です)。 しかし誤差が全然変らない、という結果が出ました。 このように、自由度を上げても学習しきらないことってあるんでしょうか。もしあるのなら、その原因は何でしょうか。また、学習しない原因となっている邪魔なデータを探す方法ってあるのでしょうか(出来れば視覚的に見えると嬉しいです)。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.2

 中間層をたっぷり取ってメチャクチャ過剰学習させても、また多層にしても、なお出力を教師信号と一致させられないということは生じうる。その残差が特に大きいのはどんな入力であるか、というのをリストアップしてみれば、何か見つかるかも。  というのは、極めて近い(あるいは全く同じ)入力に対して全然違う幾つかの出力を要求すれば、当然残差が大きくなっちゃう。言い換えれば、(汎化能力のある)滑らかな関数によって出力の違いを説明するには入力ベクトルの情報が決定的に足りない(肝心な成分が抜けている)ってことですね。  ところで、準ニュートン法は、どこから出発するかによって挙動が変わるのが難点であり、だから、大体このあたりで収束しそうだなという所までは他の(のろくても着実な)手段で探る方が良いかも。

regulusdaora
質問者

お礼

返答有難うございます。 入力が同じなのに出力が異なるといったパターンが含まれていたようです(扱うデータの特性上、そうなっちゃってるみたいです・・・)。 準ニュートンは初期値にやっぱり依存しすぎますよね。最初は最急降下か何かであたりをつけて、ある程度行ったら切り替え、みたいな方が良いのでしょうか・・・

その他の回答 (1)

  • rabbit_cat
  • ベストアンサー率40% (829/2062)
回答No.1

結局の所、 ローカルミニマムに引っかかっている んです。 3層のモデルですか? ニューラルネットワークは、実用上は、なかなか、うまく学習することは難しいです。はっきり言って、バックプロパゲーションを超えるうまい方法は知られていません。 とくに、入力データの非線形が強い場合には、相当難しいです。 中間層のニューロンを増やすと、自由度が増えるので、逆に学習がうまくいかない原因にもなります。 もちろん、中間層に十分な数のニューロンがないと、そもそも学習不能になる可能性もあります。 これが原因で、機械学習におけるニューラルネットワークの適用はSVMなんかに押されて一時期かなり下火になりました。 ところが、最近、強い非線形のデータを学習したい場合には、3層モデルで中間層のニューロン数を増やす、のではなく、多層(10層など)のネットワークにするという話が出て、機械学習におけるニューラルネットワークが復権してきています。 入力に近い層から各層毎に学習していく、Deep Learningという手法なんかが有名です。 (「googleの猫認識」で有名)

関連するQ&A

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

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

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

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

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

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

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

    最近誤差逆伝搬法を用いたニューラルネットについて プログラムを組んで実装してみようと思ったのですが あまり理解できていない部分があるのでよろしくお願いします。 私が作りたいのはフォントの違う数字画像の認識を 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の正規化を解除すればよいか分かりません。 正規化する方法は載っているサイトはいくつかあるのですが、解除する 方法が載っているのは見つかりませんでした。 回答よろしくお願いします。

  • プログラミングの問題

    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) どうかよろしくお願いします。

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

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

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

  • ニューラルネットワークの「重み」について

    「ニューラルネットワークの重みの初期値によって、学習の結果は変わることはないが、学習の進み方や速さには影響が出る」という話を聞きましたが、この知識は正しいでしょうか? (私は重みの初期値はニューラルネットワークの学習の結果にも進み方・速さにも影響があると思っているのですがいかがでしょうか?)