数学やプログラミングの備忘録

数理最適化, Python, C++をメインに紹介するブログ。

MENU

パーセプトロンって 何?仕組みを理論的に解説

何となく機械学習を勉強しようと思って、手始めにパーセプトロンについてまとめます。

歴史

何ができるの?

  •  x_1,\dots,x_p が与えらたとき、2つのクラスのうちどちらかに分類
  • 例えば、「血液の成分値  x_1,x_2 から、病気かどうか判定」

判定方法

パーセプトロンとして、例えば以下の関数  \phi を定義します:


\phi(x) :=
  \begin{cases}
  1 & (\text{if } f(x)\ge 0)\\
  -1 & (\text{if } f(x)< 0 )
  \end{cases},

ここで、 f(x) は以下のように定義します:


f(x) := w_0 + w_1 x_1 + \dots, w_p x_p.

 w_0, \dots, w_p は定数です。

先ほどの例「血液の成分値  x_1,x_2 から、病気かどうか判定」で説明するなら、 x_1,x_2 f(x) に代入し、

  •  f(x) が非負なら \phi(x)= 1 (陽性)
  •  f(x) が負なら  \phi(x)=-1 (陰性)

判定器としてパーセプトロンを定義するためには、 トレーニングデータから  w_j を求める必要があります。

 w_j をどう求めるのか?

フレームワーク

  •  w = {(w_0,\dots,w_p)}^T \in\mathbb{R}^{p+1} の初期値セット(例えば0)
  • 指定されたトレーニング回数だけ、以下を繰り返す
    • 与えらたトレーニングデータの各データサンプル  {x}^i \in \mathbb{R}^p (i=1\dots,n) に対し、以下を繰り返す
      •  \phi({x}^i) の判別結果と真のクラスが違うならば、 w を更新して、良い感じに修正

 w の更新方法

まず、文字を定義:

  • パラメータ  \alpha \in \mathbb{R}(0 <  \alpha\le 1),
  •  y_i = 1 or -1:  i 番目のデータサンプルの真のクラスを表す
  •  {x}^i = {({x}^i_1,\dots,{x}^i_p)}^T\in\mathbb{R}^p:  i 番目のデータサンプル
  •  {x}^i_0 = 1(便宜上定義)

 w_j\ (j=0,\dots,p) はこのように更新される:


w_j \leftarrow w_j + \Delta w_j(x^i).

 \Delta w_j({x}^i) は次のように定義される:


\Delta w_j(x^i) = \alpha (y_i - \phi(x^i)){x}^i_j

この更新方法は巧いな、と思いました。

理由は、

  • 現在の判別器の結果と真のクラスが一致するならば、更新しない
  • 一致しないのならば、一致しやすくなるに  w_j を増加(あるいは減少)して更新

です。もう少し言うと、判別器の結果と真のクラスの組合せは4通りあって、その4通り全ての場合も同じ更新式で表現できるからです。

注意

  • データサンプルが線形分離可能でないと、 w_j は更新され続けるため、トレーニング回数を与えておく