バックプロパゲーション

ニューラルネットワーク > バックプロパゲーション バックプロパゲーション（英: Backpropagation）または誤差逆伝播法（ごさぎゃくでんぱほう）はニューラルネットワークの学習アルゴリズムである。 バックプロパゲーションは数理モデルであるニューラルネットワークの重みを層の数に関わらず更新できる（学習できる）アルゴリズムである。ディープラーニングの主な学習手法として利用される。 そのアルゴリズムは次の通りである： ニューラルネットワークに学習のためのサンプルを与える。 ネットワークの出力を求め、出力層における誤差を求める。その誤差を用い、各出力ニューロンについて誤差を計算する。 個々のニューロンの期待される出力値と倍率 (scaling factor)、要求された出力と実際の出力の差を計算する。これを局所誤差と言う。 各ニューロンの重みを局所誤差が小さくなるよう調整する。 より大きな重みで接続された前段のニューロンに対して、局所誤差の責任があると判定する。 そのように判定された前段のニューロンのさらに前段のニューロン群について同様の処理を行う。 アルゴリズム名が示唆するように、エラー（および学習）は出力ノードから後方のノードへと伝播する。技術的に言えば、バックプロパゲーションはネットワーク上の変更可能な重みについて、誤差の傾斜を計算するものである。この傾斜はほとんどの場合、誤差を最小にする単純なアルゴリズムである確率的最急降下法で使われる。「バックプロパゲーション」という用語はより一般的な意味でも使われ、傾斜を求める手順と確率的最急降下法も含めた全体を示す。バックプロパゲーションは通常すばやく収束して、対象ネットワークの誤差の局所解(区間を限定したときの極小値、極値参照)を探し出す。人工ニューロン(または「ノード」)で使われる活性化関数は可微分でなければならない。また、ガウス・ニュートン法とも密接に関連する。 バックプロパゲーションのアルゴリズムは何度か再発見されており、逆積算モードにおける自動微分という汎用技法の特殊ケースと見ることもできる。 数理最適化問題の一種であるため、バッチ学習・オンライン学習のいずれかが採用される。典型的には確率的勾配降下法を用いたミニバッチ学習が行われる。 ネットワーク y ^ = f ( x ; w ) {\displaystyle {\hat {y}}=f(x;w)} に対する誤差関数 E ( y ^ , y ) {\displaystyle E({\hat {y}},y)} を定義したとき、現在の重み w k = a n o w {\displaystyle w_{k}=a_{now}} における E {\displaystyle E} の傾きすなわち偏微分値 ∂ E ∂ w k | w k = a n o w {\displaystyle \left.{\partial E \over \partial w_{k}}\right|_{w_{k}=a_{now}}} がわかれば、最適化手法である勾配法を用いて誤差 E {\displaystyle E} が小さくなるように w k {\displaystyle w_{k}} を更新（=学習）できる。学習アルゴリズムであるバックプロパゲーションの目的はこの勾配値を得て重みを学習することである。膨大数の偏微分値を自動微分により高速計算することで、極めて多次元の最適化計算の実用的な高速化が可能となる。 バックプロパゲーションを用いて（深層）ニューラルネットワークモデルを素早く・最適解へ収束させるために様々なテクニックが提唱されている。 標準的なテクニックをヤン・ルカンらが1998年にまとめていて、2010年に Xavier Glorot らが追証・発展させている。以下に要約する。詳細はそれぞれの論文を参照。 オンライン学習において訓練データが一周したら毎回シャッフルし直す 入力は、平均を0にし、主成分分析により線形相関を取り除き、分散が1になるように線形変換する。面倒だったら主成分分析は省略しても良い。 目標値（出力）は活性化関数を通す場合は、二次導関数が最大になる範囲内を使用するべきである。 1.7159 tanh ⁡ ( 2 x / 3 ) {\displaystyle 1.7159\tanh(2x/3)} の場合は −1〜1 で、tanh(x) の場合は − 0.5 cosh − 1 ⁡ ( 2 ) {\displaystyle -0.5\cosh ^{-1}(2)} 〜 0.5 cosh − 1 ⁡ ( 2 ) {\displaystyle 0.5\cosh ^{-1}(2)} = −0.65848 〜 0.65848 である。 初期値: 各層で平均0分散1、かつ連続一様分布 入力ベース: U ( − 3 / fan in , 3 / fan in ) {\displaystyle U(-{\sqrt {3/{{\text{fan}}_{\text{in}}}}},{\sqrt {3/{{\text{fan}}_{\text{in}}}}})} by ヤン・ルカン 入出力ベース: U ( − 6 / fan in + fan out , 6 / fan in + fan out ) {\displaystyle U(-{\sqrt {6/{{\text{fan}}_{\text{in}}+{\text{fan}}_{\text{out}}}}},{\sqrt {6/{{\text{fan}}_{\text{in}}+{\text{fan}}_{\text{out}}}}})} by Xavier Glorot 勾配法: 様々なパラメータ更新法が提案され利用されている（確率的勾配降下法#変種を参考）。 活性化関数 原点を通過すなわち f ( 0 ) = 0 {\displaystyle f(0)=0} 例: tanh ⁡ ( x ) {\displaystyle \tanh(x)} 、 x 1 + | x | {\displaystyle {\frac {x}{1+|x|}}} 、逆に標準シグモイド関数は f(0) = 0.5 のため不適切 入出力範囲 f ( ± 1 ) = ± 1 {\displaystyle f(\pm 1)=\pm 1} 例: 1.7159 tanh ⁡ ( 2 x / 3 ) {\displaystyle 1.7159\tanh(2x/3)} ReLU（ランプ関数、アナログ閾素子（英: analog threshold element））: 経験的に良い性能 行列の掛け算はGPGPUが得意としており、高速に計算できる。PythonではTheanoなどのライブラリおよびそれを間接的に使用してる機械学習のライブラリなどがある。 CPUのメニーコアやSIMDを有効活用する簡単な方法は行列演算ライブラリを使用する方法である。行列演算ライブラリとしては、例えばインテルのCPU向けではIntel Math Kernel Libraryなどがある。 バックプロパゲーションは完了までに非常に時間のかかる反復処理である。マルチコアのコンピュータでマルチスレッド技法を使えば、収斂までにかかる時間を大幅に短縮することができる。バッチ学習を行う場合、マルチスレッドでバックプロパゲーションのアルゴリズムを実行するのが比較的簡単である。 訓練データをそれぞれのスレッド毎に同程度の大きさに分割して割り当てる。それぞれのスレッドで順方向と逆方向のプロパゲーションを行う。重みとしきい値のデルタをスレッド毎に合計していく。反復の周回毎に全スレッドを一時停止させて、重みとしきい値のデルタを合計し、ニューラルネットワークに適用する。これを反復毎に繰り返す。このようなバックプロパゲーションのマルチスレッド技法がEncog Neural Network Frameworkで使われている。 バックプロパゲーションに相当（連鎖律+勾配法）するニューラルネットワーク学習手法は何度も再発見されてきた。 1960年, B. Widrow & M.E. Hoff, Jr. : Widrow-Hoff法（デルタルール）、隠れ層のない2層のニューラルネットワークでの出力誤差からの確率的勾配降下法 1967年, 甘利俊一: 隠れ層のある3層のニューラルネットワーク 1969年, アーサー・E・ブライソン（英語版）& 何毓琦（英語版）: 多段動的システム最適化手法として提案 1974年, ポール・ワーボス（英語版）: ニューラルネットワークにおける応用を示唆 1986年, デビッド・ラメルハート、ジェフリー・ヒントン、ロナルド・J・ウィリアムス（英語版）: backwards propagation of errors（後方への誤差伝播）の略からバックプロパゲーションの名で再発明、以後定着 21世紀におけるディープラーニング（4層以上）ではバックプロパゲーションが学習法として多く用いられる。 損失超平面が極小値 (英: local minima) を持ちうるため、勾配降下で広域最適解 (英: global minima) に収束する保証がない (Remelhart, 1986) 一カ所でも勾配消失を起こすとそれより下層は学習が進まなくなるため、層数が増えるほど勾配消失を起こす確率が増大していく 勾配が0に近い部分が存在する活性化関数を使っていると勾配消失を起こしやすい 学習が必ず収束するとは限らない[要出典] 各次元の分散に差がありすぎると分散の小さいところに重みが集中しやすい[要出典] ^ 逆誤差伝搬法（ぎゃくごさでんぱんほう）と呼ばれることもあるが，電波伝播に対する電波伝搬と同じく誤読に起因する誤字である。 ^ "We describe a new learning procedure, back-propagation, for networks of neurone-like units." p.533 of Rumelhart (1986) ^ Paul J. Werbos (1994). The Roots of Backpropagation. From Ordered Derivatives to Neural Networks and Political Forecasting. New York, NY: John Wiley & Sons, Inc. ^ Yann LeCun; Leon Bottou; Genevieve B. Orr; Klaus-Robert Muller (1998). Efficient BackProp. http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf.  ^ a b Xavier Glorot; Yoshua Bengio (2010). Understanding the difficulty of training deep feedforward neural networks. http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf.  ^ Multilayer Perceptron — DeepLearning 0.1 documentation ^ ヤン・ルカンらによる ^ 福島邦彦『神経回路と情報処理』朝倉書店、1989年。ISBN 978-4254120639。  ^ 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. http://jmlr.csail.mit.edu/proceedings/papers/v15/glorot11a/glorot11a.pdf.  ^ Yann LeCun; Yoshua Bengio; Geoffrey Hinton (2015-05-28). “Deep learning”. Nature 521 (7553): 436-444. doi:10.1038/nature14539.  ^ J. Heaton http://www.heatonresearch.com/encog/mprop/compare.html Applying Multithreading to Resilient Propagation and Backpropagation ^ Benerard Widrow; M.E. Hoff, Jr. (August 1960). “Adaptive Switching Circuits”. IRE WESCON Convention Record 4: 96-104. http://www-isl.stanford.edu/people/widrow/papers/c1960adaptiveswitching.pdf.  ^ Benerard Widrow; Michael A. Lehr (1995). Perceptorons, Adalines, and Backpropagation. http://isl-www.stanford.edu/~widrow/papers/bc1995perceptronsadalines.pdf.  ^ 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 37Baby: 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)."  ^ 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.  ^ "The most obvious drawback of the learning procedure is that the error-surface may contain local minima so that gradient descent is not guaranteed to find a global minimum." p.536 of Rumelhart, et al. (1986). Learning representations by back-propagating errors. Nature. ディープラーニング ニューラルネットワーク入門（岩田彰） 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