参考にした書籍でこの順序で誘導されていて理解しやすかったです.
- パーセプトロンによる一番簡単な教師あり学習を理解する
- ADALINEにより学習を凸で連続なコスト関数の最小化問題として捉える
パーセプトロンの学習
2値のラベル(\(+1\),\(-1\))が付与されているサンプルデータが与えられたとする.
ラベル値が\(-1\)であるデータと, ラベル値が\(+1\)であるデータに分類できる.
それらの境界が線形和で表される問題である場合, その境界を求めることができれば,
未知のデータに対してその境界の\(+1\)側か\(-1\)側かを判定できる.
\(m\)次のサンプルデータと重みの線形和を考える.
\[ \boldsymbol{z} = \boldsymbol{w}^T \boldsymbol{x} =
w_1 x_1 + w_2 x_2 + \cdots x_m x_m
\]
\(z\)に関するステップ関数を用意する.
こうすることで \(z\)-\(\phi(z)\) 空間において\(z=\theta\)を境に線形和\(z\)が\(-1\),\(+1\)に分かれることを表現できる.
\[
\varphi(z) = \begin{cases}
1 & (z \gt \theta) \\
-1 & (z \leq \theta)
\end{cases}
\]
\(\theta\)を左辺に移動し, \(x_0 = 1\), \(w_0 = -\theta\) とすると,
線形和に\(\theta\)の項を組み入れることができる.
新しい線形和\(z’\)が\(0\)になる箇所を境にステップ関数の応答値が切り替わる.
\[
\varphi(z) = \begin{cases}
1 & (z-\theta \gt 0) \\
-1 & (z-\theta \leq 0)
\end{cases}
\]
\[
z’ = z – \theta = w_0 x_0 + w_1 x_1 + w_2 x_2 + \cdots x_m x_m
\]
あるパラメータ\(\boldsymbol{w}\)が存在するとして, データ\(\boldsymbol{x}\)について,
\(\boldsymbol{w}^T \boldsymbol{x}=0\)を境界にステップ関数の応答値が切り替わる.
未知のデータ\(x\)に対して, \(\boldsymbol{w}^T \boldsymbol{x}\)はラベルの予測値\(+1\), \(-1\)を応答する.
予測値\(\varphi(w^Tx)\)が正解であるサンプルデータに含まれる\(y^{i}\)と同じとなる\(w\)を探したい.
それを探していく. 最初,\(w\)に初期値を設定し, 以下の手続きによって\(w\)を更新していく.
上付きの添字はサンプルデータ内の順序数を表している. \(y^{(i)}\)は\(i\)番目のサンプルデータ.
右下の添字は該当サンプルデータの各次元を表している. \(y^{(i)_m}\)は\(y^{(i)}\)の\(m\)番目の要素.
- 現在の\(w\)を使って予測値を計算する. \(\hat{y}=w^T x\)
- \(w\)を更新する. \(\Delta w_j := \eta(y^{i}-\hat{y})x^{i}_j\)
1個のサンプルデータで1回\(w\)が更新される.
そもそもデータセットを綺麗に線形和が表す決定境界で分離できないような状態だと、
何度やっても予測したクラスラベルと真のクラスラベルの差が埋まらない。
あっちを立てればこっちが立たず、みたいになる。
予測したクラスラベルと真のクラスラベルを比較するこの方法だと、
\(\Delta w_j := \eta(y^{i}-\hat{y})x^{i}_j\) が良い値なのか悪い値なのか、繰り返さないとわからない。
予測と真の値の比較を凸で連続な関数で表すことができれば、その関数の凸の底に向かうやり方で、
「今より良い次の値」に更新する方法を解析的に求めることができて都合が良い。
真の値と予測した値の差が「損失」とか「コスト」とか呼んで、
「コスト関数」を最小化するパラメータが良いパラメータなんだろう、という話が進んでいく。
ADALINEの学習
線形和をステップ関数に変換する部分があった。
こうして\(w^T x \varphi(w^T x)\)空間で \(w^T x\)が\(-1\),\(+1\)に分かれる\(w\)を求めようとした.
\[
\varphi(z) = \begin{cases}
1 & (z-\theta \gt 0) \\
-1 & (z-\theta \leq 0)
\end{cases}
\]
そうではなく以下の恒等式(左辺と右辺が同じ)を使い,真の値と予測した値の差の求め方を変えると,
差が凸で連続な関数で表せるようになり (解析的に微分できるようになり),
一番小さいところは? という話がしやすくなる.
\[
\varphi(z)=z
\]
最小二乗法のときやったやつで、差の2乗を足し合わると符号がキャンセルされてよくて、差を式で表せる。
\[
J(w) = \sum_i \left( y^{(i)} – \varphi(w^T x^{(i)}) \right)^2
\]
こういうのを誤差平方和と言うようで\(\frac{1}{2}\)倍するらしい.
\[
J(w) =\frac{1}{2} \sum_i \left( y^{(i)} – \varphi(w^T x^{(i)}) \right)^2
\]
\(J(w)\)がなんで連続で凸なのかは知ったことではないが、
連続で凸であれば\(J'(w)=0\)を解くと極小となる\(w\)が求まるのは高校生のときにやった話.
\(J(w)\)の接線(多次元だと接っする面)の傾きが\(J'(w)\)。
ただ\(w\)には次数があって傾きは以下(それぞれの次数毎の極限).
\[
\nabla J(w) = \frac{\partial J(w)}{\partial w_j}
\]
\(w J(w)\)空間で\(\nabla J(w)\)は\(w\)における傾きなので, \(w\)に\(-\nabla J(w) \cdot 1\)を足すと,
\(J(w)\)が極小になる箇所に近づく.
どれだけ行けば良いかわからないので\(-\nabla J(w) \cdot \eta\)を足すことにする.
\(w\)を以下の通り更新する.
\begin{eqnarray}
w &:=& w + \nabla J(w) \\
&:=& w -\nabla J(w) \cdot \eta
\end{eqnarray}
ちなみに\(\nabla J(w)\)は式をこねくり回すと計算できる.
最終的に更新は以下の通りとなる.
\[
w := w – \eta \sum_i \left( y^{(i)} -\varphi \left( z^{(i)} \right) \right) x_j^{(i)}
\]
パーセプトロンの更新とそっくりな形が出てきて感動する…
あっちは\(\varphi(z)\)が不連続なステップ関数でこっちは連続な関数.
式をこねくり回す際に, \(\varphi(z) = z\)の恒等式の関係を使っていない.
何か連続な関数であればこれが成り立つ.
形式上,例えば\(\varphi(z)\)を以下(シグモイド)とすることでロジスティック回帰 (本当か? 次回確認.).
\[
\varphi (z) = \frac{1}{1+e^{-z}}
\]