単純パーセプトロンの仕組みとPythonによる実装をチェック

ニューラルネットワーク、深層学習を体系的に勉強していくにあたって、いろいろな解説書で最初に解説されるアルゴリズムが「単純パーセプトロン」です。

ニューラルネットワークを勉強していくにあたって、まず最初に知ってほしいアルゴリズムだと言えます。

単純パーセプトロンの仕組みを知って、「このアルゴリズムが何ができて何ができないのか」を理解しましょう。

この記事で解説すること

  • 単純パーセプトロンとは
  • 単純パーセプトロンでできること
  • 単純パーセプトロンでできないこと
目次

単純パーセプトロンとは

「パーセプトロン」とは、複数の入力データ(入力信号)に対して、一つの値を出力する関数です。

後述しますが、パーセプトロンを複数組み合わせるアルゴリズムもありますので、一つしか使わないものを単純パーセプトロンと呼びます

入力信号をx1, x2で表します。

また、出力信号をyとしました。

ここで、各入力信号とは、あるデータの特徴を表します。

それぞれの特徴が目的の値(y)を計算するときにどの程度重要なのかを表すパラメータ(結合重み)として、w1,w2を使います。

図中の数式のように入力信号と、それに対応するwをかけあわせた値をすべて足し合わせた値を出しましょう。

この値がしきい値θ以下ならば0、しきい値θより大きければ1を返す関数がパーセプトロンです。

このパーセプトロンを使うと、簡単な分類問題などを解くことができます。

単純パーセプトロンの例題

ANDゲートを用意する

単純パーセプトロンの例題として、よく論理演算をパーセプトロンで実装するものがあります。

ここでも、単純パーセプトロンを使って、ANDゲートを実装してみましょう。

まずはライブラリのimport。

import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

ANDゲートの表を作ってみます。

signal = pd.DataFrame(
    [
        [0,0],
        [1,0],
        [0,1],
        [1,1]
    ],
    columns = ["x1", "x2"]
)

この記事ではANDゲートについてのみ解説しますが、実際に手元で勉強していく際には、ORゲートなどのものも試してみてください。

signal変数に論理値の入力信号をまとめました。

これを元にして他の論理演算も試してみてくださいね。

さて、ANDゲートの正解データをDataFrameで作ってみましょう。

# AND
AND = signal.copy()
AND["y"] = signal.x1 & signal.x2
AND

AND演算「入力がどちらも1ならば1、それ以外ならば0」を返します。

ここで、DataFrameの各行0~3までをそれぞれ入力データとして見てみると、x1,x2は各データの特徴になります。

yはデータを受け取ったパーセプトロンに返してほしい出力値です。

このyの値と同じ値を返してくれれば、パーセプトロンでANDゲートを実装できたことになります。

パーセプトロンの実装

では、PythonでANDゲートを再現するパーセプトロンを実装しましょう。

パーセプトロンの最も簡単な実装では、w1,w2などのパラメータはプログラマが自分で値を与えます

この値については、パーセプトロンの式(二元一次方程式)を手作業で解くことで与えられますね。

ここでは、w1とw2は0.5としました。

また、しきい値θについても決める必要があります。

ここでは0.7としてみましたが、これらの値は他にも適した組み合わせがあります。

考えてみてください。

def AND_gate(x1,x2):
    w1,w2 = 0.5,0.5
    theta = 0.7
    tmp = w1*x1 + w2*x2
    if tmp <= theta:
        y = 0
    else:
        y = 1
    return y

さて、このAND_gate関数が実際にANDゲートを再現できているかチェックしましょう。

すべての入力データの組み合わせに対して答えを出してみます。

print(AND_gate(0,0))
print(AND_gate(1,0))
print(AND_gate(0,1))
print(AND_gate(1,1))

[出力結果]

0
0
0
1

この値は最初に作ったANDゲートのデータフレームのy列と同じ値になっています。

これでパーセプトロンを使ったANDゲートの実装ができましたね!

バイアスの導入

バイアスを導入したパーセプトロン

さて、先程までのパーセプトロンでは、しきい値θという値が登場しました。

ですが、このθの値、wと同様にプログラマが変更するべきパラメータでした。

ここからは、このしきい値θをバイアス(bias)という値に置き換えたパーセプトロンを実装してみます。

biasを式中ではbとしました。

このとき、b=-θと考えて式を変形すると、上のように右辺(不等式の右側)を0で統一できますね。

こっちのほうが見やすくて実装も考えやすいので、普通はこちらが使われます。

バイアスを導入したパーセプトロンの実装

では先程と同じ例題を、バイアスを使ったパーセプトロンで試してみましょう。

コードの修正点は

  1. thetaの部分がbになって値がマイナスになっている
  2. 条件式が0より大きいかどうかになっている

の二箇所です。

def AND_gate2(x1,x2):
    w1,w2 = 0.5,0.5
    b = -0.7
    tmp = w1*x1 + w2*x2 + b
    if tmp <= 0:
        y = 0
    else:
        y = 1
    return y

print(AND_gate2(0,0))
print(AND_gate2(1,0))
print(AND_gate2(0,1))
print(AND_gate2(1,1))

[出力結果]

0
0
0
1

正しく動作していますね。

単純パーセプトロンの限界

単純パーセプトロンで簡単なANDゲートの再現ができることがわかりました。

ここで紹介はしませんでしたが、この他にもORゲートやNANDゲートなどが実装できます。

さて、ではこの単純パーセプトロンを使えばすべての論理演算が実装できるのでしょうか?

[ANDゲートのグラフ]

ANDゲートの例題で使った入力信号を二次元グラフにしました。

通常x軸があるところがx1軸、y軸があるところがx2軸、黄色がy=1, ピンクがy=0です。

青色の線は単純パーセプトロンがこれらのデータ点を分類するときに使っている境界線です。

このように、単純パーセプトロンでは直線を一本引いて境界線を決めています。

これで分類できる問題ならば分類が可能そうですが、以下のような問題ではどうでしょうか。

[XORゲートのグラフ]

このグラフでは、一本の直線で境界線を引くことができません

このような問題の場合、境界線を一本しか引けない単純パーセプトロンでは再現することができませんね。

これが単純パーセプトロンの限界です。

これを克服するための方法にはいくつか方法がありますが、順当に考えると

「パーセプトロンを複数使って多層化する→多層パーセプトロン」

を考えるのが一般的です。

これについてはまた別の記事で!

まとめ

この記事では、単純パーセプトロンについて紹介し、理論と実装を見ていきました

また別の記事で、単純パーセプトロンを拡張したアルゴリズムについて紹介していきます。

まずは単純パーセプトロンを理解して、ニューラルネットワークの世界に一歩踏み出しましょう!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次