バックプロパゲーション

バックプロパゲーション（）または誤差逆伝播法（ごさぎゃくでんぱほう）はニューラルネットワークの学習アルゴリズムである。
概要.
バックプロパゲーションは数理モデルであるニューラルネットワークの重みを層の数に関わらず更新できる（学習できる）アルゴリズムである。ディープラーニングの主な学習手法として利用される。
そのアルゴリズムは次の通りである：
アルゴリズム名が示唆するように、エラー（および学習）は出力ノードから後方のノードへと伝播する。技術的に言えば、バックプロパゲーションはネットワーク上の変更可能な重みについて、誤差の傾斜を計算するものである。この傾斜はほとんどの場合、誤差を最小にする単純なアルゴリズムである確率的最急降下法で使われる。「バックプロパゲーション」という用語はより一般的な意味でも使われ、傾斜を求める手順と確率的最急降下法も含めた全体を示す。バックプロパゲーションは通常すばやく収束して、対象ネットワークの誤差の局所解(区間を限定したときの極小値、極値参照)を探し出す。人工ニューロン(または「ノード」)で使われる活性化関数は可微分でなければならない。また、ガウス・ニュートン法とも密接に関連する。
バックプロパゲーションのアルゴリズムは何度か再発見されており、逆積算モードにおける自動微分という汎用技法の特殊ケースと見ることもできる。
数理最適化問題の一種であるため、バッチ学習・オンライン学習のいずれかが採用される。典型的には確率的勾配降下法を用いたミニバッチ学習が行われる。
目的.
ネットワーク formula_1 に対する誤差関数 formula_2 を定義したとき、現在の重み formula_3 における formula_4 の傾きすなわち偏微分値 formula_5 がわかれば、最適化手法である勾配法を用いて誤差 formula_4 が小さくなるように formula_7 を更新（=学習）できる。学習アルゴリズムであるバックプロパゲーションの目的はこの勾配値を得て重みを学習することである。
テクニック.
バックプロパゲーションを用いて（深層）ニューラルネットワークモデルを素早く・最適解へ収束させるために様々なテクニックが提唱されている。
標準的なテクニックをヤン・ルカンらが1998年にまとめていて、2010年に Xavier Glorot らが追証・発展させている。以下に要約する。詳細はそれぞれの論文を参照。
高速化.
GPU.
行列の掛け算はGPGPUが得意としており、高速に計算できる。PythonではTheanoなどのライブラリおよびそれを間接的に使用してる機械学習のライブラリなどがある。
CPUによる並列化.
CPUのメニーコアやSIMDを有効活用する簡単な方法は行列演算ライブラリを使用する方法である。行列演算ライブラリとしては、例えばインテルのCPU向けではIntel Math Kernel Libraryなどがある。
バックプロパゲーションは完了までに非常に時間のかかる反復処理である。マルチコアのコンピュータでマルチスレッド技法を使えば、収斂までにかかる時間を大幅に短縮することができる。バッチ学習を行う場合、マルチスレッドでバックプロパゲーションのアルゴリズムを実行するのが比較的簡単である。
訓練データをそれぞれのスレッド毎に同程度の大きさに分割して割り当てる。それぞれのスレッドで順方向と逆方向のプロパゲーションを行う。重みとしきい値のデルタをスレッド毎に合計していく。反復の周回毎に全スレッドを一時停止させて、重みとしきい値のデルタを合計し、ニューラルネットワークに適用する。これを反復毎に繰り返す。このようなバックプロパゲーションのマルチスレッド技法がEncog Neural Network Frameworkで使われている。
歴史.
バックプロパゲーションに相当（連鎖律+勾配法）するニューラルネットワーク学習手法は何度も再発見されてきた。
21世紀におけるディープラーニングではバックプロパゲーションが学習法としてよく用いられる。