目次


ニューラル・ネットワークの徹底調査

ニューラル・ネットワークとそのプログラミング方法の紹介

Comments

ニューラル・ネットワークには 70 年以上の歴史がありますが、画像認識技術の水準、さらには非構造化データ (ドキュメントやマルチメディアなど) 内のパターンを学習する上での水準も引き上げられたのは、深層学習が登場したからです。深層学習は、パーセプトロンならびに逆伝播などの学習手法の基本概念に基づいています。このチュートリアルではニューラル・ネットワークを深く理解するために、単層パーセプトロンの実装から多層ネットワークまでを詳しく調べ、逆伝播を使用した学習を構成します。

ニューラル・ネットワークとは、人間の脳から発想を得た、機械学習の計算モデルのことです。ニューラル・ネットワークは明示的にプログラミングされるのではなく、サンプルを基にトレーニングされます。サンプルの数が限られているときでも、ニューラル・ネットワークはそれらのサンプルを法則化して、まだ観測されていないサンプルを適切に処理することができます。

ニューラル・ネットワークは単純な単相パーセプトロンから始まりましたが、今や、さまざまなアーキテクチャーを使用して表現されるようになっています。それらのアーキテクチャーには、多層アーキテクチャーや、フィードバックを実装するための再帰的結合アーキテクチャーまで含まれます。まずは、ニューラル・ネットワークが生物学から得た発想について見ていきましょう。

生物学から得た発想

大まかには、ニューラル・ネットワークが表す情報処理パラダイムは人間の脳から発想を得ています。脳内では多数のニューロンが緊密につながっていて、軸索と樹状突起を結ぶシナプスを介してニューロン間で化学信号が伝達されます。人間の脳には約 1000 億個のニューロンがあり、各ニューロンが最大 10,000 個の他のニューロンとつながっていると推定されています。

人間の脳内でシナプスを介して電気的に情報が伝達される仕組みを示す図
人間の脳内でシナプスを介して電気的に情報が伝達される仕組みを示す図

人工ニューラル・ネットワークは、重みとアクティベーション関数 (シグモイド関数など) を使用して信号 (数値) を伝達し、アクティベーション関数によってニューロンをアクティブ化します。ニューラル・ネットワークは、トレーニング・アルゴリズムを使用して重みを調整することで、特定の問題の解決を図ります。以下の図に、3 つの入力と各入力の重み、入力バイアス、および出力を使用した単一のパーセプトロンを示します。それぞれの入力と重みの積にバイアスを足し、その結果を合計してアクティベーション関数を適用することで、出力が算出されます。最初の例として、この単純なパーセプトロンの仕組みを探ってから、逆伝播の詳細を見ていきます。

各入力の重み、入力バイアス、および出力を使用したパーセプトロンを示す図
各入力の重み、入力バイアス、および出力を使用したパーセプトロンを示す図

最近のニューラル・ネットワークは、疎結合、完全結合、または (サイクルを含む) 再帰型にできるだけでなく、他にもさまざまなアーキテクチャーを適用できます。このようになるまでにニューラル・ネットワークが歩んできた歴史を簡単に振り返りましょう。

ニューラル・ネットワークの歴史

1940 年代のはじめに McCulloch と Pitts が考案したニューラル・ネットワークの計算モデルは、脳の研究だけでなく、人工知能 (AI) への応用研究にも展開していきました (以下の図を参照)。1940 年代の後半には、Donald Hebb が生物学での観測を基にヘッブの学習則を確立します。その観測とは、2 つのニューロンが同時にアクティブになるとそれらのニューロン間のシナプスの結合が強まるという法則です。

ニューラル・ネットワークにおける歴史的出来事の年表を示す図
ニューラル・ネットワークにおける歴史的出来事の年表を示す図

1958 年には、Frank Rosenblatt がデータを 2 つのセットに分類するために使用できる、パーセプトロンという単純なニューラル・モデルを考案します。けれどもこのモデルには、排他的 OR を正しく分類することができないという欠陥がありました。Marvin Minsky と Seymour Papert はこのニューラル・モデルの制約を口実に AI の焦点を単純パーセプトロンから記号法に戻すことを目的に、1969 年に出版した共著『Perceptrons』でこの制約を暴露しました。この本がきっかけとなり、コネクショニストの研究資金はそれから 10 年にわたって減少する結果となりました。

1975 年に Werbos が考案した逆伝播アルゴリズムは、多層パーセプロトンのトレーニングに成功し、その結果、多層ニューラル・ネットワークの新しい多様なアプリケーションが生まれました。このイノベーションはニューラル・ネットワーク研究の復興につながり、実際の問題を解決するための手法を世に広めることになりました。

逆伝播が登場して以来、ニューラル・ネットワークは機械学習における主要なアルゴリズムとしての位置づけを保ち続けています。ここ数十年の間に、グラフィックス・プロセッシング・ユニット (GPU) と分散処理が登場したことにより、大規模なニューラル・ネットワークをトレーニングすることも可能になりました。それは、ニューラル・ネットワークのトレーニングと実行を、アクセラレーターのクラスターにオフロードできるようになったためです。その結果として生まれたのが、深層学習アーキテクチャー (畳み込みニューラル・ネットワークと長期/短期記憶 (LSTM) からなるアーキテクチャー) です。深層学習により、ニューラル・ネットワークのアプリケーションも、それらのアプリケーションで処理する問題も大幅に拡大しています。

パーセプトロン

パーセプトロンは、教師付き学習による分類に使用できる単純なニューラル・ネットワークの一例です。「教師付き」とは、ニューラル・ネットワークをサンプルによってトレーニングした後、期待される出力からの実際の出力の誤差に基づいて重みを調整することを意味します。

Frank Rosenblatt が考案した初のパーセプトロンは、最初に IBM 704 コンピューター上でシミュレーションされてから、画像アプリケーション用の 400 個のフォトセルを配列したカスタム・ハードウェア (Mark 1 Perceptron) として実装されました。これらのフォトセルはニューロンにランダムに接続され、ポテンショメーター (可変抵抗器) として実装された重みが、学習プロセスの一環として、付属のモーターによって調整されるという仕組みです。

以下の図に示されている単純パーセプトロンには、2 つの入力 (およびそれぞれに関連付けられた重み) とバイアスをかけた重みを使用しています。このパーセプトロンは、各入力とそれぞれの重みの積を合計し、その結果にアクティベーション関数を適用するという方法で動作します。この例でのアクティベーション関数はステップ関数です。つまり、出力が 1 以上の場合、出力は 1 になります (1 未満であれば、出力は 0 です)。

2 つの入力とバイアスをかけた重みを使用した単純パーセプトロンを示す図
2 つの入力とバイアスをかけた重みを使用した単純パーセプトロンを示す図

この単純パーセプトロンは、以下の図に示すような、線形分離可能な問題を解決するために使用できます。この図に示されている 2 つのクラスを分ける境界線 (論理 OR 演算の結果) は、直線 (つまり、決定境界) として実装できます。その決定境界は、入力の重みとバイアスに応じて決まります。OR 問題と AND 問題はどちらも線形分離可能ですが、XOR 問題はそうではありません (1 XOR 1 が 0 だとすると、線形分離可能ではありません)。

線形問題を解決するパーセプトロンのグラフ
線形問題を解決するパーセプトロンのグラフ

パーセプトロンで解決可能な問題についてある程度理解してもらえたと思うので、次は、教師付き学習によるトレーニングによってパーセプトロンを「教育」する方法を見ていきましょう。

パーセプトロン学習

パーセプトロン学習は他の多くの教師付き学習アルゴリズムと同じように単純なフローに従いますが、ネットワークをどのようにして調整するのかという点では、他の学習アルゴリズムとは異なります。まずは一般的な例を見てから、パーセプトロン学習の詳細を探りましょう。

以下に、一般的な教師付き学習のフロー図を記載します。このフローはネットワークを初期化するところから始まります (トポロジーの初期の重みは固定されていません)。続いて繰り返し処理を行うために、トレーニングのベクトルをネットワークに適用し、その出力の誤差 (実際の出力と期待される出力との誤差) に基づいて、次にこの入力がなされたときには適切に分類できるようにニューラル・ネットワークの重みを調整します。次に、停止条件を実装します (誤差が検出されなくなるか、トレーニングを繰り返す回数に応じて停止します)。このプロセスが完了したら、まだ観測されていないトレーニング・サンプルを使用してネットワークを検証します (観測されていない入力を、どれだけ上手く法則化できるかを調べるためです)。そして最後にネットワークを目的のアプリケーションにデプロイします。

一般的な教師付き学習のフローを示す図
一般的な教師付き学習のフローを示す図

パーセプトロン学習は上述のように、ネットワークの重みをランダムな値一式に初期化してから、期待される出力との誤差がなくなるまでトレーニング・セットを繰り返し処理します。トレーニングのベクトルを適用するということは、トレーニングのベクトルをネットワークに適用した上でネットワークを実行するということです (つまり、出力値を得るためにトレーニングのベクトルを順方向でフィードします)。そして期待される出力から実際の出力を減算します (その結果が誤差と呼ばれます)。この誤差を小さい学習レートで使用して、入力が及ぼす影響に応じて重みを調整します。別の言葉に言い換えると、誤差に (特定の重みが関連付けられた) 入力を乗算し、その値を小さい学習レートで乗算することによって、重みを調整するということです。このプロセスは、誤差が生じなくなるまで続けられます。

パーセプトロンの例

次は、このアルゴリズムを論理 OR 演算に適用する実装の内容に注目しましょう。この実装は GitHub からダウンロードして自分で試してみることができます。

以下のコード・リスティングを参照して変数定義を確認できます。このコードでは、入力ベクトルのサイズ (ISIZE)、重みベクトルのサイズ (重みにバイアスを計上した ISIZE+1)、小さい学習レート、繰り返し処理の最大回数、入力および重みベクトルのタイプを定義しています。

#define ISIZE 2
#define WSIZE ( ISIZE + 1 ) // weights + bias
#define LEARNING_RATE  0.1
#define ITERATIONS     10

typedef int ivector[ ISIZE ];
typedef float wvector[ WSIZE ];
wvector weights;

次のコード・リスティングには、ネットワークの初期化が示されています。この関数内では、乱数ジェネレーターのシード値を設定してから、重みベクトルに含まれる各重みを 0 ~ 1 の範囲のランダムな浮動小数点数に初期化します。

void initialize( void )
{
   // Seed the random number generator
   srand( time( NULL ) );

   // Initialize the weights with random values
   for ( int i = 0 ; i </ WSIZE ; i++ )
   {
      weights[ i ] = ( ( float ) rand( ) / ( float ) RAND_MAX );
   }
}

以下のコードには、ネットワークの実行例が示されています。feedforward 関数にトレーニングのベクトルを渡し、それを使用してニューロンの出力を計算します (図 4 の方程式に従った計算です)。最後に、ステップ・アクティベーション関数を適用して結果を返します。

int feedforward( ivector inputs )
{
   int i;
   float sum = 0.0;

   // Calculate inputs * weights
   for ( i = 0 ; i < ISIZE ; i++ )
   {
      sum += weights[ i ] * ( float ) inputs[ i ];
   }

   // Add in the bias
   sum += weights[ i ];

   // Activation function (1 if value >= 1.0).
   return ( sum >= 1.0 ) ? 1 : 0;
}

以下のコード・リスティングに最後の関数である train を記載します。この関数内では、トレーニング・セットを繰り返し処理してテスト・パターンを (feedforward によって) ネットワークに適用してから、結果の出力に基づいて誤差を計算します。この誤差を基に、3 つの重みのそれぞれを学習レートならびに入力が及ぼす影響に応じて調整します。このプロセスは、誤差が検出されなくなった時点で (または繰り返し処理の最大回数に達した時点で) 停止します。

void train( void )
{
   int iterations = 0;
   int iteration_error = 0;
   int desired_output, output, error;

   // Train the boolean OR set
   ivector test[4] = { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } };

   do
   {
      iteration_error = 0.0;

      for ( int i = 0 ; i < ( sizeof( test ) / sizeof( ivector ) ) ; i++ )
      {
         desired_output = test[ i ][ 0 ] || test[ i ][ 1 ];
         output = feedforward( test[ i ] );

         error = desired_output - output;

         weights[ 0 ] += ( LEARNING_RATE * 
                           ( ( float ) error * ( float )test[ i ][ 0 ] ) );
         weights[ 1 ] += ( LEARNING_RATE * 
                           ( ( float ) error * ( float )test[ i ][ 1 ] ) );
         weights[ 2 ] += ( LEARNING_RATE * ( float ) error );

         iteration_error += ( error * error );
      }

   } while ( ( iteration_error > 0.0 ) && ( iterations++ < ITERATIONS ) );

   return;
}

この単純な例の出力は、以下のコード内で確認できます。この出力例では、OR 演算を学習するためにトレーニングを 3 回繰り返す必要がありました (丸括弧で囲まれた値が期待される出力です)。また、出力例には最終的な重みとバイアスも示されています。

$ ./perceptron 
Iteration 0
0 or 0 = 0 (0)
0 or 1 = 0 (1)
1 or 0 = 0 (1)
1 or 1 = 0 (1)
Iteration error 3

Iteration 1
0 or 0 = 0 (0)
0 or 1 = 0 (1)
1 or 0 = 0 (1)
1 or 1 = 1 (1)
Iteration error 2

Iteration 2
0 or 0 = 0 (0)
0 or 1 = 1 (1)
1 or 0 = 1 (1)
1 or 1 = 1 (1)
Iteration error 0

Final weights 0.374629 0.417000 bias 0.700291

以上のように、約 65 行の C コードで、パーセプトロン学習を実装できます。完全なソース・コードについては、このリンク先の GitHub サイトを参照してください。

多層ネットワーク

ニューロンの層を追加したことで、より複雑な問題をニューラル・ネットワークに適用できるようになりました。これと同じ原則が、現在の深層学習にも適用されています。つまり、さらに複雑で多様な問題を解決するための新しい発想により、層の数 (深さ) は次第に増えていきます (以下の図に示されている、入力層、隠れ層、出力層からなるネットワークの例を見てください)。

多層ネットワークを示す図
多層ネットワークを示す図

隠れ層は入力層から特徴を抽出するという重要な役割を果たしますが、その数 (およびそれぞれの隠れ層にあるニューロンの数) は、目の前の問題に応じて決まります。ネットワークの隠れ層にあまりにも多くのニューロンが含まれていると、入力パターンと過剰に適合して、そのパターンを記憶するだけに過ぎないため、ネットワークの法則化能力が制限されます。逆に、隠れ層に含まれるニューロンが少なすぎると、ネットワークが入力空間の特徴を表すことができなくなり、同じくネットワークの法則化能力が制約されることになります。一般に、ネットワークは小さければ小さいほど (ニューロンと重みの数が少ないほど)、優れたネットワークになります。

複数の層からなるネットワークを実行するプロセスは、パーセプトロン・モデルと同じように、入力が重みを使用して隠れ層にフィードされ、隠れ層の出力が重みを使用して出力層にフィードされます。出力は複数の特徴を表すことも、次のセクションでデモするように (最大の出力ニューロンが勝者となる) 勝者独り勝ち方式に含まれる単一の特徴を表すこともあります。

逆伝播

逆伝播アルゴリズムには長い歴史があります。最初に発表されたのは 1970 年代ですが、このアルゴリズムに秘められた可能性は 1980 年代になるまで認識されませんでした。それから 30 年以上経った今、逆伝播アルゴリズムはニューラル・ネットワークのトレーニングのためによく使われる手法であり続けています。逆伝播が非常に重要な手法となるわけは、速度と効率性の両方の点で優れているためです。逆伝播という名前は、ネットワーク内で誤差を逆方向に伝播するというプロセスから名付けられています。

逆伝播が辿るトレーニング・フローは、「パーセプトロン学習」のセクションで説明したフローと同様です。入力ベクトルがネットワークに適用されて、入力層から隠れ層へ、さらに隠れ層から出力層へと順方向で伝播されます。そして出力層で、ネットワーク内の各出力ニューロンの期待される出力と実際の出力を使用して誤差の値が計算されます。算出された誤差の値は、ネットワークの重みを使用して出力ニューロンから隠れ層へ、そして隠れ層から入力層へと逆方向で伝播されます。

このプロセスは、隠れ層が入力空間の特徴を認識するように編成されます。出力層は隠れ層の特徴を使用して解に辿り着きます。このあと実装例で説明しますが、最新のコンピューティングの観点からは逆伝播アルゴリズムは計算コストの高いアルゴリズムではありません。一方、GPU のおかげで、オブジェクト認識といった信じ難いほど難しいタスクに対応できる GPU ベースのシステムからなるクラスター内に膨大なネットワークを構築することが可能になっています。

逆伝播の例

逆伝播の単純な実装を見ていきましょう。この例では、Fisher の Iris flower データ・セットを使用して単純なネットワークをトレーニングします。このデータ・セットには 4 つの測定値が含まれています。具体的には、3 種類のアヤメの品種 (アイリスセトサ、アイリスバージカラー、アイリスバージニカ) の花びらの長さ、幅の測定値、がく片の長さ、幅の測定値です。この例では、測定された 4 つの特徴に基づいてアヤメを正常に分類できるようネットワークをトレーニングすることを目標とします。サンプル・コードを GitHub からダウンロードして自分で試してください。

以下のコード・リスティングに、この実装例で使用する変数の定義を示します。このコードでは、4 つの特徴を定義する入力層、25 個のニューロンが含まれる隠れ層、3 つのアヤメの品種の勝者独り勝ちを表現する出力層のサイズを定義しています。また、3 つの配列によって各ニューロン (入力ニューロン、隠れニューロン、出力ニューロン) の値を定義します。重みは、バイアスを含む 2 次元配列で表現されます。さらに、小さい学習レートも指定しています。

#define INP_NEURONS    4
#define HID_NEURONS   25
#define OUT_NEURONS    3

#define LEARNING_RATE 0.05

// Neuron cell values
double inputs[ INP_NEURONS+1 ];
double hidden[ HID_NEURONS+1 ];
double outputs[ OUT_NEURONS ];

// Weight values
double weights_hidden_input[ HID_NEURONS ][ INP_NEURONS+1 ];
double weights_output_hidden[ OUT_NEURONS ][ HID_NEURONS+1 ];

次に記載するサンプル・コードを見るとわかるように、トレーニング・データ・セットは、(4 つの特徴の) 個別のトレーニング・サンプルと、(3 つの出力ノードのうちの 1 つへの) 品種の分類で表現されています。データ・セット全体で 150 個のサンプルが含まれるため、以下に要約したバージョンを記載します。

// Test dataset with desired outputs (in a winner-takes-all fashion).
typedef struct dataset_s
{
   double inputs[ INP_NEURONS  ];
   double output[ OUT_NEURONS ];
} dataset_t;

dataset_t dataset[ ] = {
// Sepal Length, Sepal Width, Petal Length, Petal Width
                          // Iris-setosa
{ { 5.1, 3.5, 1.4, 0.2 }, { 1.0, 0.0, 0.0 } },
{ { 4.9, 3.0, 1.4, 0.2 }, { 1.0, 0.0, 0.0 } },
…
                          // Iris-versicolor
{ { 7.0, 3.2, 4.7, 1.4 }, { 0.0, 1.0, 0.0 } },
{ { 6.4, 3.2, 4.5, 1.5 }, { 0.0, 1.0, 0.0 } },
…
                         // Iris-virginica
{ { 6.3, 3.3, 6.0, 2.5 }, { 0.0, 0.0, 1.0 } },
{ { 5.8, 2.7, 5.1, 1.9 }, { 0.0, 0.0, 1.0 } },
…

以下のコード・リスティングに、ネットワークを実行するコードを記載します。このリスティングは 3 つの部分に分けることができます。最初の部分では、入力ニューロンを取り、隠れ層ニューロンの出力を計算します。次の部分では、隠れニューロンを取り、出力層ニューロンの出力を計算します。これが、(各層が S 字形アクティベーション関数を使用する) ネットワークを通じて順方向に入力をフィードする全プロセスです。出力が算出されると、出力ニューロンが繰り返し処理され、勝者独り勝ち形式に従って最大の値が選択されます。この出力ニューロンが、解として返されます。

// Given the test input, feed forward to the output.
int NN_Feed_Forward( void )
{
   int i, j, best;
   double max;

   // Calculate hidden layer outputs
   for ( i = 0 ; i < HID_NEURONS ; i++ )
   {
      hidden[ i ] = 0.0;

      for ( j = 0 ; j < INP_NEURONS+1; j++ )
      {
         hidden[ i ] += 
            ( weights_hidden_input[ i ][ j ] * inputs[ j ] );
      }
      hidden[ i ] = sigmoid( hidden[ i ] );
   }

   // Calculate output layer outputs
   for ( i = 0 ; i < OUT_NEURONS ; i++ )
   {
      outputs[ i ] = 0.0;
      for ( j = 0 ; j < HID_NEURONS+1 ; j++ )
      {
         outputs[ i ] += 
            ( weights_output_hidden[ i ][ j ] * hidden[ j ] );
      }
      outputs[ i ] = sigmoid( outputs[ i ] );
   }

   // Perform winner-takes-all for the network.
   best = 0;
   max = outputs[ 0 ];

   for ( i = 1 ; i < OUT_NEURONS ; i++ )
   {
      if ( outputs[ i ] > max )
      {
         best = i;
         max = outputs[ i ];
      }
   }

   return best;
}

以下のサンプル・コードに示されているように、逆伝播を使用して学習を実装します。この学習の実装は 4 部構成になっています。まず、出力ノードの誤差を計算します。個々のノードがそのノードの (期待される出力からの) 誤差とシグモイド関数の微分係数に基づいて単独で計算されます。続いて、隠れ層ニューロンの誤差が、出力誤差に与えるその影響に基づいて計算されます。最後の 2 つの部分では、誤差が出力層と隠れ層に適用されます。その際、学習レートによって全体の変化を最小限にして、何回かの繰り返し処理で調整できるようにします。

ニューロンの出力にある誤差が最小限になるため、このプロセスは最小化勾配下降探索を実装します (勾配には最大の誤差増加レートが示されるため、勾配の逆方向に探索を進めます)。

// Given a classification, backpropagate the error through the weights.
void NN_Backpropagate( int test )
{
   int out, hid, inp;

   double err_out[ OUT_NEURONS ];
   double err_hid[ HID_NEURONS ];

   // Calculate output node error
   for ( out = 0 ; out < OUT_NEURONS ; out++ )
   {
      err_out[ out ] = 
         ( ( double ) dataset[ test ].output[ out ] - outputs[ out ] ) *
            sigmoid_d( outputs[ out ] );
   }

   // Calculate the hidden node error
   for ( hid = 0 ; hid < HID_NEURONS ; hid++ )
   {
      err_hid[ hid ] = 0.0;
      for ( out = 0 ; out < OUT_NEURONS ; out++ )
      {
         err_hid[ hid ] += 
            err_out[ out ] * weights_output_hidden[ out ][ hid ];
      }
      err_hid[ hid ] *= sigmoid_d( hidden[ hid ] );
   }

   // Adjust the hidden to output layer weights
   for ( out = 0 ; out < OUT_NEURONS ; out++ )
   {
      for ( hid = 0 ; hid < HID_NEURONS ; hid++ )
      {
         weights_output_hidden[ out ][ hid ] += 
            LEARNING_RATE * err_out[ out ] * hidden[ hid ];
      }
   }

   // Adjust the input to hidden layer weights
   for ( hid = 0 ; hid < HID_NEURONS ; hid++ )
   {
      for ( inp = 0 ; inp < INP_NEURONS+1 ; inp++ )
      {
         weights_hidden_input[ hid ][ inp ] += 
            LEARNING_RATE * err_hid[ hid ] * inputs[ inp ];
      }
   }
}

この実装の最後の部分から、トレーニング・プロセス全体がわかります。繰り返し処理の回数を停止機能として使用して、ランダムなテスト・ケースを単純にネットワークに適用してから誤差を確認し、その誤差をネットワークの重みを介して逆伝播します。

// Train the network from the test vectors.
void NN_Train( int iterations )
{
   int test;

   for ( int i = 0 ; i < iterations ; i++ )
   {
      test = getRand( MAX_TESTS );

      NN_Set_Inputs( test );

      (void)NN_Feed_Forward( );

      NN_Backpropagate( test );
   }

   return;
}

以下の出力例に、逆伝播デモの結果が示されています。ネットワークをトレーニングしたら、データ・セットからランダムなサンプルを取り、それらのサンプルに対してネットワークをテストします。以下の出力例に示されているのは、テストに使用した 10 個のサンプルです。サンプルはすべて適切に分類されています (出力ニューロンのインデックスが出力されています)。括弧で囲まれている数字は、期待される出力ニューロンです (最初はインデックス 0 で、次はインデックス 1 といった具合です)。

$ ./backprop 
Test 9 classifed as 0 (1 0 0)
Test 133 classifed as 2 (0 0 1)
Test 78 classifed as 1 (0 1 0)
Test 129 classifed as 2 (0 0 1)
Test 1 classifed as 0 (1 0 0)
Test 59 classifed as 1 (0 1 0)
Test 31 classifed as 0 (1 0 0)
Test 87 classifed as 1 (0 1 0)
Test 122 classifed as 2 (0 0 1)
Test 138 classifed as 2 (0 0 1)

さらに詳しく調べてください

現在の機会学習では、ニューラル・ネットワークが優勢な勢力になっています。ニューラル・ネットワークの作成者たちの過度の期待に応えられず、停滞期に陥ったこともありましたが、現在のニューラル・ネットワークは、深層学習とこの分野での新しい手法 (時間と LSTM による逆伝播など) における大きな勢いを裏で支えています。1940 年代から 1950 年代にかけての単純なモデル (パーセプトロン) から 1970 年代から 1980 年代にかけての飛躍的前進 (逆伝播) に至るまで、脳の構造を模倣することを試みる単純なモデルの数々が、AI 分野での新しいアプリケーションと革新の推進力となっているのです。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1054421
ArticleTitle=ニューラル・ネットワークの徹底調査
publish-date=12072017