CHAPTER 2 퍼셉트론
퍼셉트론(perceptron) 알고리즘
- 프랑크 로젠블라트(Frank Rosenblatt) 1957년 고안한 알고리즘
- 신경망(딥러닝)의 기원이 되는 알고리즘
1. 퍼셉트론이란?
다수의 신호를 입력으로 받아 하나의 신호를 출력
(입력: 다수의 신호 -> 출력: 하나의 신호)
*신호: 전류나 강물처럼 흐름이 있는 것
/ 흐름을 만들고 정보를 앞으로 전달(전류: 전선을 타고 흐르는 전자를 내보냄)
퍼셉트론 신호: 흐른다/안 흐른다(1 OR 0)
- 입력 신호: x_1, x_2
- 출력 신호: y
- 가중치: w_1, w_2 (w = weight)
- 뉴런 OR 노드: 원
입력 신호가 뉴런에 보내질 때 각각 고유한 가중치 곱해짐 => w_1x_1, w_2,x_2
뉴런에서 보내온 신호의 총합 > 정해진 한계(임계값, θ(theta, 세타) -> 1 출력 = 뉴런이 활성화 한다
복수의 입력 신호*고유한 가중치
*가중치: 각 신호가 결과에 주는 영향력 조절하는 요소
=> 가중치 ↑ -> 해당 신호 중요 ↑
NOTE
가중치 = (전류에서 말하는) 저항
저항: 전류의 흐름을 억제하는 매개변수/ 저항 ↓ -> 전류 ↑
퍼셉트론의 가중치 값 ↑ -> 신호 ↑
=> 서로 작용하는 방향은 반대, 신호가 얼마나 잘(OR 어렵게) 흐르는가를 통제한다 -> 가중치 = 저항 기능
2. 단순한 논리 회로
진리표: 입력 신호와 출력 신호의 대응 표
퍼셉트론의 구조는 AND, NAND, OR 게이트 모두 똑같음
But, 매개변수(가중치와 임계값)의 값이 다름
1) AND 게이트
입력이 둘, 출력이 하나
두 입력 모두 1 -> 1 출력/ 그외 0
AND 게이트 만족하는 매개변수
(w_1, w_2, θ) = (0.5, 0.5, 0.7) OR (0.5, 0.5, 0.8) OR (1.0, 1.0, 1.0)
x_1, x_2 모두 1 -> 가중 신호의 총합이 주어진 임계값을 웃돎
2) NAND 게이트와 OR 게이트
① NAND 게이트
NAND = Not AND => 출력: AND 게이트의 출력 뒤집은 것
x_1, x_1 모두 1 -> 0 출력/ 그 외 1
NAND 게이트 만족하는 매개변수
(w_1, w_2, θ) = (-0.5, -0.5, -0.7)
=> AND 게이트를 구현하는 매개변수의 부호를 모두 반전
② OR 게이트
입력 신호 중 하나 이상이 1 -> 출력 1
NOTE
인간(컴퓨터X): 진리표의 학습 데이터 -> 매개변수의 값 생각함
기계학습: 매개변수의 값을 정하는 작업 -> 컴퓨터가 자동으로 하도록
학습: 적절한 매개변수 값을 정하는 작업
사람: 퍼셉트론의 구조(모델)를 고민, 컴퓨터에 학습할 데이터를 주는 일
3. 퍼셉트론 구현하기
1) 간단한 구현부터
>>> def AND(x1, x2):
... w1, w2, theta = 0.5, 0.5, 0.7 # 매개변수 함수 안에서 초기화
... tmp = x1*w1 + x2*w2
... if tmp <= theta:
... return 0
... elif tmp > theta: # 가중치 곱한 입력의 총합 > 임계값 -> 1
... return 1
AND(0, 0) # 0을 출력
AND(1, 0) # 0을 출력
AND(0, 1) # 0을 출력
AND(1, 1) # 1을 출력
2) 가중치와 편향 도입
θ -> b로 치환
- 가중치(weight): w_1, w_2
- 편향(bias): b
=> 퍼셉트론
- 입력 신호*가중치 + 편향 < 0 -> 0
- 입력 신호*가중치 + 편향 >= 0 -> 1
>>> import numpy as np
>>> x = np.array([0, 1])
>>> w = np.array([0.5, 0.5])
>>> b = -0.7
>>> w*x
array([ 0., 0.5])
>>> np.sum(w*x)
0.5
>>> np.sum(w*x) + b
-0.19999999999999996 # 약 -0.2 (부동소수점 수에 의한 연산 오차)
- 넘파이 배열끼리의 곱셈: 두 배열의 원소 수 = -> 각 원소끼리 곱함
=> w*x에서 인덱스가 같은 원소끼리 곱함([0, 1] * [0.5, 0.5]) - np.sum() 메서드: 입력한 배열에 담긴 모든 원소의 총합 계산
3) 가중치와 편향 구현하기
AND, NAND, OR는 모두 같은 구조의 퍼셉트론, 차이: 가중치 매개변수의 값
>>> import numpy as np
>>> 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
- 가중치와 편향 도입한 NAND
- -θ -> b로 치환(AND의 theta -> -b)
- 편향 != 가중치 w_1, w_2 기능
- w_1, w_2: 입력 신호가 결과에 주는 영향력(중요도)을 조절하는 매개변수
- 편향: 뉴런이 얼마나 쉽게 활성화(결과: 1 출력)하느냐 조정하는 매개변수
- ex. b = -0.1 -> 각 입력 신호*가중치 값 합 <= 20.0 -> 뉴런 활성화 X
NOTE
편향: 한쪽으로 치우쳐 균형을 깬다
두 입력이 모두 0이어도 결과로 (0이 아닌) 편향 값 출력
>>> import numpy as np
>>> def NAND(x1, x2):
... x = np.array([x1, x2])
... y = 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])
... y = np.array([0.5, 0.5])
... b = -0.2
... tmp = np.sum(w*x) + b
... if tmp <= 0:
... return 0
... else:
... return 1
4. 퍼셉트론의 한계
1) 도전! XOR 게이트
XOR 게이트: 배타적 논리합
*배타적: 자기 외에 거부
x_1과 x_2 중 한쪽이 1 -> 1 출력
OR 게이트의 동작 -> 시각적
ex. 가중치 매개변수 (b, w_1, w_2) = (-0.5, 1.0, 1.0) -> 진리표 만족
직선으로 나뉜 한쪽 영역 -> 1출력/ 다른 한쪽 -> 0 출력
OR 게이트: (x_1, x_2) = (0, 0) -> 0 출력/ (0, 1), (1, 0), (1, 1) -> 1 출력
- 0: 원(○)
- 1: 삼각형(△)
=> 직선 하나로 ○과 △을 나눌 수 X
2) 선형과 비선형
퍼셉트론: (-)직선 하나로 나눈 영역만 표현
- 비선형 영역: 곡선의 영역
- 선형 영역: 직선의 영역
5. 다층 퍼셉트론이 출동한다면
퍼셉트론 -> XOR 게이트 표현 X
퍼셉트론 층 쌓음 -> 다층 퍼셉트론(multi-layer perceptron)
1) 기존 게이트 조합하기
AND, NAND, OR 게이트 조합 -> XOR 게이트
- 입력 신호: x_1, x_2
- 출력 신호: y
x_1과 x_2 -> NAND와 OR 게이트의 입력, NAND와 OR의 출력 -> AND 게이트의 입력
NAND의 출력: s_1, OR의 출력: s_2
2) XOR 게이트 구현하기
>>> def XOR(x1, x2):
... s1 = NAND(x1, x2)
... s2 = OR(x1, x2)
... y = AND(s1, s2)
... return y
XOR(0, 0) # 0을 출력
XOR(1, 0) # 1을 출력
XOR(0, 1) # 1을 출력
XOR(1, 1) # 0을 출력
XOR를 뉴런을 이용한 퍼셉트론으로 표현
XOR: 다층 구조의 퍼셉트론
(왼쪽부터 0츨, 1층, 2층)
- 단층 퍼셉트론: AND, OR
- 2층 퍼셉트론: XOR
=> 다층 퍼셉트론: 층이 여러 개인 퍼셉트론
0층 -> 1층 신호 전달 -> 2층 신호 전달
- 0층의 두 뉴런이 입력 신호를 받아 1층의 뉴런으로 신호를 보낸다
- 1층의 뉴런이 2층의 뉴런으로 신호를 보내고, 2층의 뉴런은 y를 출력한다
2층 퍼셉트론의 동작 ~= 공장의 조립라인
- 1단(1층째) 작업자: 흘러오는 부품 다듬어 일이 완료되면 2단(2층째) 작업자에게 건내줌
- 2단 작업자: 1단 작업자로부터 전달받은 부품 다듬어 완성품으로 만들어 출하(출력)
=> 작업자들 사이에서 부품 전달하는 일 이뤄짐
=> 단층 퍼셉트론으로는 표현하지 못한 것을 층을 하나 늘려 구현
WARNING
가중치 갖는 층: 2개(0층과 1층 사이, 1층과 2층 사이) => 2층 퍼셉트론
6. NAND에서 컴퓨터까지
다층 퍼셉트론: 지금까지 본 회로보다 복잡한 회로 만들 수 O
ex. 덧셈을 처리하는 가산기, 2진수 -> 10진수 변환하는 인코더, 어떤 조건 충족 -> 1 출력 회로(패리티 검사 회로)
컴퓨터: 정보 처리하는 기계
입력 -> 컴퓨터 -> 정해진 방법으로 처리, 결과 출력
NAND 게이트 ~> 컴퓨터 만들 수 있음
*정해진 방법으로 처리: 컴퓨터도 입력과 출력으로 구성된 특정 규칙대로 계산 수행
이론상) 2층 퍼셉트론 -> 컴퓨터 만들 수 있음
2층 퍼셉트론: 비선형인 시그모이드 함수 -> 활성화 함수로 이용 => 임의의 함수 표현 O
컴퓨터 만드는 데 필요한 부품(모듈) 단계적 만들어 감
ㄴAND와 OR 게이트 -> 반가산기와 전가산기 -> 산술 논리 연산 장치(ALU) -> CPU
=> 퍼셉트론 층 거듭 쌓으면 비선형적인 표현 O, 이론상 컴퓨터가 수행하는 처리 기록 O
정리
- 퍼셉트론: 입출력을 갖춘 알고리즘
- 입력 -정해진 규칙-> 값 출력
- 퍼셉트론의 매개변수: 가중치/ 편향
- 퍼셉트론 -> AND, OR 게이트 등의 논리 회로 표현O
- XOR 게이트: 단층 퍼셉트론으로 표현X
- 2층 퍼셉트론 이용 -> XOR 게이트를 표현O
- 단층 퍼셉트론: 직선형 영역만 표현O/ 다층 퍼셉트론: 비선형 영역도 표현O
- 다층 퍼셉트론: (이론상) 컴퓨터를 표현O
출처
https://github.com/WegraLee/deep-learning-from-scratch
'Artificial Intelligence' 카테고리의 다른 글
[혼자 공부하는 머신러닝+딥러닝] Chapter 04 다양한 분류 알고리즘 (0) | 2024.07.25 |
---|---|
[혼자 공부하는 머신러닝+딥러닝] Chapter 03 회귀 알고리즘과 모델 규제 (0) | 2024.07.25 |
[밑바닥부터 시작하는 딥러닝] CHAPTER 1 헬로 파이썬 (0) | 2023.03.28 |
[머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로] 2장 간단한 분류 알고리즘 훈련 (0) | 2023.03.16 |
[머신러닝 교과서 with 파이썬, 사이킷런, 텐서플로] 1장 컴퓨터는 데이터에서 배운다 (1) | 2023.03.16 |