퍼셉트론을 이해하기 위해, 논리회로를 직접 구현하면서 기초부터 정리했다.
퍼셉트론과 신경망에 앞서, 함수를 구현하기 위해 가장 기본적인 Numpy 라이브러리의 브로드캐스트 기능을 먼저 알아야 한다.
1. Numpy 브로드 캐스트
넘파이 배열(np.array)은 N차원 배열을 작성할 수 있다.
1차원 배열 : 벡터(Vector)
2차원 배열 : 행렬(Matrix)
3차원 배열 : 텐서(Tensor)
넘파이에서는 서로 다른 배열끼리도 계산할 수 있는 브로드캐스팅 기능이 있다.
a = np.array([[3,4],[5,6]])
b = np.array([10,20]) # [10,20],[10,20]의 계산과 동일하게 적용됨
print(a*b)
[[ 30 80]
[ 50 120]]
이 기능을 사용해서 다차원 배열을 가지고 있는 알고리즘을 구현한다.
2. 퍼셉트론 Perceptron
퍼셉트론은 신호가 흐른다/흐르지 않는다(1,0) 의 두가지 값을 가진다.
예를 들어, 입력이 2개인 퍼셉트론의 경우 다음과 같은 그림으로 나타낼 수 있다.

즉, 뉴런에서 보낸 신호의 총합이 특정 한계(임계값, theta)를 넘어서면 1을 출력, 그렇지 않으면 0을 출력하는 함수이다.
함수로 표현하면 다음과 같다. (가중치가 클 수록 해당 입력이 더 중요하다)
가중치 w1,w2 : 각 입력 신호가 결과에 주는 영향력(중요도)를 조절
편향 b : 뉴런이 얼마나 쉽게 활성화 되느냐를 조절
$ y = \begin{Bmatrix}
0 (b + w_{1}x_{1}+ w_{2}x_2 \leq \theta ) \\
1 (b + w_{1}x_{1}+ w_{2}x_2 > \theta \end{Bmatrix} $
2.1. 논리 회로 - AND, OR, NAND 게이트
입력변수를 두개로 가정하고, 게이트에 따라 진리표를 작성해보면 다음과 같다.
AND 게이트 : 두개의 입력변수가 둘다 1일 때, 1
OR 게이트 : 두개의 입력변수 중 하나라도 1일 때, 1
NAND 게이트 : 두개의 입력변수가 둘다 1일 때, 0( AND 게이트 반전)
XOR 게이트 : 두개의 입력변수 중 하나가 1일 때, 1
파이썬으로 구현해보자.
NAND 게이트는 AND 게이트의 반전이므로, 가중치 부호만 다르다.
#%% AND 게이트, OR 게이트
def AND(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
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
def OR(x1, x2):
x = np.array([x1, x2]) # 입력값
w = np.array([0.5, 0.5]) # 가중치
b = -0.2 # 편향
tmp = np.sum(x*w) + b
if tmp <= 0:
return 0
else:
return 1
print(OR(1,0))
print(OR(0,0))
print(OR(0,1))
코드에서 볼 수 있듯이 AND, NAND, OR은 모두 같은 구조의 퍼셉트론이다. 차이는 가중치일 뿐이다.
2.3 XOR 게이트 - 다층 퍼셉트론
하지만, XOR 게이트는 앞서 구현한 세가지의 논리회로를 구현한 방식으로 구현할 수 없다.
XOR 게이트는 배타적논리합 이라는 논리회로이다. 따라서, 기존 구조의 가중치를 조정하는 것만으로 구현할 수 없다.
이것이 단층 퍼셉트론의 한계이다.

퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다.
그림과 같이 XOR(입력 변수 중 하나만 1)게이트를 표현하려면 비선형 영역이 존재해야만 한다.
퍼셉트론은 여러개 겹치는 다층 퍼셉트론으로 앞서 구현한 함수를 가지고 XOR 게이트를 표현할 수 있다.
NAND와 OR 게이트의 진리표를 살펴보자.
| 입력 변수1 (x1) | 입력 변수2(x2) | 출력y(OR) | 출력y(NAND) | 출력(XOR) |
| 0 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 1 | 1 |
| 0 | 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 0 | 0 |
OR게이트와 NAND 게이트를 AND 게이트로 출력하면, XOR 게이트의 출력값이 만들어진다!
층이 하나 더 생겼기 때문에, 아래 그림으로 표현할 수 있다.

코드로 구현하면 다음과 같다.
# %% XOR 배타적논리합 -> 1이 하나일 때만 1 출력
## OR 게이트 처럼 직선 하나로 나누기가 불가능-> 곡선이라면 나눌 수가 있다.
## 따라서, 다층 퍼셉트론으로 층을 하나 더 쌓아서 XOR 게이트를 표현
def XOR(x1,x2):
s1 = NAND(x1, x2)
s2 = OR(x1,x2)
y = AND(s1, s2)
return y
print(XOR(0,0)) # 0
print(XOR(1,0)) # 1
print(XOR(0,1)) # 1
print(XOR(1,1)) # 0'Data Science & AI > Algorithm' 카테고리의 다른 글
| 항등 함수와 소프트맥스 함수 (0) | 2024.09.23 |
|---|---|
| 신경망과 활성화함수 (0) | 2024.09.21 |
| [Algorithm] 자료구조와 알고리즘 - 3. 자료구조 - 스택(Stack) (0) | 2023.09.07 |
| [Algorithm] 자료구조와 알고리즘 - 2. 자료구조 - 큐(Queue) (0) | 2023.09.06 |
| [Algorithm] 자료구조와 알고리즘 - 1. 자료구조 - 선형 리스트 (0) | 2023.09.05 |