This repository contains my own solutions to the programming assignments during Coursera Deep Learning Specialization Course.
This is the solution to the latest problem as of summer 2020.
Week 2 - Python basics with numpy (Optional)
sigmoid関数やsoftmax関数、画像のベクトル化などを例に挙げながら、numpyの基礎を学びます。
ロジスティック回帰モデルを構築して、猫の画像判定を行います。
一つの隠れ層を持つニューラルネットのモデルを構築して、2クラス分類を行います。
多層のニューラルネットのモデル構築をします。
Week 4 - Deep Neural Network Application
作った多層ニューラルネットを用いて、再び猫の画像判定を行い、判定精度の向上を観察します。
Week 1 - Initialization
パラメータ(W,b)の初期化の方法によって学習の進み方が異なることを観察します。パラメータの初期値がどれほどNNの学習速度に影響するのかを学びます。
複数のノードが同じ出力をしている(各層におけるノードの出力の分布(アクティベーション分布)が偏る)状態となる。→ わざわざ多くのノードを用いる必要がない → 隠れ層のユニット数が全て1のNNと同値となり、学習が進まない。
最後の層のsigmoidでの勾配が限りなく0に近くなり(勾配消失)、学習スピードが格段に遅くなってしまう。
活性化関数にReLUを用いるときに適したパラメータの初期化手法。パラメータの初期化において、ノード数nに対して、平均0、標準偏差√(2/n)である正規分布から設定する。
そうすると、アクティベーション分布に偏りが生じにくくなり、学習がよく進む。
活性化関数をsigmoidやtanhを使う場合は、Xavierの初期化を行う。
Week 1 - Regularization
L2正規化とDropoutの2手法によってどれほど、過学習が軽減されるかを観察します。
1.学習データを増やす
2.ネットワークの容量を減らす
3.重みに対する正則化(L1, L2..)
4.Dropout
5.データ拡張(画像を反転したり..)
正規化項(各層ごとの行列Wの要素の二乗の和の総和)をコスト関数に付け加える。正規化項のλの値を大きくすれば、各層のパラメータWの値が小さくなる。
つまり、NNが単純化されロジスティック回帰に近づくことで、適度な線形表現が得られ、過学習(overfitting, high-variance)を回避できる。一方で、λの値を大きくしすぎると、過度に線形的になり、返って学習不足(underfitting, high-bias)な状態になりうる。
正則化項を加えたコスト関数から、dWを求めてWの更新の式を立てると、Wが任意の値で、Wが小さくなるように更新されることがわかる。これがL2正規化が重み減衰と呼ばれる所以である。
学習の繰り返しのたび、決めた確率で、ある層の内のいくつかのノードを使わないようにして、学習を行っていく。
つまりは、毎iterationで、異なる小さなNNモデルで学習をしていることになる。複数の学習器を使わず、一つの学習器だけでアンサンブル学習が行えていることになる。 これが汎化性能向上につながる。
ノードの出力のスケールを合わせるために、訓練時にkeep_probで割る。(Inverted Dropout)
これは、Dropoutによって無効にしたノード分だけ、出力が小さくスケールされてしまうから。
Week 1 - Gradient Checking
自分が作ったbackpropが正しく動作しているか確認する方法を学びます。
backpropがうまく動作しているかを知るために、各パラメータにおけるコスト関数の偏微分が正しい値かを知る必要がある。
この偏微分をbackpropではなく、実際に近似的に計算して、値が極めて近ければ、自分が作ったbackpropがうまく動作していることになる。
コンピュータでは、微分は行うことができない(コンピュータが扱える数は有限で、連続変数を取り扱うことが不可能である一方で、微分は連続変数のときにのみ意味のある操作である)ため数値微分という近似的な微分を行う。ここでは、中心差分による数値微分を行う。
Week 2 - Optimization
Mini Batch Gradient Descent(ミニバッチ勾配降下法)でのバッチの分け方、またBatch Gradient Descent(通常の勾配降下法)とMomentum、Adamを利用して 最適化した場合のコスト関数の収束のスピードの違いを実際にそれぞれを実装することで学びます。
パラメータ更新のために使うデータをデータ全体(X, Y)ではなく、データ1つ(X(i), Y(i))にする。(バッチサイズが1)
こうすることで、コスト関数の値が局所最適解(鞍点)から抜け出せなくなることを防ぐ。
バッチサイズを、1とデータ全体の間のサイズ(16, 32, 64, 128,...が推奨)にして、パラメータ更新を行っていく。
一方で、更新の振動の幅が大きく、コスト関数の値の収束に時間がかかってしまう可能性がある。したがって、以降3つの最適化手法がある。
通常の勾配降下法の更新式の、勾配(dJ/dWやdJ/db)の部分を工夫した手法。
指数移動平均を勾配に用いることで、過去の勾配の値を考慮、つまり、勾配の変化に慣性(Moment)が働いたような状態となり、更新の振動を小さくする。
通常の勾配降下法の更新式の、学習率の部分を工夫した手法。
Momentumに同じく、指数移動平均を用いて、これまでの勾配を考慮して、勾配が大きいときに学習率が小さくなるようにしたもの。そうすれば、更新の振動が小さくなる。
MomentumとRMSpropをあわせた手法。通常の勾配降下法の更新式の、勾配と学習率をともに工夫している。
最適化手法において指数移動平均を用いるとき、初めの方は考慮する過去データがなく、勾配の値がどうしても小さくなってしまう。
それを補正するために、パラメータ更新のたびに指数的に大きくなっていくような式で、MomentumやAdamでの勾配の値を割る。
Week 3 - Tensorflow
TensorFlowの基本的な使い方について学びます。
There is no programming assignments. Only quizzes.