MachineLearning

【実装あり】パーセプトロンの仕組みを、AIエンジニアが分かりやすく解説

パーセプトロン 仕組み 分かりやすく
パーセプトロンの仕組みを知りたい人
パーセプトロンの仕組みを知りたい人
AIの勉強を始めてパーセプトロンについて学習していきたいんだけど、よく分からないな…。

パーセプトロンの仕組みを分かりやすく解説してくれる記事はないかな…。

この記事では、上記のような悩みを解決していきます。

 

この記事の想定読者

想定している読者は、次のとおりです。

  • AIを勉強している人
  • パーセプトロンが何かわからない人
  • パーセプトロンの仕組みを分かりやすく解説して欲しい人

 

この記事では「パーセプトロンの仕組みを分かりやすく」紹介していきます。

AIを勉強したばかりだと、パーセプトロンが一体なんなのかよく分からないですよね。

実際に、僕自身もAIを勉強したばかりのときは、割と苦労しました。

 

この記事を読み終えれば、パーセプトロンの仕組みが分かるだけでなく、カンタンなPythonの実装ができるようになります。

 

パーセプトロンとは?【仕組みを解説】

パーセプトロン 分かりやすく 仕組み

パーセプトロンは、以下の図のように、複数の信号を入力として、1つの信号を出力するアルゴリズムです。

パーセプトロン 仕組み 分かりやすく

ちなみに、◯で書かれている部分をニューロンとか、ノードとか呼んだりします。

ニューロンっていうのは、脳の神経細胞のことですね。つまり、パーセプトロンや今後学習するようなニューラルネットワークは、「脳の神経細胞を模倣したモデルの作成をしたい」ってことです。

そして「信号」は、流す or 流さないの2つの値になります。

 

先ほどの図で、各ニューロンの信号などに変数を割り当ててあげると、以下のようになりますよね。

  • 入力するときの信号 : \(x_1, x_2\)
  • 出力するときの信号 : \(y\)
  • 入力信号の重要度(重み) : \(w_1, w_2\)

 

重みの考え方

\(w_1, w_2\)で設定している重要度というのは、「この信号の影響を、どれくらい大きくするか?」を決めるものです。

たとえば、週末の休日にMacbookを買うためビッグカメラに行くとしましょう。

 

そのとき、本当にビッグカメラまで行って購入するかどうかは、おおよそ以下のように決められるはずです。

パーセプトロン 仕組み 分かりやすく

天気が晴れなのか雨なのかとか、近いのか遠いのかによって変わってきますよね。

このとき、僕の場合だと距離の問題以前に、天気が雨だと髪型が崩れるので出動したくありません。

 

そうすると、天気が晴れ or 雨というのが重要度が高いってことになりますよね。

これが重み\(w_1, w_2\)の考え方です。

 

そして、ニューロンが出力する信号は流す or 流さない、つまりYES or NOの2択だったので、以下のように0と1を用いて表現できます。

  • 流すとき : 0
  • 流さないとき : 1

 

以上の話を図に落とし込むと、以下のようになるかと思います。

パーセプトロン 仕組み 分かりやすく

さらに、出力信号\(y\)も流す or 流さない、つまり0 or 1が出力されるので、以下のように書けるかと思います。

$$\begin{eqnarray}
y=\left\{ \begin{array}{ll}
0 & (w_1 x_1 + w_2 x_2 \leq \theta) \\
1 & (w_1 x_1 + w_2 x_2 > \theta) \\
\end{array} \right.
\end{eqnarray}$$

このときの\(\theta\)を閾値(しきい値)と呼びます。閾値は、「限界値」のことで、これを超えると1を出力するってことになりますね。

 

パーセプトロンの仕組みとしては、「これだけ」です。

想像以上にあっさりしているかと思います。とはいえ、パーセプトロンはニューラルネットワークの礎になっているので、しっかりおさえておきましょう。

 

パーセプトロンを使った実装【Python使うよ】

パーセプトロン 仕組み 分かりやすく

論理回路を題材として、パーセプトロンを使った簡単な問題を解いていきたいと思います。

 

パーセプトロンを使った実装① : ANDゲート

 

ANDゲートというのは、入力が2つで、出力が1つのゲートです。つまり、先ほどまで考えていたパーセプトロンと、同じ形になっています。

ANDゲートの場合は、2つの入力が1のときだけ1を出力します。表で書くと、以下のとおりです。

\(x_1\)\(x_2\)\(y\)
000
100
010
111

\(x_1, x_2\)の両方が1のときに、出力も\(y=1\)になります。

Macbookをビックカメラへ買いに行く例でいうなら、晴れていて、距離も近いときに「買いに行く」ってことですね。

 

それで、この表を満たすようにパーセプトロンの重み\(w_1, w_2\)と閾値\(\theta\)を決めてあげる必要があります。

この3つのパラメータの選び方ですが、、、無限に選択肢があるかと思います。

たとえば、\((w_1, w_2, \theta)=(0.5, 0.5, 0.7)\)とか選ぶと、ANDゲートを満たせるかと思います。

 

\((w_1, w_2, \theta)=(0.5, 0.5, 0.7)\)のとき

  • \((x_1, x_2, y)=(0, 0, 0)\)のとき : \(0 \leq 0.7\)
  • \((x_1, x_2, y)=(1, 0, 0)\)のとき : \(0.5 \leq 0.7\)
  • \((x_1, x_2, y)=(0, 1, 0)\)のとき : \(0.5 \leq 0.7\)
  • \((x_1, x_2, y)=(1, 1, 1)\)のとき : \(1 > 0.7\)

このように、しっかりとANDゲートを作成できているかと思います。

 

Pythonを使った実装

def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    sum_input = x1*w1 + x2*w2
    if sum_input <= theta:
        return 0
    elif sum_input > theta:
        return 1

print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))

 

このようにすれば、PythonでANDゲートを実装できているかと思います。

 

パーセプトロンを使った実装② : NANDゲート

 

NANDゲートはNot ANDの略になっているので、ANDゲートと逆の挙動になります。

つまり、以下の表のようになってきます。

 

\(x_1\)\(x_2\)\(y\)
001
101
011
110

この場合には、\((w_1, w_2, \theta)=(-0.5, -0.5, -0.7)\)とかを選んであげれば、NANDゲートの実装ができるかと思います。

※なおNANDゲートは、ANDゲートと逆の挙動になるので、ANDゲートを実現するパラメータに-(マイナス)をつけてあげればオッケイです。

 

パーセプトロンを使った実装③ : ORゲート

 

ORゲートは、入力信号のうち1つでも1があれば、出力も1になるゲートです。

表で書くと、以下のとおりですね。

\(x_1\)\(x_2\)\(y\)
000
101
011
111

ORゲートに関しても、\((w_1, w_2, \theta)=(0.5, 0.5, 0.2)\)とかを選んであげればオッケイかと思います。

 

さらに : パーセプトロンにバイアスを追加して実装

 

パーセプトロンを実現していた、以下の式がありました。

$$\begin{eqnarray}
y=\left\{ \begin{array}{ll}
0 & (w_1 x_1 + w_2 x_2 \leq \theta) \\
1 & (w_1 x_1 + w_2 x_2 > \theta) \\
\end{array} \right.
\end{eqnarray}$$

そして、こちらの式は以下のように書き換え可能ですよね。

$$\begin{eqnarray}
y=\left\{ \begin{array}{ll}
0 & (w_1 x_1 + w_2 x_2  + b \leq 0) \\
1 & (w_1 x_1 + w_2 x_2  + b > 0) \\
\end{array} \right.
\end{eqnarray}$$

つまり、\(- \theta = b\)にしてあげた感じです。そして、この\(b\)のことを「バイアス」と呼びます。

 

つまり、「重みを考慮した入力」と「バイアス」が0を超えるか否かを考えれば良いということになります。

これをANDゲートで、Pythonを使って実装するのであれば、以下のようになります。

def AND(x1, x2):
    w1, w2, b = 0.5, 0.5, -0.7
    sum_input = x1*w1 + x2*w2 +b
    if sum_input <= 0:
        return 0
    elif sum_input > 0:
        return 1

print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))

おそらく、コードで見ると分かりやすいのかなと思いますね。

 

NumPyが分かる方向け

import numpy as np

def AND(x1, x2):
    x = np.array([x1, x2])
    w = np.array([w1, w2])
    b = -0.7
    sum_input = np.sum(w*x) + b
    if sum_input <= 0:
        return 0
    elif sum_input > 0:
        return 1

print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))

こちらでも可です。

というか、NumPyが分かるのであれば、今後のためにもこちらを推奨します。

 

まとめ : パーセプトロンの仕組みを分かりやすく解説

 

というわけで、パーセプトロンの仕組みを分かりやすく解説していきました。

パーセプトロンはニューラルネットワークの礎になる部分なので、しっかりとおさえておくと良いのかなと思います。

 

今回はブログ記事にて、AI関連の知識を書かせてもらいましたが、YouTubeでも配信しています。

文章とか苦手で動画で学習したいという方は、YouTubeにて見ていただけると良いのかなと。

もちろんYouTubeを使っているので、無料で閲覧OKです。

≫YouTubeチャンネルにてAIを勉強する

 

それでは、この辺で。

 

参考文献

 

おすすめの記事