~Backpropagation Algorithm~ バックプロパゲーション アルゴリズムってな~に?【保存版】

こんにちは^^EMです。

 

今日は機械学習の肝である、ニューラルネットワークの

興味ぶか~い内容をまとめました。

 

その名もバックプロパゲーション!!じゃーーん!!

 

はい、ここから本題です。

バックプロパゲーションアルゴリズム

 

ニューラルネットワークの最も基本的な要素です。

1960年代に初めて導入されて、ほぼ30年後(1989年)に

RumelhartさんとHintonさんとWilliamsさんが

Learning representations by back-propagating errors.

という書物でさらにバックプロパゲーションを盛り上げたようです。

 

このアルゴリズムはchain rule(難しい言葉でいうと’連鎖律’)

という方法で、ニューラルネットワークを超効果的に

トレーニングするために使用されます。

 

とっても簡単に言うと、Aさんが入り口から

色んな道を順番に通過して出口に着いた後

バックプロパゲーションという魔法の絨毯に乗って

入口まで戻ってくれるんです。

 

そして魔法の絨毯の何がすごいかというと、入口に戻る時に

weightsとbiasesというものを勝手に調節してくれて

次にAさんが同じ道に来た時に通りやすくしてくれんです!

そうする事でAさんが出口まで辿り着いたとき

より良い結果に繋がるんですよね。

 

この記事では簡単な例として、4レイヤーの

ニューネラルネットワークのトレーニングと最適化を

数学を交えながらそのプロセスを説明していきたいと思います。

ぜひバックプロパゲーションがどうやって動いているのか

理解しながら、このすごさを感じて下さい!

 

 

4レイヤーのニューラルネットワークは、

入口(入力層)の4つのピンクのニューロン

真ん中(隠れ層)の緑の4つのニューロン

出口(出力層)の青い1つのニューロンで表されています。

※ニューロンとは下記の図でいうと丸の事を指しています。

 

Image for post
Simple 4-layer neural network illustration

入力層(input layer)

ピンクのニューロンは、入力データを表します。

入力データは単純な数字の場合もあれば

ベクトルや多次元行列のように複雑な場合もあります。

 

Image for post
ピンクのレイヤーの方程式
activation(a)の初めは入力する値と同じです。
※activationとは、活性化関数を使った後のニューロンの値です。
 下記でもう少し説明します。

隠れ層(hidden layer)

緑色の隠れ層といわれる値はZ ^ Lを使って計算されています。

Z ^ Lというのはlayer lにweightsを加えられた値

a^lは活性化関数ですね。

そしてlayer 2 やlayer 3の計算式は次のとおりです。

  • l = 2
Image for post
z² と a²の方程式
  • l = 3
Image for post
z³ と a³の方程式

はレイヤー2と3のweightsで、

b²とb³はこれらのレイヤーのbiasです。

 

Activationsのa²やは、活性化関数 を使って計算されます。

大抵の場合は、この関数fは非線形

シグモイドReLUtanhなどS字のような直線ではない形)です。

この関数を使用する事によってネットワークが

データの複雑なパターンを学習できるようにします。

活性化関数がどのように機能するか詳しく気になる方は、

 

 

 

ところで、上の4レイヤーの図をよ~く見ると x、z²、a²、z³、a³、W¹、W²、b¹、b²全て

色んな数式が文字にくっついたりするのではなく、全部シンプルに表されてますよね。

これはレイヤーごとにグループ分けされた行列(※5)内の

全パラメーター(※6)値を組み合わせられた為です。

これはニューラルネットワークを使う一般的な方法です。

理解を深めるために、ぜひこの方程式や計算にも慣れていきましょう!

 

ではでは一例として、レイヤー2とそのパラメーターをみてみましょう。

一度理解すると、同じ考え方で他のレイヤーにも応用する事ができます。

 

・W¹はshape(n,m)の重み行列です。

ここでnは出力ニューロン(次のレイヤーのニューロン)の数、

mは入力ニューロン(前のレイヤーのニューロン)の数です。

今回の場合、n = 2、m = 4となります。

Image for post
W¹の方程式

注:

weightの添え字の最初の数値は次のレイヤーのニューロンの

インデックスと一致しています。

(この場合、Hidden_2layerです)

また2番目の数値は、前のレイヤーのニューロンのインデックスと

一致します。(この場合、Input layerです)

 

  • xはshape(m、1)の入力ベクトルです。ここでのmは入力ニューロンの数となります。今回の場合、m = 4です。
Image for post
xの方程式
  • b¹はshape(n、1)のbias ベクトルです。ここでは、nは現在のレイヤーのニューロンの数です。 今回の場合、n = 2です。
Image for post
b¹の方程式

z²の式に従って、上のW¹、x、b¹の定義を使って、’z²の式’を導き出すことができます。

Image for post
 z²の方程式

それでは上記をふまえてニューネラルネットワークをみてみましょう。

Image for post
Input layerとHidden_1 layer

z²は(z_1)²と(z_2)²を使って表すことができます。

(z_1)²と(z_2)²は、入力層であるx_iと

weight(W_ij)¹をかけ合わした合計になります。

これによって同じ「z²の方程式」が分かり、z²、a²、z³、a³の

行列表現が正しいという事が証明されます。

 

出力層

ニューラルネットワークの最後は、述語値をつくる出力層です。(述語とは値によって真か偽かがきまる、ひらたくいうと答えの事です。)

今回の1番初めの例でいうと

単体の青色のニューロンが下の式を表しています。

Image for post
出力層の式 S

ここでも、方程式を簡単にするために行列表現を使っています。

上記の方法で、基礎となるロジックを少しでも理解してもらえれば

うれしいです。

 

フォワードプロパゲーションと評価

上の方程式は、ネットワークのフォワードプロパゲーションをつくります。 ざっくりとした概要は次のとおりです。

Image for post
Overview of forward propagation equations colored by layer

フォワードパスの最後のステップとして、期待されていた出力層の値yに対して、述語の出力層sを評価することです。

sとyの評価は損失関数によってみる事が出来ます。

これはMSE(平均二乗誤差)くらいシンプルで、交差エントロピーよりも複雑です。

 

この損失関数は’C ’と表され、次のような式を書く事ができます。

Image for post
損失関数Cの方程式

costは、MSE、クロスエントロピー、その他のどんなコスト関数とも
イコールになることがあります。

Cの値から、そのモデル自体が理想の出力層yに近付くために
どれだけパラメータを調整すればいいのか判断してくれます。
これがバックプロパゲーションアルゴリズムです。

 

バックプロパゲーションと勾配の計算

 

1989年の記事によると、バックプロパゲーションとは

repeatedly adjusts the weights of the connections in the network so as to minimize a measure of the difference between the actual output vector of the net and the desired output vector.

(日本語訳)

ネットの実際の出力ベクトルと理想の出力ベクトルとの差の測定値を最小化する為に、ネットワーク内の接続の重みを繰り返し調整します。

the ability to create useful new features distinguishes back-propagation from earlier, simpler methods…

(日本語訳)

有用な新機能を作成する機能は、バックプロパゲーションを以前のより単純な方法と区別します…

 

分かりやすくいうと、バックプロパゲーションは
ネットワークのweightとbiasを調整することにより
コスト関数を最小化することを目的としています。

どの程度調整されるかは、パラメーターに関する
コスト関数の勾配によって決まります。

 

 

ここで疑問なのが…

 

なんで勾配の計算をするのか?

 

その答えを見つける為に、微積分をもう一度確認しましょう。

 

  • 点xの関数C(x_1、x_2、…、x_m)の勾配は
    xの中にあるCの偏導関数のベクトルです。
  • Gradient of a function C(x_1, x_2, …, x_m) in point x is a vector of the partial derivatives of C in x.
Image for post

 

この勾配の計算は、連鎖律(chain ruleというテクニックを使って行われます。

この単一のweight (w_jk)^lであれば、勾配はこのようになります。

Image for post
単一weight(w_jk)^lのCの導関数の方程式

似たような方程式は (b_j)^lにも当てはめる事ができます。

Image for post
単一bias(b_j)^lのCの導関数の方程式s 

どちらの方程式も「局所勾配」と呼ばれることが多く
よく次のように表されます。

Image for post

 


             局所勾配の方程式

「局所勾配」は、連鎖律を使用して簡単に決められます。
今回はくわしく取り上げませんが、気になる方がいれば
コメントを頂けると嬉しいです。

この勾配はモデルのパラメータを最適にしてくれます。

Image for post
weightとbiasを最適化させるアルゴリズム(最急降下法とも呼ばれます)
  • WとBの初期値はランダムに設定されます。
  • イプシロン(e)は学習率です。勾配の影響を決めます。
  • w と bはweightとbiasの行列表現です。wまたはbのCの導関数は、各々のweightやbiasのCの偏導関数をつかって計算できます。
  • コスト関数が最小化されると、終了条件が満たされます。

最後になりますが、単一のweight(w_22)²に対するCの勾配を
計算するシンプルな例をあげたいと思います。

 

上記のニューラルネットワークの下の部分をみてみましょう。

Image for post

ニューネラルネットワーク内でのバックプロパゲーションの視覚的表現

Weight (w_22)²  (a_2)² (z_2)²に繋がって 
(z_2)³ と(a_2)³を通って勾配の計算をするには
連鎖律に当てはめる必要があります。

Image for post

 (w_22)²の導関数の方程式

(a_2)³でCの導関数の最終値を計算するには
関数Cを理解する必要がありますが
Cは(a_2)³に依存しているため、導関数の計算はかなり単純です。

上記の説明が、勾配の計算の理解につながれば幸いです。
より詳しい解説は、リチャード・ソーチャー氏が
バックプロパゲーションについて4つのすばらしい説明をしているので
スタンフォード大学のNLPシリーズをぜひ見てみて下さい。

 

 


この記事では、勾配の計算や連鎖律などの数学的手法を使用して
内部でバックプロパゲーションがどのように機能するかについて
詳しく説明しました。
このアルゴリズムの要点を理解することで
ニューラルネットワークの知識が強化され
このアルゴリズムが使いやすくなれば幸いです。
めちゃくちゃ奥が深いモデルですが

引き続きディープラーニングを理解していきましょう!

 

 

ちなみに皆様に2点、朗報です!

 

未経験からでも大丈夫!

スキルアップしながら、学校にいくお金を節約+お給料をもらえる仕事を紹介してくれる
夢のようなサイトがあります。

それが「IT求人ナビ」です!

 

↓↓

今後、エンジニアやWEBデザイナー等でキャリアを築こうとしている方


IT求人ナビの就職のプロが相談にのってくれるので
企業の実態の話を聞けたり、ブラック企業を避ける事ができるという点でも
今後の参考になると思います!

 

 

 

 

 

今後もディープラーニングをはじめ、様々な事を解説していこうと思いますが
もし、もっと効率よく、実践のビジネスの場に繋げられる様に勉強したい!という方に
おススメの講座を見つけたので、気になる方はぜひ無料説明会を通じてみてみてください!!

 

↓↓



データミックスでは、様々なケーススタディ等を通じて、未経験からでも
6か月でデータサイエンティストを目指せるコースや、基礎固めのコースなど
データ分析の内容を中心に、様々なプログラムを開講しています!

もしサクッと情報を収集したいという方は、このコースについて
メリットデメリットをまとめた記事もあるので、そちらも参考にしてみてください。

 

machinelearningforbeginner.hatenablog.com

 

最後まで読んで頂きありがとうございました^^