ニューラルネットワーク
ニューラルネットワーク（神経網、、略称: NN）は、脳機能に見られるいくつかの特性に類似した数理的モデルである。「マカロックとピッツの形式ニューロン」など研究の源流としては地球生物の神経系の探求であるが、その当初から、それが実際に生物の神経系のシミュレーションであるか否かについては議論があるため人工ニューラルネットワーク（artificial neural network、ANN）などと呼ばれることもある。また生物学と相互の進展により、相違点なども研究されている。
ニューラルネットワークはシナプスの結合によりネットワークを形成した人工ニューロン（ノード）が、学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般を指す。狭義には誤差逆伝播法を用いた多層パーセプトロンを指す場合もあるが、これは誤った用法である。一般的なニューラルネットワークでの人工ニューロンは生体のニューロンの動作を極めて簡易化したものを利用する。
ニューラルネットワークは、教師信号（正解）の入力によって問題に最適化されていく教師あり学習と、教師信号を必要としない教師なし学習に分けられることがあるが、本質的には教師なし学習と教師あり学習は等価である。三層以上のニューラルネットワークは可微分で連続な任意関数を近似できることが証明されている。
画像や統計など多次元量のデータで線形分離不可能な問題に対して、比較的小さい計算量で良好な解を得られることが多い。
現在では、画像認識、市場における顧客データに基づく購入物の類推などとして応用されている(パターン認識、データマイニング)。（フィードフォワードニューラルネットワーク、略称: FFNN）は、最初に考案された単純な構造の人工ニューラルネットワークモデルである。ネットワークにループする結合を持たず、入力ノード→中間ノード→出力ノードというように単一方向へのみ信号が伝播するものを指す。教師信号によるニューラルネットワークの学習は心理学者ドナルド・ヘッブが1949年に提唱したシナプス可塑性についての法則、「ヘッブの法則」に基づく。神経細胞間のネットワークの繋がりが太くなり、その結果、特定の細胞への情報伝達経路が作られる(情報が流れやすくなる)、これを学習とする。パーセプトロンは学習の結果、集合を超平面により分割する。この学習は有限回の試行で収束することがマービン・ミンスキーによって1969年に証明された。
1986年にデビッド・ラメルハートらにより誤差逆伝播法（バックプロパゲーション）が提案され、多層パーセプトロンの学習モデルとして使用されている。バックプロパゲーションは主に中間層が1層の時に使われ、中間層が2層以上ある時は深層学習と呼ばれ、入力に近い側の層をオートエンコーダで学習してから積み上げていく方法などが提案されている。
各層を formula_1 と置くと、下記漸化式で表現される。3層の場合は、formula_2 が入力層、formula_3 が中間層、formula_4 が出力層。
formula_6 と formula_7 はパラメータ。formula_6 は行列、formula_7 と formula_1 は縦ベクトル。formula_11 を重みパラメータ、formula_12 をバイアスパラメータと呼ぶ。formula_13 は活性化関数と呼び、単純パーセプトロンでは使われていなかった、つまり、formula_14であったが、すると線形になってしまうので、現在は何らかの非線形関数を使う。微分可能な単調関数を使うことが一般的。最もよく使われるのはシグモイド関数の formula_15。
学習は誤差を最小化する最適化問題を解く。最適化問題の解法はバックプロパゲーションを使うのが一般的。誤差は二乗和誤差を使うのが一般的。汎化能力を高めるために、誤差に正則化項を加算することが多い。2次の正則化項を追加する場合、誤差に formula_16 を加算する。formula_17 は formula_18 の要素。formula_19 は実数のパラメータ。
誤差逆伝播法に用いられる活性化関数に放射基底関数を用いたニューラルネットワーク
自己組織化写像はが1982年に提案した教師なし学習モデルであり、多次元データのクラスタリング、可視化などに用いられる。自己組織化マップ、コホネンマップとも呼ばれる。
畳み込みニューラルネットワークとは層間が全結合ではない順伝播型ニューラルネットワークのこと。
フィードフォワードニューラルネットと違い、双方向に信号が伝播するモデル。すべてのノードが他の全てのノードと結合を持っている場合、全結合リカレントニューラルネットと呼ぶ。
乱数による確率的な動作を導入した人工ニューラルネットワークモデル。モンテカルロ法のような統計的標本抽出手法と考えることができる。
ニューラルネットワークをより生物学的な脳の働きに近づけるため、活動電位（スパイク）を重視して作られた人工ニューラルネットワークモデル。スパイクが発生するタイミングを情報と考える。ディープラーニングよりも扱える問題の範囲が広い次世代技術と言われている。ニューラルネットワークの処理は逐次処理のノイマン型コンピュータでは処理効率が低く、活動電位まで模倣する場合には処理効率がさらに低下するため、実用する際には専用プロセッサとして実装される場合が多い。
2015年現在、スパイキングNN処理ユニットを積んだコンシューマー向けのチップとしては、QualcommのSnapdragon 820が登場する予定となっている。
入出力信号やパラメータ（重み、閾値）が複素数値であるようなニューラルネットワークで活性化関数は必然的に複素関数になる。ニューラルネットワークにおいて、各人工神経は線形変換を施した後、非線形関数を通すが、これを活性化関数という。様々な種類があり、詳細は活性化関数を参照。
ニューラルネットワークの学習は、最適化問題として定式化できる。
現在最も広く用いられる手法は、勾配法の一種である勾配降下法を連鎖律と共に用いるバックプロパゲーションである。
勾配法によらない学習法 (gradient-free method) は歴史的にも多く用いられており、現在でも研究が進んでいる。
ここでは、3層フィードフォワードニューラルネットワークで回帰を実装する。formula_20 において、formula_21 を学習する。活性化関数は ReLU を使用。学習は、確率的勾配降下法でバックプロパゲーションを行う。
3層フィードフォワードニューラルネットワークのモデルの数式は以下の通り。X が入力、Y が出力、T が訓練データで全て数式では縦ベクトル。formula_22 は活性化関数。formula_23 が学習対象。formula_24 はバイアス項。
誤差関数は以下の通り。誤差関数は出力と訓練データの間の二乗和誤差を使用。
誤差関数 formula_27 をパラメータで偏微分した数式は以下の通り。肩についてる T は転置行列。formula_28 はアダマール積。
Python 3.5 によるソースコード。Python において、@ は行列の乗法の演算子、** は冪乗の演算子、行列同士の * はアダマール積。
import numpy as np
dim_in = 1 # 入力は1次元
dim_out = 1 # 出力は1次元
hidden_count = 1024 # 隠れ層のノードは1024個
learn_rate = 0.005 # 学習率
train_count = 64 # 訓練データ数
train_x = np.arange(-1, 1, 2 / train_count).reshape((train_count, dim_in))
train_y = np.array([2 * x ** 2 - 1 for x in train_x]).reshape((train_count, dim_out))
w1 = np.random.rand(hidden_count, dim_in) - 0.5
w2 = np.random.rand(dim_out, hidden_count) - 0.5
b1 = np.random.rand(hidden_count) - 0.5
b2 = np.random.rand(dim_out) - 0.5
def activation(x):
def activation_dash(x):
def forward(x):
def backward(x, diff):
idxes = np.arange(train_count) # idxes は 0～63
for epoc in range(1000): # 1000エポック