【機械学習】よくわかるパーセプトロン

パーセプトロンって何?

いきなりですが、まずはパーセプトロンとは何なのか、ということから説明します。

 

簡単に言うと、パーセプトロンとは分類器の一種です。

分類器って何?って方のために説明を加えると、分類器とは、入力された情報をもとに、それがどのクラスに属するのかを識別するもののことを言います。

 

前回までに扱った、線形回帰モデルは、入力された情報をもとに、連続的な数値を算出するものでしたよね。

>>【機械学習】よくわかる単回帰分析

>>【機械学習】よくわかる線形回帰

 

それとは違って、分類器では連続した数値ではなくラベルの予測を行います。

 

例えば、酸味や甘味、色合いなどをもとに、りんごとぶどうを分類するとしましょう。

この場合、予測結果は連続的な数値ではなく、「りんご」か「ぶどう」の2択になりますよね。

 

この作業を行うモデルの1つがパーセプトロンというわけです。

 

分類と言っても、そこまで複雑なことをするのではなく、やることとしては線形回帰と似たようなことを行います。

 

線形回帰はプロットしたデータに当てはまりのいい直線や平面を求めました。

分類の場合は、ちょうどよくクラスを分けるような直線や平面を求めます。

 

例えば、2つの説明変数からなるデータがあったとして、それぞれの説明変数を縦軸と横軸に取り、プロットしたグラフがこのようになったとします。

 

明示的に色分けしていることもあり、パッと見ただけでどうやって分類するべきなのかがわかるかと思います。

ずばりこういう直線を引いてあげると、直線の上にあるのか下にあるのか、という情報で分類できそうですよね。

 

ということで、パーセプトロンでは、この直線を求めることがゴールとなります。

 

では次の章からもう少し詳しくお話していきます。

(余談ですが、パーセプトロンは人間の脳内にある神経細胞ニューロンを模して作られたモデルです。)

 

スポンサーリンク

 

パーセプトロンの構造

では、パーセプトロンがどのような構造になっているのかを図を用いて見てみます。

かなりざっくりと図示するとこんな感じです。

 

この図では、\(X_{1}, X_{2}, X_{3}\)を説明変数とし、その重みとして\(w_{1}, w_{2}, w_{3}\)を用意しています。

その総和が真ん中の黒丸のところの入力値となります。

 

数式としてはこうですね。

ここでは黒丸への入力値を\(u\)とします。

$$u = w_{1}X_{1} + w_{2}X_{2} + w_{3}X_{3}$$

 

では、最後に出力される値はどのようになるのでしょうか。

 

パーセプトロンは分類器なので、ラベルを出力します。

ここでは、-1と1をラベルとして見ると、このどちらかが出力結果となります。

(ラベルの値はなんでもいいのですが、-1と1の方が計算上都合がいいです。)

 

出力結果が-1か1ということは、黒丸に入力された値\(u\)は何らかの変換をされていることがわかりますね。

 

実は、真ん中の黒丸の中では、単純に\(u\)がある値を超えていれば1を、超えていなければ-1を出力するようになっています。

このある値のことを閾値(しきいち)と呼びます。

 

ちなみに、このような変換を加える関数のことを活性化関数と言い、今回の活性化関数はステップ関数を呼ばれるものを使っています。

 

閾値を\(\theta\)とすると、最終的な出力値\(y\)はこのようになります。

(便宜上\(\theta\)を含むことにします。)

$$ y = \left\{ \begin{array}{11} \space 1 & (u \geq \theta) \\ -1 & (u < \theta) \end{array} \right. $$

 

しかし、一般的には閾値を左辺に移行することで、以下のように書かれる事が多いです。

$$ y = \left\{ \begin{array}{11} \space 1 & (u – \theta \geq 0) \\ -1 & (u -\theta < 0) \end{array} \right. $$

 

これだと見にくいので、\(u\)の方にも少し手を加えます。

$$u – \theta = w_{1}X_{1} + w_{2}X_{2} + w_{3}X_{3} – \theta$$

$$右辺 = w_{1}X_{1} + w_{2}X_{2} + w_{3}X_{3} – \theta$$

 

\(-\theta\)は定数なので、\(w_{0}\)と置き換えてあげます。

また、\(w_{0}\)に\(X_{0} = 1\)を掛け算します。

 

こうすることで、以下のようにスッキリとした式になりますね。

$$右辺= w_{0}X_{0} + w_{1}X_{1} + w_{2}X_{2} + w_{3}X_{3}$$

 

これを入力値\(u\)と置き換えてしまいましょう。

今までの変換をすべてまとめると、最終的な式はこうなります。

 

$$u = w_{0}X_{0} + w_{1}X_{1} + w_{2}X_{2} + w_{3}X_{3}$$

$$ y = \left\{ \begin{array}{11} \space 1 & (u \geq 0) \\ -1 & (u < 0) \end{array} \right. $$

 

※ \(w_{0}X_{0}\)はバイアス項と呼ばれ\(b\)と表記されることもあります。

 

ここまでが、パーセプトロンが入力値からラベルを出力するまでの一連の流れになります。

では、次の章では、パーセプトロンがどのように重みを更新していくのかを解説します。

 

スポンサーリンク

 

パーセプトロンの学習

入力値から最終的な出力までの一連の流れを見てもらったと思うので、ここでは、出力値の予測精度が高くなるようにするには、どのように重みを更新するのべきなのかを解説します。

 

まずは、図を用いて直感的に理解してもらうために、ここでは説明変数が2つの場合で考えていきます。

 

今回は、具体例として、数学と英語のテストの点数から、合格か不合格かを分類するとします。

 

\(x_{1}、x_{2}\)をそれぞれ数学と英語の点数として、\(w_{1}、w_{2}\)をそれぞれの重みとします。

また、バイアス項として\(w_{0}x_{0}\)を追加します。

 

入力値とその重みからなる値の総和を\(u\)とすると、以下のようになります。

$$u = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2}$$

 

この値が0以上の場合は合格、0未満の場合は不合格としたいので、最終的な出力結果はこのようになります。

$$ y = \left\{ \begin{array}{11} \space 合格 & (u \geq 0) \\ 不合格 & (u < 0) \end{array} \right. $$

 

日本語が混ざると計算できなくなるので、合格ならば1、不合格ならば-1と書き換えましょう。

$$ y = \left\{ \begin{array}{11} \space 1 & (u \geq 0) \\ -1 & (u < 0) \end{array} \right. $$

 

まとめると、

$$u = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2}$$

$$ y = \left\{ \begin{array}{11} \space 1 & (u \geq 0) \\ -1 & (u < 0) \end{array} \right. $$

 

これが合否を分ける式です。

 

では実際にデータを用いてパラメータの学習をしていきます。

手元にはこのようなデータがあるとします。

 

このデータをもとに学習させてみましょう。

なお、以下では、n個目のデータに対する合否のフラグを\(t_{n}\)とします。

(合格なら \(t_{n} = 1\)、不合格なら \(t_{n} = -1\))

 

まず、横軸を数学の得点 \(x_{1}\)、縦軸を英語の得点 \(x_{2}\)とし、それぞれプロットして、合否を色分け(合格は赤、不合格は青)すると、このようになります。

 

パーセプトロンの学習では、はじめに適当なパラメータを決めます。

今回は、以下のような状態から学習をスタートすることにします。

直線の式はこうでしたね。(\(x_{0}\)は常に=1の定数)

$$u = f(x_{1}, x_{2}) = w_{0}x_{0} + w_{1}x_{1} + w_{2}x_{2}$$

 

ここで、うまく分類できていないデータはこの4つですよね。

 

ということは、この4つのデータをうまく分類するようにパラメータを更新する必要があります。

逆に言うと、パラメータを更新するにあたって、現時点で正しく分類できているデータは考慮する必要がないということです。

 

では、それらを踏まえた上でパラメータの更新式を確認してみます。

すべての過程を説明すると、結構複雑なので今回は割愛します。

 

結論だけ言うと、学習率を\(\eta\)とするとパラメータの更新式はこのようになります。

$$\boldsymbol{w}^{(n+1)} = \boldsymbol{w}^{(n)} +  \Delta \boldsymbol{w}^{(n)}$$

$$\Delta \boldsymbol{w}^{(n)} = \eta(\boldsymbol{y^{(n)}} – \boldsymbol{t^{(n)}} )\boldsymbol {x}^{(n)}$$

 

\(y\)が予測値、\(t\)が実際のラベルなので、これらが一致するときは、パラメータの更新を行わないことが確認できるかと思います。

 

では、最後に、実際に学習を行った後のグラフ直線を確認してみましょう。

 

パーセプトロンを用いて学習させた結果はこのようになりました。

 

しっかりとすべてのデータが正しく分類できていることが確認できるかと思います。

 

おわりに

パーセプトロンについて雰囲気だけでも掴めたでしょうか。

 

今回、誤差関数の詳しい説明をかなり割愛したので、物足りないという方は、別の参考書などもあさってみることをお勧めします。

 

また、最後の方で実際にデータを分類する直線を求めましたが、パーセプトロンを用いて分類する場合、正しく分類する直線の引き方が無数に存在してしまいます。

 

というのも、分類できていれば、点と直線の距離の近さ加減は考慮されないからです。

 

この問題を解決する手段としてサポートベクターマシーンというアルゴリズムがあります。

次回は、こちらの方を解説してみたいと思いますので、興味のある方は、少し調べてみてください。

 

では、今回はここまでとします。

お疲れさまでした。