1. HOME
  2. ブログ
  3. IT技術
  4. 機械学習の元祖「パーセプトロン」とは?【人工知能】

機械学習の元祖「パーセプトロン」とは?【人工知能】

パーセプトロンとは?

パーセプトロンとは、1958年に発表された、謂わば機械学習の元祖です。

パーセプトロンはニューラルネットワークの一種で、形式ニューロンを複数用いてネットワーク状に接続したものを指します。

一般的に、以下のように分類されます。

  1. 2層からなる「単純パーセプトロン」
  2. 3層以上からなる「多層パーセプトロン」

現在は後者の多層にしたパーセプトロンが主流ですが、この記事では入門編としまして、シンプルでわかりやすい単純パーセプトロンの解説と実装を紹介していきたいと思います。

実行環境

実装はPythonで解説していきますが、筆者の実行環境は以下の通りです。

  1. Python 3.7.3
  2. numpy 1.16.3
  3. matplotlib 3.0.3

また、以後紹介するコードでは、以下のようなインポートがされている前提で解説していきます。

それでは解説していきます!

そもそも形式ニューロンとはなんでしょうか?

形式ニューロンは1943年に発表された、世界初の神経細胞モデルです。

非常にシンプルながら、その汎用性と実装のしやすさから現在も、この考え方が主流です。

形式ニューロンの性質は、非常にシンプルです。

数式で表すと

(1)$$\displaystyle y = \sum_{i=1}^n{w_i x_i}$$
(2)$$\displaystyle z = f(y) $$
(3)$$\displaystyle f(x)= \begin{cases}1 & ( x \gt 0 ) \\ 0 & ( x \leq 0 ) \end{cases}$$

上の図と式で示すように、ある外部からの入力 \(x_i \{i=1,2,3,\cdots,n\}\) に対して、それぞれ重み \(w_i \{i=1,2,3,\cdots,n\}\) がかけられ、その和 \(y\) がニューロンへの最終的な入力になります。

その後、その入力があるしきい値(バイアス) \(\theta\) を超えていれば \(1\) を、超えてなければ \(0\) を出力する、という性質を持ち合わせています。

このとき、式(3)を活性化関数(あるいは入出力関数)と言います。

パーセプトロンでは、通常ステップ関数が使われますが、近年の機械学習では様々な活性化関数が使われます。

式を実際にPythonで実装

上記のように、とてもシンプルなコードになりました!

単純パーセプトロン

単純パーセプトロンは、図のような2層からなるネットワークを指します。

図だと1層目に複数のニューロンが用いられていますが、実際には入力層には入力データ(訓練データ、学習データ)がセットされるので、実質1つの形式ニューロンを用いたシンプルな構造になっています。

パーセプトロンは、入力層と出力層のニューロンを結ぶシナプス結合荷重(重み)を学習していきます。

では、学習方法について話を進める前に、そもそも「学習」についてご説明したいと思います。

パーセプトロンの学習

単純パーセプトロンでは、出力層ニューロンは1つで、その出力値は0か1の二値です。

つまり、ある入力データに対してクラスに属しているか否かを判別することが最終的な目標となります。

先ほどのパーセプトロンの図と式から、出力値というのは以下のような一つの関数で表すことができます。

$$f(x)=-w_0+w_1x_1+w_2x_2+\cdots+w_nx_n$$

この関数 \(f(x)\) が正なら1を、負なら0を出力するわけですから、重みを調整して2つのクラス分類が可能というわけです。

アヤメの分類問題

ちょっと文字だけではわかりづらいので、簡単に入力が2次元として図を用いて見てみましょう。

機械学習でよく使われる、アヤメの分類問題を例に考えてみます。

ちなみに、「アヤメデータセット(UCI Machine Learning Repository: Iris Data Set)」とは、4次元の特徴データ(がくの長さ、がくの幅、花びらの長さ、花びらの幅)から、3つのクラス分類をする比較的簡単な識別ベンチマークのひとつです。

このデータセットから2クラス(青:setosa, 緑:versicolor)を、x軸が「がくの長さ+幅」y軸が「花びらの長さ+幅」として実際にプロットしてみましょう。

【UCI Irisデータセットのsetosaクラスとversicolorクラス】

このようにこの2クラスでは、なんとなくクラスごとにデータが固まっているように見えます。

このような図を特徴空間とも言います。

もし、このグループを一つの直線で分割するとすれば、例えば以下のような直線が望ましそうですね。

【決定境界の例】

このような直線が引ければ、答えが分からない未知データに対しても、直線より下に位置するデータ(すなわち \(f(x)\leq0\) )はsetosaで、上に位置するデータ(すなわち \(f(x)>0\) )ならversicolorだと分類できます。

この直線を決定境界(Decision Boundary)と言い、先ほどの関数 \(f(x)\) に当たります。

しかし、単純パーセプトロンの重み \(w\) は、最初はランダムな値に初期化されているので、図のような綺麗な直線は引けていません。

この決定境界と呼ばれるクラス分類の境界線を引くことが学習のゴールです。

学習法

次に、どうやって決定境界を学習していくかを解説していきます。

特徴空間上に決定境界を引くわけですが、さきほど書いたように最初は重みがランダムで初期化されているので、デタラメな決定境界が引かれています。

【図5、デタラメな決定境界】

そこで学習の方針としては、一つ一つの学習データに対して今の決定境界で自身が正しいクラスに分類されているか、を見ていきます。

誤差関数

そのためにまずは、誤差関数 \(E\) というものを定義します。

$$E_p=t_p-f(x_p) \ \ \ \ \ (4)$$

ここで、式(4)は、ある学習パターン \(p\) の入力ベクトル \(x_p\) が与えられた時の出力 \(f(x_p)\) と、それに対応するクラスラベル(教師信号) \(t_p\) の差を意味します。

もし、ある学習パターン \(p\) の出力値がsetosa( \(f(x_p)=0\) )で、教師信号もsetosa( \(t_p=0\) )であれば、 \(E_p=0\) となります。

教師信号がversicolor( \(t_p=1\) )ならば \(E_p=1\) となります。

これらの関係を表にまとめてみると

\(E_p\)\(f(x_p)=0\)\(f(x_p)=1\)
\(t_p=0\)0-1
\(t_p=1\)1 0

上記のようになります。

ここで重要なのは、誤差関数は重みの修正の向きを表しています。

  1. \(E=0\) なら修正する必要なし。
  2. \(E=1\) なら重みを大きくする方向に修正する。
  3. \(E=-1\) なら重みを小さくする方向に修正する。

といった具合に学習を進めていけば、最終的に全ての学習パターンに対して誤差が0になるはずです。

しかし、この誤差関数をそのまま使うと、修正量が必ず1の大きさなので、一般的には以下のような重み更新式を用います。

重み更新式

$$\Delta w=\eta E_{p}x_{p} \ \ \ \ (5)$$

ここで \(\eta\) は、学習率といいあらかじめ自分で設定する必要があります。

通常、0.1~0.0001のような小さな値が使われます。

以上が学習の流れになります。

Pythonでコーディング

では、実際に、Pythonでコーディングしてみます(今回は学習率0.001を使用)。

動作確認

ここからは実際にPythonを用いて動作確認していきましょう。

動作確認条件

今回は以下のような条件で学習をしていきます。

合わせてこの後で紹介するコードでどの行に対応しているかも書いておきます。

学習率\(\eta\)0.00128行目
最大学習回数100 epochs84行目
重み初期値0~1の乱数17行目
データセットIrisデータセット31行目
学習終了条件最大学習回数に到達または全てのデータに対する誤差が0になったとき94行目

最終的なPythonコード

動作結果

動作結果の一例は、以下のようになります。

もちろん重みの初期値によって結果は変動しますのでこの結果の限りではありません。

【図、動作結果例】

0/100 epoch.
50
1/100 epoch.
50
2/100 epoch.
50
3/100 epoch.
8
4/100 epoch.
0
識別率:100.0%

結果を見てわかるように、きれいに決定境界が引けていて、識別率もわずか4回の学習で100%を獲得できていることがわかります。

(偶に識別率は100%でもうまく決定境界が引けないことがあるのは、4次元のデータを無理やり2次元で描写しているからです。)

これでこのパーセプトロンはIrisデータセットのうち2クラスは分類できるネットワークになりました。

これが初期の人工知能で、今ある人工知能技術の基盤となっています。

単純パーセプトロンの欠点

最後に、単純パーセプトロンの欠点を紹介してこの記事を終わりにします。

  1. 先ほどの動作確認でわかったように、2クラス分類しかできない
  2. また、重要な欠点として、線形分離可能な問題にしか使うことができない

Irisのsetosaとversicolorを表した図3のように、綺麗にクラスごとに分かれていれば良いのですが、以下のように2クラスが混同しているとうまく決定境界が引けません

【図7、Irisデータセットのversicolorとvirginicaで実験した場合】

この問題を解決するために多層パーセプトロンが提案されたのです。

多層パーセプトロンについてはまた別の記事で紹介いたしますのでお楽しみに!

一緒に働いてくれる仲間を募集中!

ライトコードでは、仲間を募集しております!

ライトコードのモットーは「好きなことを仕事にするエンジニア集団」。そのため、あなたがやりたい仕事を全力で応援します。

どうせなら、好きなことを仕事にする方が人生は何倍も素晴らしいものになるはず!また、ライトコードはこれからの会社ですので、みんなで新しい事業や組織を作っていく楽しみもあります。

あなたからのご応募をお待ちしております!

ライトコードでは一緒に働いていただける方を募集しております!
お気軽にご応募ください。

採用情報はこちら

書いた人はこんな人

ライトコードメディア編集部
ライトコードメディア編集部
「好きなことを仕事にするエンジニア集団」の(株)ライトコードのメディア編集部が書いている記事です。

関連記事