元理系院生の新入社員がPythonとJavaで色々頑張るブログ

プログラミングや機械学習について調べた事を書いていきます

Pythonでパーセプトロン

この記事に書かれていること

パーセプトロン最急降下法の説明
Pythonによるパーセプトロンの実装

パーセプトロンって何?

パーセプトロンは最も単純なニューラルネットワークモデルで、図に表すと次のようになります。
f:id:emoson:20150223034531p:plain

パーセプトロンは入力ベクトルXと入力層と出力層の結合重みベクトルW内積を活性化関数に与える線形識別モデルの事です。

式で表すと次の様になります。
 y(X) = f(W^{T}X)

また、活性化関数は次の様なステップ関数で定義されています。
 f(a) = \begin{cases} 1 & (a \geq 0) \\ -1 & (a < 0) \end{cases}

このパーセプトロンで何が出来るのかと言うと、何かの特徴ベクトルを与えた時に活性化関数の出力値の符号を見る事で、識別を行うなんて事が出来たりします。
識別を行うことが出来る~と言っても、実際に識別を行う為には適切な重みを学習する必要があります。

パーセプトロンの学習

パーセプトロンの学習には最急降下法を使っている事が多いです。
最急降下法は、何かの関数に対し、その関数の出力が最大(もしくは最小)となる引数を逐次的に求めるアルゴリズムです。


引数のベクトルを X、目的の関数を f(X)とした時の、 Xの更新を式にすると、次の様になります。

関数の出力を最大となるパラメータを求める時
 x_{i, new} = x_{i, old} + \alpha \frac{\partial f(X)}{\partial x_{i, old}}

関数の出力を最小となるパラメータを求める時
 x_{i, new} = x_{i, old} - \alpha \frac{\partial f(X)}{\partial x_{i, old}}

 \alphaは学習係数です。0から1の間の実数を取り、この値が大きいと一回の更新で変化する値が大きくなり、小さいと変化する値は小さくなります。
学習係数は一般的に、最初は大きな値を設定し学習する毎に減少させていきます。

Pythonによるパーセプトロン最急降下法の実装

__author__ = 'emoson'
import numpy as np


def f(w, x):
    """
    出力関数
    """
    y = np.dot(w, x)
    return y, 1 if y >= 0 else -1


def learning(w, x, l, alpha=0.3):
    """
    最小化の学習
   :param w: 重みベクトル
   :param x: 入力ベクトル
   :param l: 教師ベクトル
   :param alpha: 学習係数
    """
    y, o = f(w, x)
    return w + alpha*l*x if o * l < 0 else w

def learning_max(w, x, l, alpha=0.3):
   """
   最大化の学習
   :param w: 重みベクトル
   :param x: 入力ベクトル
   :param l: 教師ベクトル
   :param alpha: 学習係数
   """
    y, o = f(w, x)
    return w + alpha*l*x if o * l < 0 else w


平面上に赤と緑の点を沢山プロットし、それぞれを分離する線形識別境界線をパーセプトロン最急降下法で求めると次のようになります。
f:id:emoson:20150223043819g:plain