バックプロパゲーション
バックプロパゲーション(英: 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]らの適用と発表により定着した。ブームとしては1990年代に退潮もあったものの、21世紀に入って以降のブーム、いわゆる「ディープラーニング」でも基本はこの手法である。
概要編集
誤差を最小化して任意関数を近似することが出来る。 そのアルゴリズムは次の通りである:
- ニューラルネットワークに学習のためのサンプルを与える。
- ネットワークの出力を求め、出力層における誤差を求める。その誤差を用い、各出力ニューロンについて誤差を計算する。
- 個々のニューロンの期待される出力値と倍率 (scaling factor)、要求された出力と実際の出力の差を計算する。これを局所誤差と言う。
- 各ニューロンの重みを局所誤差が小さくなるよう調整する。
- より大きな重みで接続された前段のニューロンに対して、局所誤差の責任があると判定する。
- そのように判定された前段のニューロンのさらに前段のニューロン群について同様の処理を行う。
このアルゴリズムの名が暗示するように、エラー(および学習)は出力ノードから後方のノードへと伝播する。技術的に言えば、バックプロパゲーションはネットワーク上の変更可能な重みについて、誤差の傾斜を計算するものである[11]。この傾斜はほとんどの場合、誤差を最小にする単純なアルゴリズムである確率的最急降下法で使われる。「バックプロパゲーション」という用語はより一般的な意味でも使われ、傾斜を求める手順と確率的最急降下法も含めた全体を示す。バックプロパゲーションは通常すばやく収束して、対象ネットワークの誤差の局所解(区間を限定したときの極小値、極値参照)を探し出す。
バックプロパゲーションを行う場合、ネットワークは少なくとも三層以上でなければならない(入力層、中間層、出力層)。また、多層ネットワークの中間層が意味のある関数を表すには、非線形の活性化関数でなければならない。線形な活性化関数の多層ネットワークは、単層ネットワークと等価である。非線形の活性化関数としては、ロジスティック関数(中でも tanh などのシグモイド関数)、ソフトマックス関数、ガウス関数などが一般的であったが、中間層の活性化関数としては現在はmax(x, 0) が最善であるとされている[12]。
バックプロパゲーションのアルゴリズムは何度か再発見されており、逆積算モードにおける自動微分という汎用技法の特殊ケースと見ることもできる。
また、ガウス・ニュートン法とも密接に関連する。
オンライン学習編集
学習には、オンライン(逐次的)学習とバッチ学習という2つの方法がある。オンライン(逐次的)学習では、個々のプロパゲーションの直後に重み付けの更新を行う。バッチ学習では全ての訓練データ一括でまとめて重み付けの更新を行う。オンライン学習で数個まとめるのをミニバッチと言う。バッチ学習ではメモリ容量をより多く必要とするが、オンライン学習では更新処理が多くなる。
テクニック編集
バックプロパゲーションを使用するにあたり、気をつけるべきテクニックがあり、不適切に利用すると正しい値に収束しなかったり、収束が遅くなったりする。特に4層以上の深層ニューラルネットワークでおかしな事になりやすい。標準的なテクニックをヤン・ルカンらが1998年にまとめていて[13]、2010年に Xavier Glorot らが追証・発展させている[14]。以下に要約する。詳細はそれぞれの論文を参照。
- バッチ学習よりも確率的勾配降下法によるオンライン学習を使う
- オンライン学習において訓練データが一周したら毎回シャッフルし直す
- 入力は、平均を0にし、主成分分析により線形相関を取り除き、分散が1になるように線形変換する。面倒だったら主成分分析は省略しても良い。
- 活性化関数は原点を通る物を使用する。標準シグモイド関数は f(0) = 0.5 のため不適切で、tanhは原点を通るので良い。ヤン・ルカンらは を薦めているが、Xavier Glorotらは単に tanh(x) で十分としている。ヤン・ルカンらの意図は f(±1) = ±1 にすることにある。どちらも f(0) = 0, f'(0) = 1。
- 目標値(出力)は活性化関数を通す場合は、二次導関数が最大になる範囲内を使用するべきである。 の場合は −1〜1 で、tanh(x) の場合は 〜 = −0.65848 〜 0.65848 である。
- 全ての層が平均0分散1から開始できるようにするべきである。そのために、重みパラメータの初期値は、ヤン・ルカンらは重みの分散が 1 / 入ってくる入力数 にすることで、合計分散1になるのでこれが望ましく、そして連続一様分布が良く、つまり、 が良いとしている。Xavier Glorotらは出力も考慮に入れるべきとして、 を薦めている。deeplearning.netのチュートリアルも参照[15]。
- 学習率は徐々に小さくしていくべきであり、ヤン・ルカンらは (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]。ヤン・ルカンやジェフリー・ヒントンらが雑誌ネイチャーに書いた論文では、2015年5月現在これが最善であるとしている[12]。ニューラルネットワークの世界では現在はReLUと呼ばれるが、一般的にはこの関数はランプ関数と呼ばれ、また、この活性化関数は昔から使われており1980年代頃はアナログ閾素子(英: analog threshold element)と呼ばれていた[19]。線形補間(1次スプライン補間)の手法。
- ReLU(ランプ関数):
学習率の調整方法編集
学習率の調整方法として2011年にJohn DuchiらがAdaGradを発表し[16]、2012年にRMSPropが発表された[17]。ヤン・ルカンらは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に近い部分が存在する活性化関数を使っていると勾配消失を起こしやすい。
- 誤差を最小化して任意関数を近似するため、中心極限定理に従わないデータは学習できない。
脚注編集
- ^ 逆誤差伝搬法(ぎゃくごさでんぱんほう)と呼ばれることもあるが,電波伝播に対する電波伝搬と同じく誤読に起因する誤字である。
- ^ 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