Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

ADALINE

ADALINEはパーセプトロンの改良版です。

ここで覚えておきたいことはコスト関数という概念です。

パーセプトロンでは活性化関数としてヘビサイド関数という変な関数で出力を1か-1の2値に無理やりしていましたが、ADALINEでは適当な係数をかけることで連続値として出力してやります。

ADALINEの最終出力は、活性化関数から出力される連続値に対して、ここでヘビサイド関数を作用させることで1か-1の2値にして出力してやります。

最終出力を決定するヘビサイド関数ですが、連続値を無理やり量子化する(1か-1の2値にする)ということでクォンタライザーと呼ばれています。

コスト関数{J}を以下の式で求めてやります。

トレーニングサンプルと重みのかけ合わせ

{ \displaystyle
z^{(i)} = \sum_{j=0}^{n} w_j x_j^{(i)}    \tag{1}
}

活性化関数

{ \displaystyle
\phi (z^{(i)}) = \alpha z^{(i)}    \tag{2}
}

コスト関数

{ \displaystyle
J(\mathbf{w}) = \sum_{i=1}^{m} \frac{1}{2} ( y^{(i)}  - \phi (z^{(i)}) )^{2}    \tag{3}
}

各トレーニングサンプルで{z^{(i)}}を求めた後、活性化関数内で定数{\alpha}をかけ、全ての{\phi (z^{(i)})}に関して教師データ{y^{(i)}}との差を取った後、2乗して足しあわせています。

全てのトレーニングサンプルを使ってコスト関数を求めている為、重みは1エポック毎に更新されます。

重みの更新はコスト関数が小さくなるように更新してやります。

{ \displaystyle
\mathbf{w} := \mathbf{w} - \eta \nabla J(\mathbf{w})    \tag{4}
}

ここで{\nabla} (ナブラと読みます)という記号が出てきましたが、ベクトル関数の勾配を求める記号です。重み{\mathbf{w}}をベクトルとしてみています。

{\displaystyle
\nabla J(\mathbf{w}) =
\left[
\begin{array}{cl}
\frac{\partial J(\mathbf{w})}{\partial w_0} \\
\frac{\partial J(\mathbf{w})}{\partial w_1} \\
\vdots \\
\frac{\partial J(\mathbf{w})}{\partial w_m}
\end{array}
\right]     \tag{5}
}

{\nabla J(\mathbf{w})} はコスト関数{J(\mathbf{w})} が大きくなる方向を向く重み空間上のベクトルになります。

つまり、{\nabla J(\mathbf{w})} と反対方向に向かって、少しずつ(学習率{\eta}で調整します){\mathbf{w}}を動かしてやると、コスト関数{J(\mathbf{w})} が少しずつ小さくなっていきます。

このようにして、コスト関数{J(\mathbf{w})} が一番小さくなる重み{\mathbf{w}}を求めてやります。

一般的に、勾配の反対方向に向かって少しずつ変数(今の場合は重み)を動かし、ある関数(今の場合はコスト関数)の最小値を求めることを勾配降下法といいます。

コスト関数の勾配{\nabla J(\mathbf{w})}を具体的に求めてみましょう。

コスト関数をj番目の重みで偏微分してみます。合成関数の微分法則を使ってやるとすぐ求まります。

{\displaystyle
\frac{\partial J(\mathbf{w})}{\partial w_j} = \sum_{i=1}^{n} \frac{\partial \left\{ \frac{1}{2} ( y^{(i)}  - \phi (z^{(i)}) )^{2}\right\} }{\partial ( y^{(i)}  - \phi (z^{(i)}) ) } \frac{\partial ( y^{(i)}  - \phi (z^{(i)}) ) }{\partial z^{(i)} } \frac{\partial z^{(i)} }{\partial w_j}
}

{\displaystyle
~~~~~~~~~~~~ = \sum_{i=1}^{n} - \alpha ( y^{(i)}  - \phi (z^{(i)}) ) x_j^{(i)} ~~~~~~(6)
}

覚えておく用語

  • コスト関数: 全てのトレーニングサンプルで教師データと活性化関数の出力値の差の2乗を足し合わせたもの。
  • クォンタライザー: 連続値を飛び飛びの値に変換する(量子化する)関数。
  • 勾配降下法: ある関数の勾配と逆方向に変数を動かし、関数を最小化する手法。