【Coursera機械学習】week5の課題のまとめと勉強したことのメモ

スポンサーリンク
coursera
スポンサーリンク

第5週目の講義は、主にニューラルネットワークのバックプロパゲーションに関する内容でした。4週目に引き続き、手書き文字認識を実装します。

スポンサーリンク

今回の課題の流れ

目的

下の図のような0から9までの手書き文字認識を実装します。

学習データは5000で、それぞれの画像データは20×20=400次元のデータに変換されています。

Octaveでは0に対応するインデックスが存在しないため、0の画像は10としてラベル付けされています。

ニューラルネットワークの構造

モデルの構造は以下のような入力層、隠れ層、出力層の3層構造を考えます。400次元の入力データにバイアス項を加えた401次元の入力を学習し、10クラスに分類します。

課題1:sigmoidGradient

まず、シグモイド関数の勾配(Sigmoid gradient)を求める関数を書きます。この関数は、バックプロパゲーションを実装する際に使います。

シグモイド関数は以下の式で定義されます。

\[ sigmoid(z) = g(z) = \frac{1}{1+e^{-z}} \]

Sigmoid gradientは以下の式で計算することができます。

\[ g'(z) = \frac{d}{dz}g(z) = g(z)(1 – g(z)) \]

この式をOctaveで書くと以下のようになります。

課題2:randInitializeWeights

ニューラルネットワークの対称性を崩すために、パラメータの初期値をランダムな値に初期化しておく必要があります。この課題のソースコードはex4のPDFに記載してあります。

課題3:nnCostFunction

課題3のコードはこちらです。

以下は、コスト関数とバックプロパゲーションの実装の解説です。

各ノードの値の計算

まず、各ノードの値を計算します。

  • a1 = 5000 × 401
  • z2 = 5000 × 25
  • a2 = 5000 × 25 → 5000 × 26(バイアス項を追加)
  • z3 = 5000 × 10
  • a3 = 5000 × 10

ラベルをone-hotに変換

それぞれのラベルに対応したコストを求めるため、ラベル(y)をone-hotの形に変換します。one-hotへの変換方法の詳細はこちらにまとめています。

コスト関数の実装

ニューラルネットワークのコスト関数は以下の通りです。

\( J(\theta) = \frac{1}{m}\sum_{i=1}^m\sum_{k=1}^K[-y_k^{(i)}log((h_\theta(x^{(i)}))_k) – (1-y^{(i)}_k)log(1-(h_\theta(x^{(i)}))_k)] \)

for文を学習データの枚数分回して、すべて足し合わせます。

正則化項の計算

正則化項は以下の式で計算できます。

\( regularization = \frac{\lambda}{2m}[\sum_{j=1}^{25}\sum_{k=1}^{400}(\theta^{(1)}_{j,k})^2-\sum_{j=1}^{10}\sum_{k=1}^{25}(\theta^{(2)}_{j,k})^2]\)
  • Theta1 = 25 × 401
  • Theta2 = 10 × 26

正則化の際には、θ1とθ2ともにの最初のノードを計算に含めないので、1列目を0に変換します。

そして、正則化項をコスト関数に足します。

バックプロパゲーション

  1. 出力層のエラーを求める(delta3)
  2. 隠れ層のエラーを求める(delta2)
  3. 各層の勾配を求める(Delta1, Delta2)
  4. コスト関数の勾配を求める
タイトルとURLをコピーしました