Neural Networks Basics
CouseraのDeep Learningのコースのお勉強メモpart2
Binary Classification
ニューラルネットワークの説明の前に,先ずは簡単な導入としてLogistic回帰を説明する.
ロジスティック回帰とは,Yes/Noを予測するアルゴリズム. 例えば写真に猫が写っているという問いに対するYes/Noを予測する.
ロジスティック回帰のinputとしては,画像をそのまま使うのではなく,画像のRGBの各ピクセルを1列に並べ替えたベクトルを用いる(図1).
このベクトルの要素数をnxと呼ぶ.
他にも,数学的な記法として図2のようなものがある.今後はこれを使って行く.
Logistic Regression
このアルゴリズムでは,inputを受け取って,inputが問いに対してYesとなる確率(0~1の範囲)を計算する. その際のパラメータとしてwとbの2つがある.なお,wはベクトルで,bは実数.
計算方法は図3の通りで,ベクトル同士の内積にbを加えてシグモイド関数をかけたら完成.
シグモイド関数は図に示す通り,0~1の値をとる関数.
y^が正しい値になるように,パラメータのwとbを学習し,そのパラメータを用いて,Yesとなる確率を計算する.
Logistic Regression Cost Function
ロジスティック回帰では,できるだけy予測値とy(実測値)を近づけたい.
予測値と実測値の近さを評価する関数を損失関数とよび,図4のように表現する. ややこしい数式っぽく見えるが,これはこのあと出てくる最急勾配方をうまく動かすために必要な工夫なので,詳細は割愛.
全ての教師データ(トレーニングセット)に対して平均的により良いパラメータを求めたいので,全てのトレーニングセットについてどれだけ正しく予測できたかという指標として,Cost関数を図4のように定義した.
これを小さくするためのwとbを探すことが,学習である.
Gradient Descent
最急勾配法についての説明.
Logistic Regression Cost Functionにて,なんだかややこしい損失関数を定義していたが,そのお陰でCost関数が下に凸な形状になる(図5).
このCost関数を一番小さくするwが求めたい.図中のw_{min}がそれ. これを行うための簡単な方法として最急勾配法がある.
アルゴリズムは以下の通り.
- 適当な値にwを初期化する
- J(w)の値が小さくなる方向にwを少しだけ更新する
- 収束するまで繰り返す
ここで更新する式は図6の通り.
なぜこれを繰り返すことでw_{min}に近づくかを以下で説明する.
まず,図7のようにw0としてwが初期化される.
更新式にある微分を計算すると,w0の地点でのJ(w)の傾きがわかる.
w0+であれば微分結果は正の値になるし,w0-であれば負の値になる. これに学習率を掛け合わせて1stepの歩幅が決まり,更新式の通りに更新される.
w0+の場合は微分結果が正であり,aもまた正なので,wは小さくなる方向に更新される. これを繰り返すとw_{min}に近づく.
逆にw0-の場合は微分結果が負になり,aは正なので,wは大きくなる方向に更新される. これを繰り返すことでw_{min}に近く.
最急勾配法はこんな感じでCost関数を最小化するwを見つけることができる.
Derivatives
微分の簡単な説明なので割愛
More Derivatives Excamples
微分の簡単な説明なので割愛
Computaion Graph
順伝播と逆伝播の説明に欠かせない,計算グラフについて説明する. 先ずは簡単な例としてJ(a,b,c)= 3 * (a + b * c)を計算グラフで表すと図8のようになる.
a,b,cそれぞれに値を入れて,順順に値を伝播させ,Jを求める作業を順伝播と呼ぶ.
Derivation with a Computation Graph
計算グラフを用いて簡単に微分を求めることができる.その方法を逆伝播と呼ぶ.
順伝播とは逆に,最終結果から1つずつ微分を求めて行くと図9のように,a,b,cそれぞれによる微分を簡単に求めることができる.
この知見を最急勾配法で必要な微分計算に用いる.
Logstic Regression Gradient Desent
計算すると,図10のようになる.
Gradient Desent on m Example
上記はあくまで1サンプルに対して成り立つ方法だった. これをm個のトレーニングセットについて適用すると図11のようになる.
Python and Vectorization
実際にコーディングする際には,最適化と並列実行をサポートするために,明示的なFor文を極力書かずに実装する必要がある.このテクニックをベクトル化とよぶ.
これによって実行速度がかなり変わってくる.簡単な例であっても300倍ほどの違いにもつながるので,とても大事なテクニック.
ベクトル化することで図11のFor文があってわかりにくかった記載が図12までシンプルに記載でき,実行速度の面でもかなり有利になる.