퍼셉트론 (Perceptron)
프랑크 로젠블라트가 1957년 고안한 알고리즘
퍼셉트론이 신경망(딥러닝)의 기원이 되는 알고리즘이기 때문에 공부가 필요
- 여기서 기술하는 퍼셉트론은 ‘인공 뉴런’ 혹은 ‘단순 퍼셉트론’ 의미.
- 퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호를 출력.
- 퍼셉트론 신호는 ‘흐른다/안 흐른다(1 or 0)’의 두 가지 값을 가질 수 있음
입력이 2개인 퍼셉트론
- x1, x2 : 입력신호
- y : 출력 신호
- w1, w2 : 가중치
- 그림의 원 : 뉴런 혹은 노드라고 부름
뉴런에서 보내온 신호의 총합이 정해진 한계를 넘어설 때만 1을 출력하고,
그 한계를 임계값이라 하며, Θ (세타)로 표현합니다.
퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치를 부여하며,
가중치가 클수록 해당 신호가 그만큼 더 중요함을 뜻합니다.
단순한 논리회로
현재 예시는 사람이 직접 매개변수의 값을 정하지만, 기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 자동으로 하도록 합니다.
'학습'이란 적절한 매개변수 값을 정하는 작업이며, 사람은 퍼셉트론의 구조(모델)를 고민하고 컴퓨터에 학습할 데이터를 주는 일을 합니다.
AND 게이트
- 입력이 둘이고 출력은 하나
- 두 입력이 모두 1일 때만 1을 출력, 그 외에는 0을 출력
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
AND 게이트를 퍼셉트론으로 표현 만족하는 매개변수 조합은 무한히 많습니다.
이를 위해서는 진리표대로 작동하도록 하는 w1, w2, Θ의 값을 정하면 됩니다.
예를 들면 (w1, w2, Θ)가 (0.5 0.5 0.7) or (0.5 0.5 0.8) or (1.0 1.0 1.0)라고 하면
x1과 x2 모두가 1일 때만 가중 신호의 총합이 주어진 임계값을 웃돌게 됩니다.
NAND 게이트
- Not AND
- AND 게이트의 출력을 뒤집은 것입니다.
- AND 게이트를 구현하는 매개변수의 부호를 모두 반전하기만 하면 NAND 게이트가 됩니다.
x1 | x2 | y |
0 | 0 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
OR 게이트
- 입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리 회로
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
중요한 점은 퍼셉트론 구조는 AND, NAND, OR 게이트 모두에서 똑같다는 것입니다.
세 가지 게이트에서 다른 것은 매개변수(가중치와 임계값)의 값뿐,
똑같은 구조의 퍼셉트론이 매개변수의 값만 적절히 조정하여 AND, NAND, OR 게이트로 사용할 수 있습니다.
퍼셉트론 구현
- Θ를 -b로 치환
- b : 편향(bias)
- 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력) 하느냐를 조정하는 매개변수
- w1, w2 : 가중치(weight)
- 각 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
문맥에 따라 셋 다 가중치라고 표현하기도 함
def AND(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 <= 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(w*x) + 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(w*x) + b
if tmp <= 0:
return 0
else:
return 1
퍼셉트론의 한계
XOR 게이트
- 배타적 논리합이라는 논리 회로 ('배타적'이란 자기 외에는 거부한다는 의미)
- x1과 x2 중 한쪽이 1일 때만 1을 출력
x1 | x2 | y |
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
지금까지 본 퍼셉트론(단순 퍼셉트론)으로는 이 XOR 게이트를 구현할 수 없습니다.
단순 퍼셉트론의 경우는 직선 하나로 각 출력의 영역을 구분하는데 XOR은 직선 하나로 구분이 불가합니다.
직선 하나로는 구분할 수 없지만, '직선'이라는 제약을 없앤다면 가능합니다.
단순 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있습니다.
단순 퍼셉트론은 위의 그림 같이 곡선(비선형)을 표현할 수 없습니다.
다층 퍼셉트론
층을 쌓아 다층 퍼셉트론을 만들 수 있습니다.
다층 퍼셉트론을 활용하면 위의 한계를 해결할 수 있습니다.
기존 게이트를 조합해서 XOR 게이트를 만들 수 있습니다.
그중 하나의 예시는 앞서 만든 AND, NAND, OR 게이트를 조합해서 하는 방법이 있습니다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
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 |
진리표로 XOR가 잘 구현되었나 확인해봤습니다.
위에서 구현한 XOR의 퍼셉트론은 2층 퍼셉트론입니다.
문헌에 따라서는 구성 층의 수를 기준으로 3층 퍼셉트론이라 하는 경우도 있습니다.
이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 합니다.
위의 다층 퍼셉트론의 동작은 다음과 같습니다.
- 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다
- 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다
퍼셉트론은 층을 쌓아(깊게 하여) 더 다양한 것을 표현할 수 있고 비선형 영역도 표현 가능합니다.
Reference
본 글은 '밑바닥부터 시작하는 딥러닝'을 참고하여 작성했습니다.
'Data Science > Deep Learning' 카테고리의 다른 글
[DL] 오차역전파법(Backpropagation) (2) | 2022.03.08 |
---|---|
[DL] 신경망 학습 (0) | 2022.03.04 |
[DL] 손실함수 (Loss Function) : 오차제곱합(SSE), 교차 엔트로피 오차(Cross-Entropy) (0) | 2022.03.04 |
[DL] 신경망(Neural network) (0) | 2022.02.25 |
[DL] 신경망 활성화 함수 - 시그모이드(sigmoid), ReLU, 계단함수 (0) | 2022.02.25 |
댓글