バックプロパゲーション
バックプロパゲーション(英: Backpropagation)または誤差逆伝播法(ごさぎゃくでんぱほう)[1]は、機械学習において、ニューラルネットワークを学習させるための教師あり学習のアルゴリズムである。1986年にbackwards propagation of errors(後方への誤差伝播)の略からデビッド・ラメルハートらによって命名された[2]。
隠れ層のない2層のニューラルネットワークでの出力誤差からの確率的勾配降下法は1960年にB. Widrow と M.E. Hoff, Jr. らが Widrow-Hoff 法(デルタルール)という名称で発表した[3][4]。隠れ層のある3層以上の物は、1967年に甘利俊一が発表した[5][6]。その後、何度も再発見され、1969年にアーサー・E・ブライソン(Arthur E. Bryson)と何毓琦が多段動的システム最適化手法として提案した[7][8]。ニューラルネットワークでの応用の物として、1974年のポール・ワーボス[9]がある。1986年のデビッド・ラメルハート、ジェフリー・ヒントン、ロナルド・J・ウィリアムス[10][2]らの再発見により定着し、特に1986年の発表以降ニューラルネットワーク研究が注目を浴び再活性化することになった。
教師あり学習手法であり、デルタルールを一般化したものと言える。訓練集合を作るには、多数の入力について必要とされる出力を事前に定めておく必要がある。フィードフォワードネットワーク(フィードバックを持たない、あるいは単にループするコネクションを持たないネットワーク)で最も効果を発揮する。バックプロパゲーションでは、人工ニューロン(または「ノード」)で使われる活性化関数が可微分でなければならない。
概要
技術の要約は次の通りである:
- ニューラルネットワークに学習のためのサンプルを与える。
- ネットワークの出力とそのサンプルの最適解を比較する。各出力ニューロンについて誤差を計算する。
- 個々のニューロンの期待される出力値と倍率(scaling factor)、要求された出力と実際の出力の差を計算する。これを局所誤差と言う。
- 各ニューロンの重みを局所誤差が小さくなるよう調整する。
- より大きな重みで接続された前段のニューロンに対して、局所誤差の責任があると判定する。
- そのように判定された前段のニューロンのさらに前段のニューロン群について同様の処理を行う。
このアルゴリズムの名が暗示するように、エラー(および学習)は出力ノードから後方のノードへと伝播する。技術的に言えば、バックプロパゲーションはネットワーク上の変更可能な重みについて、誤差の傾斜を計算するものである[11]。この傾斜はほとんどの場合、誤差を最小にする単純なアルゴリズムである確率的最急降下法で使われる。「バックプロパゲーション」という用語はより一般的な意味でも使われ、傾斜を求める手順と確率的最急降下法も含めた全体を示す。バックプロパゲーションは通常すばやく収束して、対象ネットワークの誤差の局所解(区間を限定したときの極小値、極値参照)を探し出す。
バックプロパゲーションを行う場合、ネットワークは少なくとも三層以上でなければならない(入力層、中間層、出力層)。また、多層ネットワークの中間層が意味のある関数を表すには、非線形の活性化関数でなければならない。線形な活性化関数の多層ネットワークは、単層ネットワークと等価である。非線形の活性化関数としては、ロジスティック関数(中でも tanh などのシグモイド関数)、ソフトマックス関数、ガウス関数などが一般的であったが、中間層の活性化関数としては現在は max(x, 0) が最善であるとされている[12]。
バックプロパゲーションのアルゴリズムは何度か再発見されており、逆積算モードにおける自動微分という汎用技法の特殊ケースと見ることもできる。
また、ガウス・ニュートン法とも密接に関連する。
オンライン学習
学習には、オンライン(逐次的)学習とバッチ学習という2つの方法がある。オンライン(逐次的)学習では、個々のプロパゲーションの直後に重み付けの更新を行う。バッチ学習では全ての訓練データ一括でまとめて重み付けの更新を行う。オンライン学習で数個まとめるのをミニバッチと言う。バッチ学習ではメモリ容量をより多く必要とするが、オンライン学習では更新処理が多くなる。
テクニック
バックプロパゲーションを使用するにあたり、気をつけるべきテクニックがあり、不適切に利用すると正しい値に収束しなかったり、収束が遅くなったりする。特に4層以上の深層ニューラルネットワークでおかしな事になりやすい。標準的なテクニックを Yann LeCun らが1998年にまとめていて[13]、2010年に Xavier Glorot らが追証・発展させている[14]。以下に要約する。詳細はそれぞれの論文を参照。
- バッチ学習よりも確率的勾配降下法によるオンライン学習を使う
- オンライン学習において訓練データが一周したら毎回シャッフルし直す
- 入力は、平均を0にし、主成分分析により線形相関を取り除き、分散が1になるように線形変換する。面倒だったら主成分分析は省略しても良い。
- 活性化関数は原点を通る物を使用する。標準シグモイド関数は f(0) = 0.5 のため不適切で、tanh は原点を通るので良い。Yann LeCun らは 1.7159 * tanh(2 / 3 * x) を薦めているが、Xavier Glorot らは単に tanh(x) で十分としている。Yann LeCun らの意図は f(±1) = ±1 にすることにある。どちらも f(0) = 0, f'(0) = 1。
- 目標値(出力)は活性化関数を通す場合は、二次導関数が最大になる範囲内を使用するべきである。1.7159 * tanh(2 / 3 * x) の場合は -1〜1 で、tanh(x) の場合は 〜 = -0.65848 〜 0.65848 である。
- 全ての層が平均0分散1から開始できるようにするべきである。そのために、重みパラメータの初期値は、Yann LeCun らは重みの分散が 1 / 入ってくる入力数 にすることで、合計分散1になるのでこれが望ましく、そして連続一様分布が良く、つまり、 が良いとしている。Xavier Glorot らは出力も考慮に入れるべきとして、 を薦めている。deeplearning.net のチュートリアルも参照[15]。
- 学習率は徐々に小さくしていくべきであり、Yann LeCun らは (cは定数、tはエポック数)は減るのが速すぎるとしているが、deeplearning.net のチュートリアルは を薦めている[15]。より複雑な方法としてはAdaGradが2011年に[16]、RMSPropが2012年に提案されている[17]。
2010年に Xavier Glorot らは良いS字の活性化関数としてこの2つをあげている[14]。全て f(0) = 0, f'(0) = 1, 値域は-1〜1。
翌年の2011年、Xavier Glorot らは隠れ層の活性化関数として max(x, 0) を使った方が tanh(x) よりも改善するということを発表した[18]。Yann LeCun やジェフリー・ヒントンらが雑誌ネイチャーに書いた論文では、2015年5月現在これが最善であるとしている[12]。ニューラルネットワークの世界では現在は ReLU と呼ばれるが、一般的にはこの関数はランプ関数と呼ばれ、また、この活性化関数は昔から使われており1980年代頃はアナログ閾素子(英: analog threshold element)と呼ばれていた[19]。線形補間(1次スプライン補間)の手法。
- ReLU(ランプ関数):
学習率の調整方法
学習率の調整方法として2011年に John Duchi らが AdaGrad を発表し[16]、2012年に RMSProp が発表された[17]。Yann LeCun らは1998年にパラメータごとに学習率を変えた方が良いと述べているが、これらもパラメータごとに学習率を変えている。これらの手法のコンセプトは勾配がなめらかな所で学習率を高めることにある。
AdaGrad は以下の方法で学習率 をパラメータごとに設定していく。方法としてはパラメータごとに誤差関数の勾配の二乗累積和を計算し、学習率はその平方根で割る。 は r が 0 に近い時に学習率が無限大に行かないようにするために入れる物で、例えば 等の小さな数値を入れる。 は全パラメータ共通の学習率の初期値。t はエポック数。
RMSProp は以下の方法で学習率 をパラメータごとに設定していく。AdaGrad との違いは、誤差関数の勾配の二乗を扱う際に累積和ではなく指数移動平均を使うことにある。追加になったハイパーパラメータは で 0.9 等を使う。AdaGrad では学習率は常に減少していくが、指数移動平均を使ったことにより、増減するようになった。
高速化
GPU
行列の掛け算は GPGPU が得意としており、高速に計算できる。Python では Theano などのライブラリ、および、それを間接的に使用してる機械学習のライブラリなどがある。
CPUによる並列化
CPUのメニーコアやSIMDを有効活用する簡単な方法は行列演算ライブラリを使用する方法である。行列演算ライブラリとしては、例えばインテルのCPU向けでは Intel Math Kernel Library などがある。
バックプロパゲーションは完了までに非常に時間のかかる反復処理である。マルチコアのコンピュータでマルチスレッド技法を使えば、収斂までにかかる時間を大幅に短縮することができる。バッチ学習を行う場合、マルチスレッドでバックプロパゲーションのアルゴリズムを実行するのが比較的簡単である。
訓練データをそれぞれのスレッド毎に同程度の大きさに分割して割り当てる。それぞれのスレッドで順方向と逆方向のプロパゲーションを行う。重みとしきい値のデルタをスレッド毎に合計していく。反復の周回毎に全スレッドを一時停止させて、重みとしきい値のデルタを合計し、ニューラルネットワークに適用する。これを反復毎に繰り返す。このようなバックプロパゲーションのマルチスレッド技法が Encog Neural Network Framework で使われている[20]。
限界
- バックプロパゲーションによる学習での収斂は非常に遅い。
- バックプロパゲーションによる学習は、必ず収斂するとは限らない。
- 広域的な最適解ではなく局所的な誤差最小点に収斂することが多い。
- 場合により入力データに前処理が要る。入力は活性化関数の値域内でなければならない。各次元の分散に差がありすぎると分散の小さいところに重みが集中しやすい。
- 多層になると変数の数が増えすぎて解がほとんど意味をなさなくなる
- 出力を0.0~1.0に規格化する活性化関数を使用していると、出力層から遠くなるに従って信号が減衰する。
脚注
- ^ 逆誤差伝搬法(ぎゃくごさでんぱんほう)と呼ばれることもあるが,電波伝播に対する電波伝搬と同じく誤読に起因する誤字である。
- ^ a b Rumelhart, David E.; Hinton, Geoffrey E., Williams, Ronald J. (8 October 1986). “Learning representations by back-propagating errors”. Nature 323 (6088): 533–536. doi:10.1038/323533a0.
- ^ Benerard Widrow; M.E. Hoff, Jr. (August 1960). “Adaptive Switching Circuits”. IRE WESCON Convention Record 4: 96-104 .
- ^ Benerard Widrow; Michael A. Lehr (1995). Perceptorons, Adalines, and Backpropagation .
- ^ Shun-ichi Amari (June 1967). “Theory of adaptive pattern classifiers”. IEEE Transactions EC-1: 299–307. doi:10.1109/PGEC.1967.264666.
- ^ Shun-ichi Amari (2013). “Dreaming of mathematical neuroscience for half a century”. Neural Networks 37: 48–51.
- ^ Stuart Russell and Peter Norvig. Artificial Intelligence A Modern Approach. p. 578. "The most popular method for learning in multilayer networks is called Back-propagation. It was first invented in 1969 by Bryson and Ho, but was largely ignored until the mid-1980s."
- ^ Arthur Earl Bryson, Yu-Chi Ho (1969). Applied optimal control: optimization, estimation, and control. Blaisdell Publishing Company or Xerox College Publishing. pp. 481
- ^ Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974
- ^ Alpaydın, Ethem (2010). Introduction to machine learning (2nd ed. ed.). Cambridge, Mass.: MIT Press. p. 250. ISBN 978-0-262-01243-0. "...and hence the name backpropagation was coined (Rumelhart, Hinton, and Williams 1986a)."
- ^ Paul J. Werbos (1994). The Roots of Backpropagation. From Ordered Derivatives to Neural Networks and Political Forecasting. New York, NY: John Wiley & Sons, Inc.
- ^ a b Yann LeCun; Yoshua Bengio; Geoffrey Hinton (2015-05-28). “Deep learning”. Nature 521 (7553): 436-444. doi:10.1038/nature14539.
- ^ Yann LeCun; Leon Bottou; Genevieve B. Orr; Klaus-Robert Muller (1998). Efficient BackProp .
- ^ a b Xavier Glorot; Yoshua Bengio (2010). Understanding the difficulty of training deep feedforward neural networks .
- ^ a b Multilayer Perceptron — DeepLearning 0.1 documentation
- ^ a b John Duchi; Elad Hazan; Yoram Singer (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization .
- ^ a b T. Tieleman; G. Hinton (2012). Lecture 6.5 - rmsprop, COURSERA: Neural Networks for Machine Learning.
- ^ Xavier Glorot; Antoine Bordes; Yoshua Bengio. “Deep Sparse Rectifier Neural Networks”. Proceedings of the Fourteenth International Conference on Artificial Intelligence and Statistics (AISTATS-11) 15: 315-323 .
- ^ 福島邦彦『神経回路と情報処理』朝倉書店、1989年。ISBN 978-4254120639。
- ^ J. Heaton http://www.heatonresearch.com/encog/mprop/compare.html Applying Multithreading to Resilient Propagation and Backpropagation
外部リンク
- 多層ニューラルネットワークと自己組織化写像のアプリケーション
- ニューラルネットワーク入門
- バックプロパゲーション
- Chapter 7 The backpropagation algorithm of Neural Networks - A Systematic Introduction by Raul Rojas (ISBN 978-3540605058)
- Implementation of BackPropagation in C#
- Implementation of BackPropagation in Ruby
- Backpropagation Algorithm Explained In Simple English: Along with a sample implementation in Microsoft.NET
- Quick explanation of the backpropagation algorithm
- Graphical explanation of the backpropagation algorithm
- Concise explanation of the backpropagation algorithm using math notation
- Backpropagation for mathematicians
- Implementation of BackPropagation in C++
- Implementation of BackPropagation in Java
- Implementation of BackPropagation in Python
- Implementation of BackPropagation in PHP
- Backpropagation neural network tutorial at the Wikiversity