質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

Q&A

0回答

604閲覧

ファイルからの読み込みを通じて人工神経回路網と深層学習を実装したい

wagashi_157

総合スコア51

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

0グッド

0クリップ

投稿2022/01/02 02:41

編集2022/01/23 07:51

実現したいこと

ファイルから入力層のニューロン数N, 隠れ層のニューロン数L, 出力層のニューロン数M, データの数Tを読み込み, xor関数を隠れ層ニューロン数2個のネットワークで学習したいです。

今起きている問題

学習後の誤差関数Eの値を表示しているのですが, 乱数で実装していることもあり学習に失敗するケースがあるところまでは承知しています。しかし, Eの値が0.01以下になるようにしたいのにも関わらず, だいたい1.9の値を取っているため思ったような実装ができていません。その原因が分からないので, 教えていただきたいです。

実装コード・結果

C++

1#include<iostream> 2#include<cmath> 3#include<cstdlib> 4using namespace std; 5 6double neuron(double x[], double weight[], double b, int n){ 7 double sum=0; 8 for (int i=0; i<n; i++) { 9 sum+=x[i]*weight[i]; 10 } 11 sum+=b; 12 return 1/(1+exp(-sum)); 13} 14 15int main() { 16 int N; 17 int L; 18 int M; 19 int T; 20 double E; 21 cin>>N>>L>>M>>T; 22 23 double x[200][10]; 24 double z[10]; 25 double y[10]; 26 double v[10]; 27 28 double t[200][10]; 29 double gamma=5; 30 31 double w1[10][10]; 32 double w2[10][10]; 33 double b1[10]; 34 double b2[10]; 35 srand((unsigned)time(NULL)); 36 for (int k=0; k<L; k++) { 37 for (int i=0; i<N; i++) { 38 w1[k][i]=(double)rand()/((double)RAND_MAX+1); 39 } 40 b1[k]=(double)rand()/((double)RAND_MAX+1); 41 } 42 for (int j=0; j<M; j++) { 43 for (int k=0; k<L; k++) { 44 w2[j][k]=(double)rand()/((double)RAND_MAX+1); 45 } 46 b2[j]=(double)rand()/((double)RAND_MAX+1); 47 } 48 49 for(int c=0; c<1000; c++) { 50 for(int p=0; p<T; p++) { 51 for(int k=0; k<L; k++) { 52 z[k]=neuron(x[p],w1[k],b1[k],N); 53 } 54 for (int j=0; j<M; j++) { 55 y[j]=neuron(z,w2[j],b2[j],L); 56 } 57 for (int k=0; k<L; k++){ 58 v[k]=0; 59 for(int j=0; j<M; j++){ 60 v[k]+=(y[j]-t[p][j])*(1-y[j])*y[j]*w2[j][k]; 61 } 62 } 63 for (int j=0; j<M; j++) { 64 for (int k=0; k<L; k++) { 65 w2[j][k]-=gamma*z[k]*(y[j]-t[p][j])*(1-y[j])*y[j]; 66 } 67 b2[j]-=gamma*(y[j]-t[p][j])*(1-y[j])*y[j]; 68 } 69 for (int k=0; k<L; k++) { 70 for (int i=0; i<N; i++) { 71 w1[k][i]-=gamma*x[p][i]*(1-z[k])*z[k]*v[k]; 72 } 73 b1[k]-=gamma*(1-z[k])*z[k]*v[k]; 74 } 75 } 76 } 77 78 for (int p=0; p<T; p++) { 79 for (int i=0; i<N; i++) { 80 cin>>x[p][i]; 81 } 82 for (int j=0; j<M; j++) { 83 cin>>t[p][j]; 84 } 85 cout<<"x:"; 86 for(int i=0; i<N; i++){ 87 cout<<x[p][i]<<" "; 88 } 89 cout<<"z:"; 90 for(int k=0; k<L; k++){ 91 z[k]=neuron(x[p],w1[k],b1[k],N); 92 cout<<z[k]<<" "; 93 } 94 cout<<"y:"; 95 for(int j=0; j<M; j++){ 96 y[j]=neuron(z,w2[j],b2[j],L); 97 E+=(t[p][j]-y[j])*(t[p][j]-y[j]); 98 cout<<y[j]<<" "; 99 } 100 cout<<endl; 101 } 102 cout<<"E:"<<E<<endl; 103 104 for(int k=0; k<L; k++){ 105 cout<<"z"<<k<<" "; 106 cout<<"w1:"; 107 for(int i=0; i<N; i++){ 108 cout<<w1[k][i]<<" "; 109 } 110 cout<<"b1:"; 111 cout<<b1[k]<<endl; 112 } 113 114 for(int j=0; j<M; j++) { 115 cout<<"y"<<j<<" "; 116 cout<<"w2:"; 117 for(int k=0; k<L; k++) { 118 cout<<w2[j][k]<<" "; 119 } 120 cout<<"b2:"; 121 cout<<b2[j]<<endl; 122 } 123 return 0; 124}

xor.txt

12 2 1 4 //xor.txt 20 0 0 31 0 1 40 1 1 51 1 0

実行結果
$./a.exe<xor.txt
x:0 0 z:0.724001 0.748752 y:0.00337414
x:1 0 z:0.735373 0.782302 y:0.00313582
x:0 1 z:0.778374 0.842381 y:0.0026458
x:1 1 z:0.788161 0.865672 y:0.00250641
E:1.98847
z0 w1:0.0576604 0.291822 b1:0.964394
z1 w1:0.187169 0.584085 b1:1.09196
y0 w2:-1.71473 -1.60915 b2:-3.24191

x:0 0 z:0.658774 0.775888 y:0.00337317
x:1 0 z:0.806224 0.831015 y:0.00237437
x:0 1 z:0.832161 0.856353 y:0.00215879
x:1 1 z:0.91442 0.894382 y:0.0017471
E:1.99096
z0 w1:0.767824 0.943183 b1:0.657835
z1 w1:0.350974 0.543466 b1:1.24186
y0 w2:-1.58821 -2.13942 b2:-2.98231

x:0 0 z:0.677479 0.578337 y:0.00358413
x:1 0 z:0.844232 0.702535 y:0.00222868
x:0 1 z:0.835425 0.727025 y:0.00219048
x:1 1 z:0.929065 0.820985 y:0.00162254
E:1.99119
z0 w1:0.947847 0.882365 b1:0.74221
z1 w1:0.543451 0.663632 b1:0.31595
y0 w2:-1.83804 -1.36851 b2:-3.59096

x:0 0 z:0.735721 0.798222 y:0.00329615
x:1 0 z:0.800865 0.905335 y:0.00236951
x:0 1 z:0.829731 0.865813 y:0.00245969
x:1 1 z:0.87562 0.939754 y:0.00195537
E:1.99037
z0 w1:0.367866 0.559878 b1:1.02384
z1 w1:0.882749 0.489222 b1:1.37522
y0 w2:-1.60078 -2.11665 b2:-2.84442

試したこと

まず, xやyの配列がdouble型になっているかを確認しました。その次に, Eを求めるところで(t[p][j]-y[j])(t[p][j]-y[j])を(y[j]-t[p][j])(y[j]-t[p][j])と値の順序を変えてみました。

補足

C++17を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/01/02 04:30

Python使いなのでC++関連の突っ込んだ話は全くできませんのでご了承ください。 > だいたい1.9の値を取っているため思ったような実装ができていません。その原因が分からないので, 教えていただきたいです。 Q.1 何回くらい「学習」を行っていますか?(C++が読めないので見当違いな質問になっているかもしれません) 問題の難易度にもよりますが、一般にニューラルネットワークを使った学習は遅い(何回も反復させて学習が必要)です。 Q.2 学習率はどれくらいですか?(gammaが学習率みたいなパラメータのようにも見えます) ご存じと思いますが高すぎるとぶれて安定しない(最悪の場合値が発散)ですし、低いと学習が遅くなります。計算に時間がかからないのであれば学習率を2-3桁落として様子を見るのも一般的な対応です。
wagashi_157

2022/01/02 11:25 編集

Q1.何回くらい「学習」を行っていますか? →z,y,vなどの計算で1000回の学習を行っています。 Q2.学習率はどれくらいですか? →gammaはステップサイズを示しています。
退会済みユーザー

退会済みユーザー

2022/01/02 23:36

回答ありがとうございます。確かに、試行回数1000回であれば収束しそうな雰囲気ですね。 > gammaはステップサイズを示しています。 値をどれだけ動かすか、というステップでよろしいですか? もしこれの答えがYESであった場合、gammaを2.5,1,0.5,0.05とした時に誤差Eの傾向がどうなるか試してもらえますか?
wagashi_157

2022/01/03 05:24

gammaが2.5のときにEは1.6くらいになりました。 次第に減らしていくと0.9台の値が出てきましたが, やった限りではgammaが0.007の時に0.9くらいの最小を取るようです。0.01以下にはなりませんでした。 それはxやy, vなどの値に原因があるのでしょうか。
退会済みユーザー

退会済みユーザー

2022/01/04 03:22 編集

> 入力層のニューロン数N, 隠れ層のニューロン数L, 出力層のニューロン数M, データの数Tを読み込み 一般的な傾向ですが、簡単な計算をする際には - ニューロン数は多くない方がイイ - 隠れ層は浅い方がイイ という傾向があります。 隠れ層のニューロン数はLですが、隠れ層の層数(L個のニューロンが何回重なっているか)も教えていただけますか? 参考:XORは多層でないと解けない、"深層"での勾配消失問題(すでに知っておられたら無視してください。 http://hokuts.com/2015/12/04/ml3-mlp/
wagashi_157

2022/01/05 14:48

大分返信をお待たせしました。 隠れ層の層数は3層です。3層ニューラルネットを機械学習で実装したいです。
退会済みユーザー

退会済みユーザー

2022/01/05 21:42 編集

隠れ層が3層であれば(完全にカンですが)なんとかなりそうな気がします。 XORは非線形な活性化関数でないと分離できないのですが、「return 1/(1+exp(-sum));」の部分がそれに対応する部分と認識しています。一般にはReLU(入力がマイナスならゼロ、正なら生の値を返す関数)が使われているので、活性化関数を挿げ替えて様子を見ていただけませんか? 参考: https://qiita.com/kuroitu/items/73cd401afd463a78115a#relu%E9%96%A2%E6%95%B0 --- 参考: https://gtech.hatenablog.com/entry/2016/07/30/141647 参考のサイトだと、最後のまとめの直前のあたりに、ニューロン数が多いと局所最適解みたいなの(初期値選定によって収束しにくい)を避けやすくなるよ、というような感じで書いてあります。隠れ層の層数2、ニューロン数128でうまくいった、だそうです。
wagashi_157

2022/01/07 16:54

すみません, ニューロンの実装は学校の課題なのですが, gammaは変えず, メモリの数(x,y,zなどの配列)を十分に大きい数に自分で設定することになっています。xor.txtに合わせて考えるため, 3層では試してみたら1.9台になってしまいました。それ以外の大きい数でやっても1.99011と同じ数字になってしまいます。どうすればよいでしょうか。
退会済みユーザー

退会済みユーザー

2022/01/08 23:36 編集

式があっていると仮定して、数値を変えて試しましょう、であれば、手動で数値をグリッドサーチするしかないと思います。というのも、基本的にやってみたらなんとなくうまくいった――という考え方が根底にある為、絶対に通用する無敵の式というのが存在しません。 この時カンであたりを付けることになりますが、上の方のコメントにも書いたと思いますが、一割二割の変化よりも5倍10倍100倍オーダーで何回か数字をいじってみて大体のあたりを探る感じです。 そのつかみどころのない感覚をつかんでね、という意味で課題なのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問