ウシジの深層・強化学習の学習

深層学習、強化学習に関して、学んだことや論文、ニュース等を紹介していきます。よろしくお願いします。

Coursera Machine Learning: Week5 Neural Networks Learning

移転しました。

f:id:ushiji:20191121133558j:plain

CourseraのMachine Learningについてまとめています。 前回は、Week4 Neural Networks Representationについてまとめました。

Week5では、Week4で学んだNeural Networksをどう学習させるかについて学んでいきます。AIを勉強しているとよく聞く、Backpropagation(バックプロバゲーション)についても出てきます。

 

 

Week5

Neural Networks: Learning

Cost Function

Neural NetworkでのMulti-class classificationについて学んでいきます。Week4で触れたように、Multi-class classificationでは、分類するクラスの数だけのOutput unitを持ちます。下記図のように、Kクラスの分類では、K個のOutput unitを持ちます。

f:id:ushiji:20191202162755p:plain

Neural Network (Classification)

 

この場合のコスト関数は、Logistic regressionの場合と同様に、下記のようになります。 

f:id:ushiji:20191202163300p:plain

Cost function_Logistic regression

f:id:ushiji:20191202163335p:plain

Cost function_Neural network

 

Backpropagation

コスト関数を最小化するため、これまでと同様に、Gradient(コスト関数JのΘでの偏微分)を計算する必要があります。この計算に、Backpropagationを用います。

Backpropagationに入る前に、まずは、Forward propagationの振り返りからです。Week4では、下記のようにForward propagationを計算しました。この計算をBackpropagationでも用います。

f:id:ushiji:20191202173604p:plain

Forward propagation

 

まず、各レイヤのエラーδを考えると、下記のように計算できます。ここで、".*"は、Octave/MATLABで用いている、要素ごとの掛け算です。(行列の掛け算ではない)

f:id:ushiji:20191203104419p:plain

Gradient computation

補足として、gの微分は、下記のように計算できます。

f:id:ushiji:20191203104601p:plain

Derivative of g

このエラーδにActivationのaを掛けたものが、コスト関数JのΘでの偏微分として扱うことができるので、Backpropagationのアルゴリズムとしては、下記のようになります。Forward propagationとは逆に、Output layerの誤差から、誤差を逆伝播させて各層の誤差を計算していくので、Backpropagationと呼ばれています。

なんか複雑ですね。感覚的には分かるような分からないような。。 

f:id:ushiji:20191202174348p:plain

Backpropagation algorithm

 

Gradient checking 

上記で記載したBackpropagationですが、実装する上でミスすることもあるようで、そのミスをチェックするためのGradient checkingについて学びます。

微分は、傾きを求めるものであり、傾きは、十分に小さな幅での変位から近似的に求めることができるので、下記の数式でも近似的に計算することができます。

f:id:ushiji:20191203111647p:plain

Gradient checking

具体的には、各θについて、下記のように近似的な傾きを計算し、Backpropagationで計算している微分の値とおおよそ一致するか否かをチェックすることで、バグがないかどうかを確認することができます。この近似的な計算は、Backpropagationでの計算と比較し、計算リソースを食い、時間が掛かってしまうので、あくまでもデバッグ用で、実際のAIトレーニングを行う際は、オフにするのが良いとのことです。

f:id:ushiji:20191203111858p:plain

Gradient checking calculation

Random initialization

Backpropagationの計算を始めるにあたり、Θの値を初期化する必要があります。Θの値を0で初期化してしまうと、各層のActivationが同じ値を取ってしまい、うまく行かないため、-ε 〜 ε の間のランダムな数値で初期化するのが良いとのことです。(ここでのεは、上記のGradient checkingのεとは別)

 

Putting it together 開発の流れ

最後に、ここまで学んできたことをベースに、どのように開発を進めるのか、その流れを学びます。

  1. Neural Networkのネットワークアーキテクチャの選択(Hidden layerが何層あり、そのUnit数はいくつか)
    ・Input layerは、Featureの次元数
    ・Output layerは、分類するクラスの数
    ・Hidden layerは、1層以上とし、そのUnit数は、各Hidden layerで共通にするのがおすすめとのこと
  2. Weight Θをランダムに初期化
  3. Forward propagationを実装
  4. コスト関数Jの計算を実装
  5. Backpropagationを実装
  6. Forward propagationとBackpropagationをトレーニングデータを用いて実行
  7. Gradient checkingを行い、Backpropagationが正しく計算されているか確認
  8. Gradient descentか他の最適化手法とBackpropagationを用いて、コスト関数Jを最小化するΘを探索

 

また、講義の最後に、Neural Networkを利用している例として、自動運転での適用例が紹介されます。興味のある方は、見てみてください。

www.coursera.org

 

プログラミング演習

Week5のプログラミング演習では、Neural Network向けにBackpropagationを実装し、手書きの数字認識を行います。演習の項目は、具体的には以下のものです。

  • Feedforward and Cost Function
  • Regularized Cost Function
  • Sigmoid Gradient
  • Neural Net Gradient Function (Backpropagation)
  • Regularized Gradient

 

 

次回は、Week6の前半、Advice for Applying Machine Learningについてで、機械学習デバッグ方法等についてまとめます。

ushiji.hatenablog.com

 

 

コース全体の目次とそのまとめ記事へのリンクは、下記の記事にまとめていますので、参照ください。

ushiji.hatenablog.com