---
title: 【ゼロから作るDeep Learning 】2.4~2.7
tags: 
author: [京都大学人工知能研究会KaiRA](https://convert.docswell.com/user/kyoto-kaira)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/DJYG4449JM.jpg?width=480
description: 【ゼロから作るDeep Learning 】2.4~2.7 by 京都大学人工知能研究会KaiRA
published: May 02, 24
canonical: https://convert.docswell.com/s/kyoto-kaira/K1JD32-2024-05-02-220907
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/DJYG4449JM.jpg)

2024年度前期輪読会#2「ゼロから作るDeep Learning」
2章 パーセプトロン 2.4～2.7
京都大学総合人間学部 4回生
白石拓海
2024/05/02
0


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V7NGYYYDE8.jpg)

2. 便利なテンプレ集
目次
● パーセプトロンの限界
• パーセプトロンとR^2平面内の直線
• XORゲート
● 多層パーセプトロン
• パーセプトロンの組み合わせ
• パーセプトロンの実装の抽象化（脱線）
• https://github.com/takumi-shrsh/KaiRA-reading-2024/
tree/main/week02
● NAND論理の完全性
• AND, OR, NOTによる表現
• NANDからAND, OR, NOTを作る
1


# Page. 3

![Page Image](https://bcdn.docswell.com/page/YJ9WPPP8J3.jpg)

パーセプトロンの限界
2


# Page. 4

![Page Image](https://bcdn.docswell.com/page/GJ8NDDDZED.jpg)

パーセプトロンの限界／パーセプトロンとR^2平面内の直線
パーセプトロンの式
パーセプトロン（ゲート）
y = 0 (b + w1*x1 + w2*x2 &lt;= 0)
y = 1 (b + w1*x1 + w2*x2 &gt;= 0) … (3.2)
● b, w1, w2
•
•
•
●
x1, x2
•
•
●
値は実数
bをバイアス、w1, w2を重みと呼んだ
定数：(x1, x2より先に)定めておく数
値は0または1
(独立)変数：値を取り得る範囲内で変えてみる数
y
•
•
値は0または1
従属変数：x1, x2の変化に応じた変化を見る数
3


# Page. 5

![Page Image](https://bcdn.docswell.com/page/LJLPMMM1ER.jpg)

パーセプトロンの限界／パーセプトロンとR^2平面内の直線
R^2平面内の直線
R^2平面内の直線の方程式
a*x1 + b*x2 + c = 0
● a, b, cを決めると、直線が1つ定まった
● 直線はR^2平面全体を2つの領域A0, A1に分ける
• 点(x1, x2)が a*x1 + b*x2 + c &lt; 0 [&gt; 0]を満たす
⇔点(x1, x2)はA0[A1]内にある
• ただしここでは、c&lt;0とし原点(0, 0)を含む方の領域をA0とした
x2
A0
A1
O
x1
4


# Page. 6

![Page Image](https://bcdn.docswell.com/page/47M4YYY5EW.jpg)

パーセプトロンの限界／パーセプトロンとR^2平面内の直線
パーセプトロンと直線が作る領域との対応
パーセプトロン（ゲート）
y = 0 (b + w1*x1 + w2*x2 &lt;= 0)
y = 1 (b + w1*x1 + w2*x2 &gt;= 0)
R^2平面内の直線によって作られる2つの領域A0, A1と点xの包含関係
x ∈ A0 (a*x1 + b*x2 + c &lt; 0)
x ∈ A1 (a*x1 + b*x2 + c &gt; 0)
パーセプトロン(ゲート)の定義域(変数x1, x2がとる値の範囲)を
{0, 1}(0または1)からR(実数全体)へと拡張して考えると、
パーセプトロンは、直線w1*x1+w2*x2+b=0に対応する。
すなわち、パーセプトロンに与えると0[1]を返す点(x1, x2)の集合は、
直線w1*x1+w2*x2+b=0が作るA0[A1]内の点(x1, x2)の集合に一致する
5


# Page. 7

![Page Image](https://bcdn.docswell.com/page/P7RW999ZE9.jpg)

パーセプトロンの限界／XORゲート
XORゲートについて
XORゲート（排他的論理和）
x1
x2
y
0
0
0
1
0
1
0
1
1
1
1
0
左表を満たすパーセプトロンは存在するか？
パーセプトロンのx1, x2の取り得る値を
実数全体へと拡張し、直線と対応させて考える
R2平面を、
点(0, 0), (1, 1)を含む領域と
点(1, 0), (0, 1)を含む領域
に分ける直線は存在するか？
6


# Page. 8

![Page Image](https://bcdn.docswell.com/page/PJXPQQQ1EX.jpg)

パーセプトロンの限界／XORゲート
XORゲートに対応する直線は存在しない
直観的に条件を満たすような直線は存在しないと分かる。
x2
(0, 1)
証明）
背理法によって示す。
条件を満たすような直線
ax1 + bx2 + c = 0 が存在すると仮定する。
このとき次の条件が成り立つ。
(1, 1)
c &gt; 0, a + c &lt; 0, b + c &lt; 0, a + b + c &gt; 0
または
c &lt; 0, a + c &gt; 0, b + c &gt; 0, a + b + c &lt; 0
(1, 0)
O
x1
7


# Page. 9

![Page Image](https://bcdn.docswell.com/page/3JKD999M7D.jpg)

パーセプトロンの限界／XORゲート
XORゲートに対応する直線は存在しない（2）
(1, 1)
c &gt; 0 のとき、
a+c &lt; 0, b+c &lt; 0, a+b+c &gt; 0 が成り立ち、
前の2式から a+b+2c &lt; 0 が導ける。
このときc &gt; 0より、
0 &lt; a+b+c &lt; a+b+2c &lt; 0
となるがこれは矛盾。
(1, 0)
c &lt; 0 のときも同様に矛盾が生じる。
よって背理法により
条件を満たす a, b, c は存在しない。
すなわち条件を満たす直線は存在しない。
x2
(0, 1)
O
x1
2つの集合{(0, 0), (1, 1)}と{(1, 0), (0, 1)}は
線形分離不可能であるという。
8


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LE3RWWW275.jpg)

パーセプトロンの限界／XORゲート
XORゲートを表現する領域を作る曲線
2つの直線や、1つの曲線であれば分けられる。
→どのように表現するか？
9


# Page. 11

![Page Image](https://bcdn.docswell.com/page/8EDYKKK6EG.jpg)

多層パーセプトロン
10


# Page. 12

![Page Image](https://bcdn.docswell.com/page/V7P6KK3ZJ8.jpg)

多層パーセプトロン／パーセプトロンの組み合わせ
パーセプトロンの出力を別のパーセプトロンに入力する
パーセプトロンは、2つの入力を受け取り、1つの出力を返す関数であった。
あるパーセプトロンの出力を、そのまま別のパーセプトロンの入力にする
ことを考える。（→「層を重ねる」という）
x1
P1
s1
P
x2
P2
y
s2
s1 = P1(x1, x2)
s2 = P2(x1, x2)
y = P(s1, s2)
11


# Page. 13

![Page Image](https://bcdn.docswell.com/page/2JV3VV4MEQ.jpg)

多層パーセプトロン／パーセプトロンの組み合わせ
XORゲートの表現
層を重ねることにより、単層の（1つの）パーセプトロンでは表現出来なかった
XORゲートを表現できる！
x1
x2
s1
s2
y
0
0
1
0
0
1
0
1
1
1
0
1
1
1
1
1
1
0
1
0
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
数学的表現
NAND, OR, AND:{0, 1}^2 → {0, 1}によって、
合成関数XOR:{0, 1}^2 → {0, 1}を次のよう定める。
XOR(x1, x2) := AND(NAND(x1, x2), OR(x1, x2))
注）ｆ:{0, 1}^2 → {0, 1}は、
ｆが2つの0または1を受け取り、
0または1を返す関数であるということを表す。
12


# Page. 14

![Page Image](https://bcdn.docswell.com/page/5EG3LL1X7L.jpg)

多層パーセプトロン／パーセプトロンの組み合わせ
XORによる分類の図示
XOR(x1, x2) = AND(NAND(x1, x2), OR(x1, x2))
AND
両方で赤い点は赤、
他は青で。
1層目(NAND, OR)でよって境界を定め、
2層目(AND)で境界の選び取り方を決めている。
注）ANDは{0, 1}しか受け取らないため、
ANDのパラメータは、1層目で定まった境界の
選び方にしか関係しない。
パラメータ
b
w1
w2
NAND
0.7
-0.5
-0.5
OR
-0.2
0.5
0.5
13


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4JQ5YYD57P.jpg)

多層パーセプトロン／パーセプトロンの組み合わせ
多層パーセプトロンについての注
重みを持つ層は実質2層(第0層と第1層の間と第1層と第2層の間)なので、
2層のパーセプトロンと呼ぶ。
文献によっては、3層のパーセプトロンと呼ぶこともある。
x1
s1
P1
y
P
x2
第0層
P2
s2
第1層
第2層
14


# Page. 16

![Page Image](https://bcdn.docswell.com/page/K749WWZVE1.jpg)

多層パーセプトロン／パーセプトロンの実装の抽象化（脱線）
パーセプトロンのコードを書くことの解釈
パーセプトロンのコードを書くことは、
b, w1, w2∈Rを変数として、
「x1, x2∈{0, 1}を変数として、y∈{0, 1}を返す関数」を書いている
とも考えられる。
ほとんど同じ！
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0,5])
b = 0.7
tmp = np.sum(w * x) + b
if tmp &lt;= 0:
return 0
else:
return 1
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 &lt;= 0:
return 0
else:
return 1
15


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LJ1KYYR47G.jpg)

多層パーセプトロン／パーセプトロンの実装の抽象化（脱線）
単層パーセプトロンを抽象化した関数
b, w1, w2∈Rを変数として、
「x1, x2∈{0, 1}を変数として、y∈{0, 1}を返す関数」
を作るための関数perceptronを作る。
def perceptron(x1, x2, w1, w2, b):
return int(x1 * w1 + x2 * w2 + b &gt; 0)
def NAND(x1, x2):
return perceptron(x1, x2, -0.5, -0.5, 0.7)
本質だけ与えれば十分
def OR(x1, x2):
return perceptron(x1, x2, 0.5, 0.5, -0.2)
def AND(x1, x2):
return perceptron(x1, x2, 0.5, 0.5, 0.7)
16


# Page. 18

![Page Image](https://bcdn.docswell.com/page/GJWDGG1Z72.jpg)

多層パーセプトロン／パーセプトロンの実装の抽象化（脱線）
単層パーセプトロンのクラス
perceptronという設計図をもとに個々のパーセプトロンを作る。
→classの使いどころ
class SimplePerceptron():
def __init__(self, w1, w2, b):
self.w1 = w1
self.w2 = w2
self.b = b
def apply(self, x1, x2):
return int(x1 * self.w1 + x2 * self.w2 + self.b &gt; 0)
AND = Perceptron(0.5, 0.5, -0.7)
print(AND.apply(1, 1)) #使い方が変わるので注意
17


# Page. 19

![Page Image](https://bcdn.docswell.com/page/4EZGLLPLJ3.jpg)

多層パーセプトロン／パーセプトロンの実装の抽象化（脱線）
クラスについて（Pythonの基礎）
classという設計図をもとに作られた個々のものを「インスタンス」という。
インスタンスは、「インスタンス変数」(定数：予め定めておく数)と、
「インスタンスメソッド」（インスタンス変数を用いる関数）を持つ。
インスタンスがどのようなインスタンス変数とインスタンスメソッド
を持つか決める(あるいは示す)のがclassの役割。
class SimplePerceptron():
def __init__(self, w1, w2, b):
self.w1 = w1
self.w2 = w2
self.b = b
def apply(self, x1, x2):
return int(x1 * self.w1 + x2 * self.w2 + self.b &gt; 0)
AND = SimplePerceptron(0.5, 0.5, -0.7)
print(AND.apply(1, 1)) #使い方が変わるので注意
18


# Page. 20

![Page Image](https://bcdn.docswell.com/page/Y76YWWMMEV.jpg)

多層パーセプトロン／パーセプトロンの実装の抽象化（脱線）
二層パーセプトロンのクラス
class TwoLayersPerceptron(Perceptron):
def __init__(self, p1, p2, p3):
self.p1 = p1
self.p2 = p2
self.p3 = p3
def apply(self, x1, x2):
s1 = self.p1.apply(x1, x2)
s2 = self.p2.apply(x1, x2)
return self.p3.apply(s1, s2)
NAND = SimplePerceptron(-0.5, -0.5, 0.7)
OR = SimplePerceptron(0.5, 0.5, -0.2)
AND = SimplePerceptron(0.5, 0.5, -0.7)
XOR = TwoLayersPerceptron(NAND, OR, AND)
print(XOR.apply(1, 0))
さらに2層のパーセプトロンもclassにする。
Perceptronのインスタンスを3つ
（定数として）予め受け取り、
「x1, x2という2つの変数を受け取り、
1つの出力を返すインスタンスメソッドを持つ
インスタンスを作るクラスを書いた。
注）Perceptronというclassを
SimplePerceptronと
TwoLayersPerceptronの
親クラス(interface的)とするために作った
XORは、SimplePerceptronのインスタンス
NAND, OR, ANDから作られる
TwoLayerPerceptronのインスタンス！
19


# Page. 21

![Page Image](https://bcdn.docswell.com/page/G75GMMZQ74.jpg)

多層パーセプトロン／パーセプトロンの実装の抽象化（脱線）
多層パーセプトロンの例
classを駆使すれば、このような複雑なパーセプトロンも書きやすくなる！
コード：https://github.com/takumi-shrsh/KaiRA-reading-2024/tree/main/week02
20


# Page. 22

![Page Image](https://bcdn.docswell.com/page/9J2Y99RWJR.jpg)

NAND論理の完全性
21


# Page. 23

![Page Image](https://bcdn.docswell.com/page/DEYG44D9EM.jpg)

NAND論理の完全性／AND, OR, NOTによる表現
n変数パーセプトロン
n個の0または1を受け取り、0または1を返す関数{0, 1}^n → {0, 1}を考える。
入力のパターンは2^n通りあり、各パターンで0を返すか1を返すかが
関数ごとに決まっているので、考えうる関数は2^(2^n)個ある。
これらすべてAND, OR, NOTゲートを重ね合わせることで表現出来る！！
2^n
x1
x2
xn
y
0
0
…
0
0または1
1
0
…
0
0または1
0
1
…
0
0または1
2
×
2
×
= 2^(2^n)
……
…… …… …… ……
1
1
…
1
……
0または1
×
2
22


# Page. 24

![Page Image](https://bcdn.docswell.com/page/VJNGYY6D78.jpg)

NAND論理の完全性／AND, OR, NOTによる表現
AND, OR, NOTの表現力
x1
x2
x3
y
0
0
0
1
1
0
0
0
0
1
0
0
1
1
0
1
0
0
1
0
1
0
1
1
0
1
1
1
1
1
1
0
例えばn=3として、左表のような値を取る関数を考える。
y=1となる行に着目し、
その行のx1, x2, x3を
1のときはそのまま、0のときはNOTをつけて
ANDで繋ぐ。そして各行の論理式をORで繋ぐ。
今回の場合、(￢x1∧￢x2∧￢x3)∨(x1∧x2∧￢x3)∨
(x1∧￢x2∧x3)∨(￢x1∧x2∧x3)となる。
（ただしANDを∧、ORを∨、NOTを￢で表した。）
これは左表の値通りの値を返す。
このような論理式をDNF（論理和標準形）という。
3個以上の∧および∨の連なりは、AND(AND(x1, x2), x3)
のようにすると、ゲートの重ね合わせで表現出来る。
あるいは、3個以上の入力を受け取るパーセプトロンを考えれば、
2層で任意の関数を表現出来るといえる。
23


# Page. 25

![Page Image](https://bcdn.docswell.com/page/YE9WPPL8E3.jpg)

NAND論理の完全性／NANDからAND, OR, NOTを作る
NANDからAND, OR, NOTを作る
AND, OR, NOTで任意の関数{0, 1}^n → {0, 1}を表現出来ることが分かった。
ここでさらに、NANDでAND, OR, NOTを表現出来ることをみる。
NOT(x) = NAND(x, x)
AND(x1, x2) = NAND(NAND(x1, x2), NAND(x1, x2))
= NOT(NAND(x1, x2))
OR(x1, x2) = NAND(NAND(x1, x1), NAND(x2, x2))
= NAND(NOT(x1), NOT(x2))
このことから、NANDだけでも任意の関数{0, 1}^n → {0, 1}を表現出来ることが分かる。こ
のNANDの性質をNAND論理の完全性という。
24


# Page. 26

![Page Image](https://bcdn.docswell.com/page/GE8NDDXZ7D.jpg)

NAND論理の完全性／NANDからAND, OR, NOTを作る
NANDからAND, OR, NOTを作る（2）
NOT(x) = NAND(x, x)
AND(x1, x2) = NAND(NAND(x1, x2), NAND(x1, x2)) = NOT(NAND(x1, x2))
OR(x1, x2) = NAND(NAND(x1, x1), NAND(x2, x2)) = NAND(NOT(x1), NOT(x2))
NOT(x1)
NOT(x2)
NAND(x1, x1) NAND(x2, x2)
AND(x1, x2)
OR(x1, x2)
NOT(NAND(x1, x2))
NAND(NOT(x1), NOT(x2))
x1
x2
NAND(x1, x2)
0
0
1
1
1
0
0
1
0
1
0
1
0
1
0
1
1
1
0
0
1
1
1
0
0
0
1
1
NOR(x1, x2) := NOT(OR(x1, x2))も完全性を持つ
NOT(x) = NOR(x, x)
AND(x1, x2) = NOR(NOR(x1, x2), NOR(x1, x2)) = NOR(NOT(x1), NOT(x2))
OR(x1, x2)= NOT(NOR(x1, x2)) = NOR(NOR(x1, x2), NOR(x1, x2))
25


# Page. 27

![Page Image](https://bcdn.docswell.com/page/LELPMM817R.jpg)

2. 便利なテンプレ集
まとめ
2変数単層パーセプトロンは、R^2空間内の向きを込めたある直線に対応する
まとめ１
→n変数ならR^n空間内の超平面 → 線形領域しか表現出来ない
多層パーセプトロンは、R^2空間内の有限個の点を任意の2組に分割できる
まとめ２
→理論上は、R^n空間内の有限個の点を任意のm組に分割できるらしい
NAND回路だけで任意の関数{0, 1}^n → {0, 1}を表現出来る
まとめ３
→コンピュータも作れるらしい
26


# Page. 28

![Page Image](https://bcdn.docswell.com/page/4JM4YY657W.jpg)

27


