スライドショー

単純パーセプトロンの仕組みと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ゲートのグラフ]

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

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

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

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

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

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

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

まとめ

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

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

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

フクロウ

フクロウ

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説