[밑시딥1_1] 퍼셉트론 AND, NANA, OR, XOR 논리회로 표현하기
본 포스팅은 수원대학교 한경훈 교수님의 강의 딥러닝1을 바탕으로 학습한 내용입니다.
퍼셉트론
- 프랑크 로젠플라트(Frank Rosenblatt)가 1957년에 고안안 알고리즘으로 신경망(딥러닝)의 기원이 되는 알고리즘임
- 다수의 신호(흐름이 있는)를 입력으로 받아 하나의 신호를 출력. 퍼셉트론은 이 신호를 입력으로 받아 ‘흐른다(0)/안 흐른다(1)’이라는 정보를 앞으로 전달
- 위의 그림에서
-
$x_1$과 $x_2$는 입력 신호, $y$는 출력 신호, $w_1$과 $w_2$는 가중치(weight)를 의미
-
원을 뉴런(혹은 노드)라고 부름
-
입력 신호가 뉴런에 보내질 때, 각각 고유한 가중치가 곱해진다.($w_1$$x_1$, $w_2$$w_2$)
-
뉴런에서 전달 받은 신호의 총합이 임계값 $\theta$를 넘을 때만 1을 출력
-
수식으로 표현하면
\[y=\begin{cases}0&(w_1x_1+w_2x_2 \leq \theta) \\\ 1&(w_1x_1+w_2x_2 > \theta) \end{cases}\]
-
- 퍼셉트론은 복수의 입력 신호 가각에 고유한 가중치를 부여. 가중치는 각 신호가 결과에 주는 영향력을 조절하는 요소로 작용하며, 가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻함
AND 게이트
- AND 게이트는 입력이 모두 1일 경우에만 출력이 1이 됨
- 위의 표는 AND 게이트의 진리표이며, 퍼셉트론으로 표현으로 $w_1, w_2, \theta$는 아래와 같을 때 만족
코드
"file name : and_gate.py"
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5]) # (가중치) w1: 0.5, w2: 0.5
b = -0.7
tmp = np.sum(x*w)+b
if tmp <= 0:
return 0
else:
return 1
if __name__ == "__main__":
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + '-->' + str(y))
NAND 게이트
- NAND 게이트는 Not AND를 의미하며, AND 게이트의 반대를 출력
- 퍼셉트론으로 표현은 아래와 같음
코드
"file name : nand_gate.py"
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(x*w)+b
if tmp <= 0:
return 0
else:
return 1
if __name__ == "__main__":
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]
y = NAND(xs[0], xs[1])
print(str(xs) + '-->' + str(y))
OR 게이트
- 입력 신호 중 하나 이상이 1이면 1을 출력
- 퍼셉트론으로 표현은 아래와 같음
코드
"file name : or_gate.py"
import numpy as np
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
if __name__ == "__main__":
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
XOR 게이트
- 위의 게이트들은 선형으로만 표현이 가능할 뿐 비선형에 대한 문제는 풀 수 없음
- XOR 게이트는 비선형 문제에서 사용
- 입력 신호 중 하나라도 다르면 1, 둘다 같으면 0
- AND(NAND게이트의 결과값, OR게이트의 결과값)로 표현할 수 있음
코드
"file name : xor_gate.py"
from and_gate import AND
from nand_gate import NAND
from or_gate import OR
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
댓글남기기