まるっとワーク

データ分析・電子工作など気になることを残していきます

人工ニューロンについて


ディープラーニングについて学習を始めたので、関連するアルゴリズムであるパーセプトロンについて説明していきたいと思います。

目次


ニューロンと人工ニューロンとは

パーセプトロンの前に、本アルゴリズムのモデルとなったニューロンについてまとめます。
ニューロンは神経系を構成する基本単位であり、体の中で情報の伝達に使われいる。
人工ニューロン(形式ニューロン)とは、それを模擬したものであり、1943年にウォーレン・マカロックとウォルター・ピッツが発表した。

人工ニューロンの仕組み

人工ニューロンは、パーセプトロンとも呼ばれる。
構造はとてもシンプルで、複数の入力に対して0 か1を出力するだけのもの

人工ニューロンの構造

人工ニューロン1つ の構造は以下の通り。

図:入力が2つの人工ニューロン(単純パーセプトロン)の構造
f:id:toku_dango:20211204160553p:plain

  • 入力(x): パーセプトロンに入力される値
  • 重み(w): 入力値に乗算される値
  • バイアス(b): 出力値を調整する値
  • 出力(y): 出力値(パーセプトロンでは0か1で出力される)

図の〇はニューロン, ノードと呼ばれる。

人工ニューロンの動作

実際に人工ニューロンでどういう計算がなされているかを説明します。
上の図で示した人工ニューロンの動作を式で表すと以下の通りです。


・人工ニューロン

y = x1×w1+x2×w2 + b×1\\
=\sum_{}X^TW
人工ニューロン1個の式を見ると、線形モデルと同じ式であることがわかるかと思います。
かなりシンプルな構造ですね。

上記計算だと、出力値が0, 1に固定されていない状態なので、しきい値:Thを設けて以下条件指定が入ったものが人工ニューロンの動作になります。
 
y
= \left\{ \begin{array}{}
0 & (y<=Th)\\
1 & (y>Th)
\end{array} \right.

単純な論理回路の設計

人工ニューロンの活用例として、簡単な論理回路を作成してみます。

簡単な実装

表:ANDゲートの真理値表

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1


これをpythonにて実装する。

def AND(x1, x2, b):
    w1, w2, theta = 0.5, 0.5, 1
    temp = x1*w1+x2*w2+b*1
    if temp <= theta:
        return 0
    elif temp > theta:
        return 1
    
AND(0,0,0)#出力0
AND(1,0,0)#出力0
AND(0,1,0)#出力0
AND(1,1,0)#出力1

期待通りの出力が得られています。
同様にORゲート, NANDゲートは作成できるので、ここでは割愛します。

作成できる論理回路の限界

上記の通り、論理回路を実装することができたのですが、排他的論理和XORだけは実装ができません。
実際にグラフを作成してその理由を確認します。

表:XORゲートの真理値表

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0


これを図で示すと以下の通りです。

図:人工ニューロンの可視化
f:id:toku_dango:20211204171333p:plain

  • 赤丸:1が出力する
  • 青四角:0が出力する

しきい値の例を黒線で示し、黒線からx1, x2軸側の範囲が0出力領域、それ以外を1出力領域とする

これを上記通り出力しようとしても、しきい値は線形的にしか引くことができない為不可能。
これに対応するためには、非線形な線でしきい値を設定する、複数の直線で切り分ける方法があります。

ただ、論理回路の作り方に詳しい人はご存じの通り、XORゲートも複数の論理回路の組み合わせで表現が可能です。
これは上記で述べた後者の方法になります。前者の方法は今後説明していくとして、人工ニューロンを組み合わせる(多層にする)考え方でXORゲートを実装することができます。
つまり、人工ニューロンの組み合わせでXORゲートような少し複雑なパターンも表現できるということです。
※層を複数に重ねた人工ニューロンを多層パーセプトロンということがあります。

グラフ出力用のコード

import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(5, 5))
x1_0 = [0, 1]
x2_0 = [0, 1]
x1_1 = [0, 1]
x2_1 = [1, 0]
plt.scatter(x1_0, x2_0, marker=",")
plt.scatter(x1_1, x2_1, marker="o", color="red")
plt.plot([-1, 1.5], [1.5,-1], color="black")

plt.xlim(-1,3)
plt.ylim(-1,3)
plt.xlabel("x1")
plt.ylabel("x2")


まとめ

今回は人工ニューロンについて、まとめました。
人工ニューロンはシンプルなアルゴリズムでしたが、組み合わせによって非線形的な表現も可能であり、ディープラーニングの根幹となる技術となります。

  • 人工ニューロンは、入力・出力・重み・バイアスにて表現され、入力と重みを乗算してバイアスを加算したものと、設定したしきい値との関係により、出力が決定される線形的なアルゴリズム
  • 人工ニューロンを多層にすることで、より複雑な表現が可能となる