2장
2.1 퍼셉트론이란?
2.2 단순 논리 회로
2.3 퍼셉트론 구현하기
2.4 퍼셉트론의 한계
2.5 다층 퍼셉트론이란?
2.1 퍼셉트론이란?
- 다수의 신호를 입력으로 받아 하나의 신호를 출력하는 것
- 인간의 뇌 신경세포를 본 따 만든 알고리즘
- 원 : 뉴런 or 노드
- x : 입력 신호
- y : 출력 신호
- w : 가중치
- θ : 임계값 (한계)
뉴런에서 보내온 신호의 총합이 정해진 임계값(한계)을 넘어설 때만 1 출력 = 뉴런이 활성화한다.
퍼셉트론은 복수의 입력 신호 각각에 고유한 가중치(w) 부여
가중치(w) 는 각 신호가 결과에 주는 영향력을 조절하는 요소로 가중치가 클수록 해당 신호가 그만큼 더 중요함을 의미한다.
기계학습 문제는 이 매개변수의 값을 정하는 작업을 컴퓨터가 하도록 함. 사람은 퍼셉트론의 구조를 고민하고 컴퓨터에 학습할 데이터를 주는 일을 한다.
2.2 단순 논리회로
퍼셉트론을 이용하여 여러 논리회로 구현 가능
( AND, NAND, OR )
- AND 게이트
두 입력이 모두 1일 때만 1을 출력하고, 그 외에는 0 출력
Ex ) (w1, w2, θ) 가 (0.5, 0.5, 0.7) 일 때 만족
x1=0, x2=0 일때 / 0.5*0 + 0.5*0 ≤ 0.7 / y=0
x1=1, x2=0 일때 / 0.5*1 + 0.5*0 ≤ 0.7 / y=0
x1=0, x2=1 일때 / 0.5*0 + 0.5*1 ≤ 0.7 / y=0
x1=1, x2=1 일때 / 0.5*1 + 0.5*1 ≥ 0.7 / y=1
- NAND 게이트
모두 1일 때만 0을 출력, 그 외에는 1 출력
Ex ) (w1, w2, θ) 가 (-0.5, -0.5, -0.7) 일 때 만족
x1=0, x2=0 일때 / -0.5*0 - 0.5*0 ≥ -0.7 / y=1
x1=1, x2=0 일때 / -0.5*1 - 0.5*0 ≥ -0.7 / y=1
x1=0, x2=1 일때 / -0.5*0 - 0.5*1 ≥ -0.7 / y=1
x1=1, x2=1 일때 / -0.5*1 - 0.5*1 ≤ -0.7 / y=0
- OR 게이트
입력 신호 중 하나 이상이 1이면 출력이 1이 되는 논리회로
즉 매개변수(가중치w와 임계값θ)의 값만 적절히 조정하면 세 가지를 만들 수 있다.
2.3 퍼셉트론 구현하기
AND게이트 구현하기
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:
return 1
print(AND(0,0)) #0출력
print(AND(1,0)) #0출력
print(AND(0,1)) #0출력
print(AND(1,1)) #1출력
- 편향 도입
앞에서 구현한 AND게이트는 직관적이고 알기 쉬우나 앞으로를 위하여 다른 방식으로 수정
즉 퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력
import numpy as np
def AND(x1, x2):
x=np.array([x1, x2])
w=np.array([0.5,0.5])
b=-0.7
if(np.sum(x*w)+b) <= 0:
print(0)
else:
print(1)
AND(0,0) #0출력
AND(0,1) #0출력
AND(1,0) #0출력
AND(1,1) #1출력
2.4 퍼셉트론의 한계
그러나 단층 러셉트론으로는 XOR게이트를 구현할 수 없음.
- XOR 게이트
직선으로 나누는 위의 세개의 논리회로와 달리 XOR 게이트는 직선 하나로는 표현이 불가능함.
즉 단일 퍼셉트론으로는 해결이 안돼 -> 다층 퍼셉트론 필요
2.5 다층 퍼셉트론이란?
다층퍼셉트론이란
- 단층 퍼셉트론을 쌓아 만든, 여러 층의 퍼셉트론
- 이를 사용 시 XOR 게이트 구현 가능
XOR 게이트는 NAND, OR, AND를 조합하여 구현 가능하다
즉 비선형적 표현은 선형표현을 조합해서 만들 수 있다.
import numpy as np
def AND(x1, x2):
x=np.array([x1, x2])
w=np.array([0.5,0.5])
b=-0.8
if (np.sum(x * w) + b) <= 0:
return 0
else:
return 1
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.3
if (np.sum(x * w) + b) <= 0:
return 0
else:
return 1
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.8
if (np.sum(x * w) + b) <= 0:
return 0
else:
return 1
def XOR(x1, x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
print(y)
XOR(0,0) #0출력
XOR(0,1) #1출력
XOR(1,0) #1출력
XOR(1,1) #0출력