• 締切済み
  • 困ってます

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

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

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数151
  • ありがとう数1

みんなの回答

  • 回答No.2

AIって結局ニューラルネットワークのことだ AIって結局アルゴリズムのことだ 意味は似たようなものかな。

共感・感謝の気持ちを伝えよう!

関連するQ&A

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

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

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

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

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

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

  • 回答No.1

今勉強中の素人ですが、お許しください。 まず、中間層のノード数、層数は、多ければ良いわけでは無いようです。一つ目は、勾配消失問題です。モデルの学習において最適解を求めるために各パラメータの勾配を求める必要が有りますが、層数などを増やしすぎると勾配が消えてしまいます。データの変化に対する変数の変化がゼロになると言うことです。これが中間層を増やしたときの問題点の一つ目です。 もう一つの問題は、過剰適合です。例えば、仮に本来の分布がy=x^2のようなグラフで表せるとします。仮にこれを過剰な中間層を使って、実データで学習すると当然より高次の関数型の方が学習結果は良くなります。しかし、真のフィッティングからはずれていきます。訓練データでは予測がうまくいって、テストデータではうまくいかないというのは過剰適合の可能性が高いです。 では、どれくらいのサイズの中間層が最適なのかと言う事ですが、簡単には決められないようです。データポイント、「真の」適応関数の次数によって違うようで、結局試行錯誤かなと理解しています。 さて、AIはニューラルネットワークかという点ですが、昨年くらいに日本のトップクラスの研究者に来て頂いて研究会をした感じでは、そうではないようです。ニューラルネットワーク、ディープラーニングが最適の結果を出す適応事例は少ないと言われていたトップ研究者がおられます。様々なアルゴリズムのAIが提案されていて、その方が基本的には適応範囲が広いようでした。ただ、ディープラーニングは、ある意味使いやすい環境が出ており、一番多くの人が使っているので、当分はこのブームは続くように思います。 ディープラーニングに関しては、今多くの実用の現場ではどうやって手間を掛けずにビッグデータを用意するのかというのが一番の問題になっています。手入力で数十万件を入力するのは実際的では無いので、自動化する必要が有り、その自動化の作業がまた大変というところです。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございました。ディープラーニング・機械学習・ニューラルネットワークが私の中で混同しているようです。そのような表題のテキストを見ると、結局ニューラルネットワークの説明ばかりになっているように思いました。勾配消失や過剰適合についてはテキスト書いてあるようですが、十分理解はしておりませんが、フィーリングはわかります。 層数、ノード数(パーセプトロン?)の数をいろいろ変えるところまでもプログラミングの内側に入れてあれこれやってみるという力わざもあるのかなと思ったりしますが。 流行を追うのは良し悪しだと思いますが、訓練というかボケ封じのために少し追ってみようかと思っています。ユーザとしてですが。

関連するQ&A

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

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

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

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

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

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

  • OSI参照モデルで登場する層について

    はじめまして。 現在OSI参照モデルについて学習しているのですが、基本的なことが わからず混乱しています。質問させてください。 OSI参照モデルに登場する層とは、大雑把に言うと、データを送受信す るための取り決め(プロトコル)であると認識しているのですが、間違い でしょうか?といいますのは、参考書には、 送信元で発生したデータは、送信元の第7層から第1層へと下っていき、送信先の第1層から第7層へと上っていきデータが送られるというように解説されているのですが、各層というのは、それぞれ、ネットワークシ ステムの個々場所を指すものであると解釈できてしまいます。例えば、 第1層は、伝送媒体(ケーブル)を指し、第2層はブリッジを指すとい うようにです。層とは、プロトコルなのでしょうか?、それとも 場所なのでしょうか?ネットワークについて知識不足なため、 どうか初心者でもわかるようにご教授していただけませんでしょうか? よろしくお願いします。

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

  • データ構造とアルゴリズム

    学校の課題なのですが、試験の得点順(降順)に学生番号と得点を表示することができるシステムを行っています。 仕様は下記の通りです。 外部仕様 1.試験の得点順(降順)に学生番号と得点を表示 2.機能メニュー(1:追加、2:削除、3:表示、1~3以外:終了)で操作できる 3.機能メニューの1:追加を選択すると、キーボードから学生番号と得点を入力することができる 4.機能メニューの2:削除を選択すると、キーボードから入力した学生番号のデータを削除することができる。 5.機能メニューの3:表示を選択すると、入力されているデータが、得点順に表示される 内部仕様 1. 使用言語はC言語とする 2. ダミーノードを使わない順方向リスト構造とする 3. リストのノードは構造体を使用する 4. リストのノードが常に得点の降順で並ぶように追加する 5. 入力データ型は、機能メニューを選択するための数字と得点は整数型、学生番号は文字列型とする 6. 先頭のノードのポインタを格納する変数名はheadとする 7. 全体の処理の流れは図1のとおりとし、【テンプレート・プログラム】の必要箇所に必要な機能を追加して完成させるものとする。テンプレート・プログラムで使用されている変数名は、そのまま使用すること。 8. 機能メニューは、関数名:menu()で表示する。menu()の仮引数は無し、戻り値は、キーボードから入力されたメニュー番号(整数)とする。 9. 機能メニューの1:追加では、関数名:insert()において先頭ノードから最後尾ノードに向けて順にキーボードから入力した得点と大小関係を比較し、得点の降順で並ぶように挿入位置を決めるためのアルゴリズムを考えて、新たなノードをリストに挿入する。関数名:insert()、仮引数:無し、戻り値:無し。なお、新しく追加するノードのポインタアドレスは変数pを使用する。追加する場所を探すために参照するノードのポインタアドレスは変数p2を使用する。 10. 機能メニューの2:削除では、関数名:del()においてキーボードから削除する学生番号を入力し、該当するノードを削除する。学生番号が見つからない場合は何もしない。関数名:del()、仮引数:無し、戻り値:無し。なお、文字列の比較には、strcmp()関数を使用する。 11. 機能メニューの3:表示では、関数名:disp()において先頭のノードから学生番号と得点を表示する。関数名:disp()、仮引数:無し、戻り値:無し。 この、追加機能のinsert、削除機能のdel、dispをどのように記述すればいいのかが分かりません。 分かる方宜しくお願いいたします。

  • (緊急)ニューラルネットワークについて

    ニューラルネットワークに関して、人間の心の働きと比較した時の問題点をいくつか教えて頂けますか?

  • ニューラルネットワークってなに?

    題名のままですがニューラルネットワークとはなんでしょうか. よく巡回セールスマンの効率的な回り方などで ニューラルネットワークとの言葉が出てきますが 調べても, 用語の説明とかはなかなか見つからなくて… 見つかっても,ちょっと難しくて… わかりやくニューラルネットワークを おしえてください!

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

     私は今、ニューラルネットワークやDeepLearningといったものに興味があり、 その仕組みや設計方法、プログラムや使い方等を、ネットや本で調べているのですが、 どれを見てもたくさんの専門用語や複雑な数式で説明されているものがほとんどで、 それらを全く理解できないわけではないですが、詳細な解き方や、直感的な考え方の説明が 欲しいです。自分でも色々調べましたが、私が今知っていることと言えば、ニューラルネットが どんなもので、どんなことが出来て、どんな種類があるか、また、ニューロンの動作を表す数式が なんとなく理解できる程度で、そこからもっと発展した話についてはほとんど分かりません。 さらに調べていくうちに、DeepLearningや、SOINN等の、高い性能を持つニューラルネットの 存在も知り、もっと強い興味が湧いてそれらについても調べてみましたが、英語で書かれた サイトや、大学の論文と思われるものが出てくるばかりで、これについても分かっていることは、 段数の多いニューラルネットで、認識精度がとても良いということくらいです。もっと詳しく分かる ようになり、自分でも何か認識させたり、ロボットに組み込んで使うなど、色々やりたいことは あります。誰かに質問することも考えましたが、周りにいるのはロボット専門の人で、ニューラル ネットワークについて分かりやすい説明を得るのは難しいと考えました。私自身も学力があまり よくなく、どうすれば良いか分からない状態です。ニューラルネットワークやDeepLearningの 数式の詳細な解き方、ネットワークの説明を直感的で分かりやすい、詳しい設計方法等が 書かれている、サイト、書籍等をご存知でしたら、教えて頂けるととても有難いです。曖昧な 表現で分かりにくく、カテゴリが合っているかどうかもよくわからず、また、虫がいい質問である とは思いますが。よろしくお願いします。

  • ニューラルネットワークでデータを正規化するには?

    こんにちは、今ニューラルネットワークをプログラミングしているのですが、データを正規化しようと思っています たとえば教師データの入力が年齢と身長、出力が体重のデータがあるとします 年齢  身長  目的変数:体重 24    150 |  65(kg) 24    172 |  73(kg) という年齢が同じデータがある場合 正規化するにはどうればいいでしょうか? 正規化は 正規化後の値 = (正規化前の値 - 最小値) / 最大値 - 最小値 で出すと書いてあったのですが、年齢は最小値と最大値が同じ 24 しかありませんよね、この場合はどうすればいいのでしょうか? またついでにこの様な最小値 = 最大値の正規化されたデータを元に戻すにはどうすればいいのでしょうか?(出力層のシグモイド関数の計算結果を元のデータの単位に戻したいんです) わかりにくかったらすいません、ご存じの方よろしくお願いします。