今回は、ディープラーニングの基本である「パーセプトロン」について解説します。
パーセプトロンはディープラーニングの起源となっているため、パーセプトロンの仕組みを理解することは、これからディープラーニングを学ぶ上で重要になります。
動画で詳しく学習したい方はこちらもおすすめ
パーセプトロンとは

パーセプトロンは、1950〜60年代にフランク・ローゼンブラットによって提案されたアルゴリズムです。
パーセプトロンは、複数の入力に対し、2値(0 or 1)を出力します。
各入力に重みをかけ、合計がある閾値を超えるかどうかで出力を決定します。
式にすると以下の通りです。
\[ y = \begin{cases}0 & w_1 x_1 +w_2 x_2 < \theta \\1 & w_1 x_1 +w_2 x_2 \geq \theta\end{cases} \]
\(x\) : 入力
\(w\) : 重み
\(\theta\) : 閾値
\(y\) : 出力
上記式の\(\theta\)を\(-b\)に置き換えると以下の式に変更できます。
\[ y = \begin{cases}0 & w_1 x_1 +w_2 x_2 + b < 0 \\1 & w_1 x_1 +w_2 x_2 + b \geq0\end{cases} \]
\(b\) : バイアス
入力値と重みをかけた値とバイアスの和が0未満であれば0を出力し、0以上であれば1を出力します。

Python実践 パーセプトロン
論理回路を使用しパーセプトロンを実装してみましょう!
AND回路
まずはAND回路を実装してみます。
AND回路の入力と出力の関係は以下の通りです。
入力 | 出力 | |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
この関係をPythonを使用し、出力します。
x1 = [0, 1, 0, 1]
x2 = [0, 0, 1, 1]
# AND回路
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.8
tmp = np.sum(w*x) + b
if (tmp <= 0):
return 0
else:
return 1
# 論理回路を出力値を出力する関数
def result(func):
for i in range(4):
y = func(x1[i], x2[i])
print(f"{x1[i]}, {x2[i]} = {y}")
# AND回路の出力結果を出力
result(AND)
実行結果
0, 0 = 0
1, 0 = 0
0, 1 = 0
1, 1 = 1
OR回路
続いて、OR回路を実装してみます!
OR回路の入力と出力の関係は以下の通りです。
入力 | 出力 | |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
この関係をPythonを使用し、出力します。
基本的にはAND回路と同様、バイアス\(b\) のみ異なります。
x1 = [0, 1, 0, 1]
x2 = [0, 0, 1, 1]
# OR回路
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if (tmp <= 0):
return 0
else:
return 1
# 論理回路を出力値を出力する関数
def result(func):
for i in range(4):
y = func(x1[i], x2[i])
print(f"{x1[i]}, {x2[i]} = {y}")
# OR回路の出力結果を出力
result(OR)
実行結果
0, 0 = 0
1, 0 = 1
0, 1 = 1
1, 1 = 1
パーセプトロンの限界
パーセプトロンでバイアスや重みを変更し、出力を簡単に変えることできました。
ただし、パーセプトロンにも限界があり、パーセプトロンでは実現できない出力があります。
それがXOR回路などの「非線形」の問題です。非線形の出力は単純なパーセプトロンでは実現できません。
これを解決するためにこれから紹介する「多層パーセプトロン」が使用されます。
多層パーセプトロン
多層パーセプトロンは、パーセプトロンを多層化したもので、以下のように構成されています。
- 入力層
- 隠れ層
- 出力層
隠れ層がこれまでの単純なパーセプトロンにはなかった層になります。
層を増やすことにより、非線形の出力を実現できるのです。

Python実践 多層パーセプトロン
Pythonを使用し、非線形の論理回路である「XOR回路」を実装してみましょう!
XOR回路
さっそくXOR回路を実装します。
XOR回路は「AND回路」、「OR回路」、「NAND回路」を組み合わせることで実現します。
入力 | 隠れ(OR) | 隠れ(NAND) | 出力(AND) | |
---|---|---|---|---|
0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 1 | 0 | 0 |
この関係をPythonを使用し、出力します。
AND/OR/NAND回路の関数を作成し、それらを組み合わせて出力します。
x1 = [0, 1, 0, 1]
x2 = [0, 0, 1, 1]
# AND回路
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.8
tmp = np.sum(w*x) + b
if (tmp <= 0):
return 0
else:
return 1
# NAND回路
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.8
tmp = np.sum(w*x) + b
if (tmp <= 0):
return 0
else:
return 1
# OR回路
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w*x) + b
if (tmp <= 0):
return 0
else:
return 1
# XOR回路
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
# 論理回路を出力値を出力する関数
def result(func):
for i in range(4):
y = func(x1[i], x2[i])
print(f"{x1[i]}, {x2[i]} = {y}")
# XOR回路の出力結果を出力
result(XOR)
実行結果
0, 0 = 0
1, 0 = 1
0, 1 = 1
1, 1 = 0
まとめ
ディープラーニングの基本であるパーセプトロンを解説しました。
パーセプトロンは、入力に対し重みを付け、それを足し合わせて、その値がある閾値を超えるかどうかで出力を決定するアルゴリズムです。
また、単純なパーセプトロンだけでは実現できない非線形の問題に使用する多層パーセプトロンを合わせて紹介しました。
層を増やすことで、非線形などの問題にも対応できるようになりました。
ここまで読んでくださりありがとうございます。