Pythonでパーセプトロン
パーセプトロンって何?
パーセプトロンは最も単純なニューラルネットワークモデルで、図に表すと次のようになります。
パーセプトロンは入力ベクトルと入力層と出力層の結合重みベクトルの内積を活性化関数に与える線形識別モデルの事です。
式で表すと次の様になります。
また、活性化関数は次の様なステップ関数で定義されています。
このパーセプトロンで何が出来るのかと言うと、何かの特徴ベクトルを与えた時に活性化関数の出力値の符号を見る事で、識別を行うなんて事が出来たりします。
識別を行うことが出来る~と言っても、実際に識別を行う為には適切な重みを学習する必要があります。
パーセプトロンの学習
パーセプトロンの学習には最急降下法を使っている事が多いです。
最急降下法は、何かの関数に対し、その関数の出力が最大(もしくは最小)となる引数を逐次的に求めるアルゴリズムです。
引数のベクトルを、目的の関数をとした時の、の更新を式にすると、次の様になります。
関数の出力を最大となるパラメータを求める時
関数の出力を最小となるパラメータを求める時
は学習係数です。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
平面上に赤と緑の点を沢山プロットし、それぞれを分離する線形識別境界線をパーセプトロンと最急降下法で求めると次のようになります。