ニューラルネットワーク

ニューラルネットワーク（神経網、; NN）は「入力を線形変換する処理単位」がネットワーク状に結合した数理モデルである。人工ニューラルネットワーク () とも。
概要.
入力の線形変換を含む処理単位を考える。これらユニットの入出力が結合しネットワークを構成している数理モデルがニューラルネットワークである。各ユニットは入力の線形変換を必ず含み、多くの場合それに後続する非線形変換を含む（formula_1）。ユニットの構成（例: 線形変換の次元、非線形変換の有無・種類）やネットワークの構造（例: ユニットの数・階層構造・相互結合、入出力の再帰）により様々なモデルが提唱されている。
線形変換の重み（=入力の重み付け）が変化するとニューラルネットワークの出力も変化する。すなわち重みの学習が可能である。ゆえにニューラルネットワークは機械学習のモデルとして利用され、分類・回帰・生成など様々なクラスのタスクに教師あり/教師なし問わず利用される。利用分野にはパターン認識やデータマイニング（例: 画像認識、レコメンデーション）が挙げられる。学習法は誤差逆伝播法が主流である。
三層以上のニューラルネットワークは可微分で連続な任意関数を近似できることが証明されている（線形分離不可能な問題を解ける）。
形式ニューロンなど研究の源流としては生物の神経系の探求であるが、その当初から、それが実際に生物の神経系のシミュレーションであるか否かについては議論がある。生物学と相互の進展により、相違点なども研究されている。
歴史.
ニューラルネットワークという名称は歴史的に生物の神経に由来する。1つの神経細胞は他の神経細胞からの入力をシナプスで重み付けして受け取り、細胞体等での処理を介して、次の複数の神経細胞へと出力する。これらの結合により神経細胞群は全体としてネットワークを形成する。数理モデルとして見れば、ニューロンは入力の線形変換を含む1つの処理単位であり、これがネットワークを形成して神経をなしている。ゆえに神経的な（ニューラル）ネットワークモデルという意味でニューラルネットワークと名付けられた。処理単位は人工ニューロンあるいはノードと呼ばれる。線形変換の学習はシナプスの可塑的変化に対応している。
代表的な人工ニューラルネットワーク.
順伝播型ニューラルネットワーク.
順伝播型ニューラルネットワーク（フィードフォワードニューラルネットワーク、; FFN, FFNN）は内部に循環を持たないニューラルネットワークの総称・クラスである。
ニューラルネットワークではしばしば層（レイヤ）の概念を取り入れる。FFNでは入力レイヤ→中間レイヤ→出力レイヤというように単一方向/順方向へのみ信号が伝播する。これは回帰型ニューラルネットワークと対比される。層間の結合様式により様々なニューラルネットワークが存在するが、結合様式に関わらず回帰結合を持たないものはすべてFFNに属する。以下はFFNの一例である。
並列計算.
FFNがもつ特徴に並列計算がある。回帰結合をもつネットワークはシーケンシャルに処理を繰り返す必要があるため、1データに対して時間方向に並列計算できない。FFNは層内で並列計算が可能であり、RNNと比較して容易に並列計算機（例: GPU）の計算能力を上限まで引き出せる。
RBFネットワーク.
誤差逆伝播法に用いられる活性化関数に放射基底関数を用いたニューラルネットワーク
自己組織化写像.
自己組織化写像はが1982年に提案した教師なし学習モデルであり、多次元データのクラスタリング、可視化などに用いられる。自己組織化マップ、コホネンマップとも呼ばれる。
畳み込みニューラルネットワーク.
畳み込みニューラルネットワークとは層間が全結合ではない順伝播型ニューラルネットワークの一種。
画像を対象とするために用いられることが多い。
再帰型ニューラルネットワーク（リカレントニューラルネット、フィードバックニューラルネット）.
フィードフォワードニューラルネットと違い、双方向に信号が伝播するモデル。すべてのノードが他の全てのノードと結合を持っている場合、全結合リカレントニューラルネットと呼ぶ。シーケンシャルなデータに対して有効で、自然言語処理や音声、動画の解析などに利用される。
Transformer.
Self-Attention機構（自己注意機構）を利用したモデルである。再帰型ニューラルネットワークの代替として考案された。
従来の自然言語処理用モデルに比べ計算量が少なく構造も単純なため、自然言語処理に使われることが多い。
確率的ニューラルネット.
乱数による確率的な動作を導入した人工ニューラルネットワークモデル。モンテカルロ法のような統計的標本抽出手法と考えることができる。
スパイキングニューラルネットワーク.
ニューラルネットワークをより生物学的な脳の働きに近づけるため、活動電位（スパイク）を重視して作られた人工ニューラルネットワークモデル。スパイクが発生するタイミングを情報と考える。ディープラーニングよりも扱える問題の範囲が広い次世代技術と言われている。ニューラルネットワークの処理は逐次処理のノイマン型コンピュータでは処理効率が低く、活動電位まで模倣する場合には処理効率がさらに低下するため、実用する際には専用プロセッサとして実装される場合が多い。
2015年現在、スパイキングNN処理ユニットを積んだコンシューマー向けのチップとしては、QualcommのSnapdragon 820が登場する予定となっている。
複素ニューラルネットワーク.
入出力信号やパラメータ（重み、閾値）が複素数値であるようなニューラルネットワークで活性化関数は必然的に複素関数になる。
生成モデル/統計モデル.
生成モデル（統計モデルとも）は、データが母集団の確率分布に従って生成されると仮定しそのパラメータを学習するニューラルネットワークの総称である。統計的機械学習の一種といえる。モデル（＝母集団）からのサンプリングによりデータ生成が可能な点が特徴である（詳しくは、）。
自己回帰型生成ネット.
formula_2
自己回帰型生成ネット（Autoregressive Generative Network）とは、系列データの生成過程（同時確率分布）を系列の過去データに対する条件付分布の積と考え条件付分布をニューラルネットワークで表現するモデルである。非線形自己回帰生成モデルの一種、詳しくは。画像生成におけるPixelCNN、音声生成におけるWaveNet・WaveRNNがその例である。学習時は学習データを条件付け（=入力）にできるため、ニューラルネットワーク自体が再帰性を持っていなければ並列学習が容易である（CNN型のWaveNetなど）。ニューラルネットワーク自体に再帰性がある場合は学習時も系列に沿った逐次計算が必要となる（RNN型のWaveRNNなど）。
変分オートエンコーダ.
変分オートエンコーダ (VAE) とは、ネットワークA（エンコーダ）が確率分布のパラメータを出力し、ネットワークＢ（デコーダ）が確率分布から得られた表現をデータへと変換するモデルである。画像・音楽生成におけるVQ-VAE-2がその例である。
敵対的生成ネットワーク.
敵対的生成ネットワーク (Generative Adversarial Network, GAN) とは、ガウシアン等の確率分布から得られたノイズをネットワークA (Generator) がデータへ変換し、ネットワークBが母集団からサンプリングされたデータとネットワークＡの出力を見分けるように学習するモデルである。DCGANやStyleGAN、BigGANがその例である。
flow-based生成モデル.
flow-based生成モデルはFlow、Glow、NICE、realNVP等が存在する。
構成要素.
ニューラルネットワークは様々な要素を組み合わせからなる。各構成要素は経験的・理論的に示された特徴をニューラルネットワークへもたらしている。
バッチ正規化.
バッチ正規化（英: Batch Normalization）は学習時のミニバッチに対する正規化である。バッチ正規化レイヤー/BNでは学習時にバッチ内統計量（平均μ, 分散σ）を計算し、この統計量により各データを正規化する。その上で学習可能パラメータ (β, γ) を用いて y = γX+βの線形変換をおこなう。これにより値を一定のバラツキに押し込めた上で柔軟に線形変換することができる。
CNNの場合、各チャネルごとにバッチ正規化処理がおこなわれる。バッチ方向ではない正規化手法も様々提案されており、Layer Norm・Instance Norm・Group Normなどがある。また正規化時のβ・γを計算から求めたりNN(β)・NN(γ)で表現する手法も存在する。
活性化関数.
ニューラルネットワークにおいて、各人工神経は線形変換を施した後、非線形関数を通すが、これを活性化関数という。様々な種類があり、詳細は活性化関数を参照。
学習.
ニューラルネットワークの学習は、最適化問題として定式化できる。
現在最も広く用いられる手法は、勾配法の一種である勾配降下法を連鎖律と共に用いるバックプロパゲーションである。
勾配法によらない学習法 (gradient-free method) は歴史的にも多く用いられており、現在でも研究が進んでいる。
実装.
ニューラルネットワークは「線形変換 + 非線形活性化; formula_3」を基本単位とするため、実装の基礎はドット積ひいては積和演算になる。またレイヤー概念によりスカラ出力を束ねた出力ベクトルとなり（formula_4）、Level 2 BLAS すなわち行列ベクトル積が基礎となる。入力のバッチ化は入出力の行列化と同義であり（formula_5）、Level 3 BLAS すなわち行列積が基礎となる。
実装例.
ここでは、3層フィードフォワードニューラルネットワークで回帰を実装する。formula_6 において、formula_7 を学習する。活性化関数はReLUを使用。学習は、確率的勾配降下法でバックプロパゲーションを行う。
3層フィードフォワードニューラルネットワークのモデルの数式は以下の通り。X が入力、Y が出力、T が訓練データで全て数式では縦ベクトル。formula_8 は活性化関数。formula_9 が学習対象。formula_10 はバイアス項。
誤差関数は以下の通り。誤差関数は出力と訓練データの間の二乗和誤差を使用。
誤差関数 formula_13 をパラメータで偏微分した数式は以下の通り。肩についてる T は転置行列。formula_14 はアダマール積。
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):
 return np.maximum(0, x)
def activation_dash(x):
 return (np.sign(x) + 1) / 2
def forward(x):
 return w2 @ activation(w1 @ x + b1) + b2
def backward(x, diff):
 global w1, w2, b1, b2
 v1 = (diff @ w2) * activation_dash(w1 @ x + b1)
 v2 = activation(w1 @ x + b1)
 w1 -= learn_rate * np.outer(v1, x) # outerは直積
 b1 -= learn_rate * v1
 w2 -= learn_rate * np.outer(diff, v2)
 b2 -= learn_rate * diff
idxes = np.arange(train_count) # idxes は 0～63
for epoc in range(1000): # 1000エポック
 np.random.shuffle(idxes) # 確率的勾配降下法のため、エポックごとにランダムにシャッフルする
 error = 0 # 二乗和誤差
 for idx in idxes:
 y = forward(train_x[idx]) # 順方向で x から y を計算する
 diff = y - train_y[idx] # 訓練データとの誤差
 error += diff ** 2 # 二乗和誤差に蓄積
 backward(train_x[idx], diff) # 誤差を学習
 print(error.sum()) # エポックごとに二乗和誤差を出力。徐々に減衰して0に近づく。
推論.
ニューラルネットワークの学習（ディープラーニング）と対比して、ニューラルネットワークによる演算は推論（）と呼ばれる。
ハードウェアアクセラレーション.
ニューラルネットワークの推論を高速化する様々なハードウェアアクセラレーションAPIが提案・実装されている。GPUにおけるCUDA、WindowsにおけるDirectML、NVIDIAにおけるTensorRTなどが挙げられる。 
量子化.
量子化（）はニューラルネットワークの重み（weight）および演算入出力（activation）の数値表現精度を下げる最適化である。例えば8-bit量子化では通常FP32で表現される数値をINT8で表現する。
量子化の効果は以下の要素から生み出される。
量子化が最終的にメリットをもたらすかは上記の要素の組み合わせで決定される。効率的な命令セットを持たない場合、出力精度が下がりさらにQDQの計算負荷が勝って速度が悪化する場合もある。このように、量子化の効果はモデルとハードウェアに依存する。 
量子化手法にはいくつかのバリエーションがある。 
スパース化.
スパース化（）はニューラルネットワークの重みを疎行列とする最適化である。スパース化は精度の低下と速度の向上をもたらす。
スパース化の効果は以下の要素から生み出される。
スパース化の恩恵を受けるためにはそのためのフォーマットや演算が必要になる。ゼロ要素を省略する疎行列形式、疎行列形式に対応した演算実装などが挙げられる。またスパース化を前提として精度低下を防ぐよう学習する手法が存在する。
より広い意味での重み除去は枝刈り（）と呼ばれる。枝刈りでは行列のスパース化のみでなく、チャネルやモジュール自体の削除（ゼロ近似）を含む。