2. 퍼셉트론
페이지 정보
작성자 관리자 댓글 0건 조회 2,249회 작성일 20-02-22 13:14본문
2. 퍼셉트론
퍼셉트론(인공뉴런)
1957년에 고안된 알고리즘
퍼셉트론은 딥러닝(신경망)의 기원이되는 알고리즘
퍼셉트론은 다수의 신호를 입력받아 하나의 신호를 출력한다.
# 여기서 신호는 전류나 물의 흐름을 생각해 볼 수 있다.
# 신호의 흐름을 표현할 때 두가지 값을 갖는데 0, 1의 값을 갖는다.
# 0은 안흐른다. 1은 신호가 흐른다.
[ 퍼셉트론 식 ]
x1, x2는 입력신호, y는 출력신호, w1,w2는 가중치를 의미한다.
(w는 weight을 의미) θ는 임계값(정해진 한계값)
w1*x1 + w2*x2 값이 임계값(θ) 이하 일때는 0을 출력, 임계값보다 클때 1을 출력한다.
가중치가 클수록 해당신호가 강해진다
[논리회로]
* AND 게이트 진리표
입력이 모두 1일때만 1을 출력한다.
퍼셉트론으로 AND게이트를 표현하고자 할 때는
w1, w2, θ 값을 어떤 값으로 설정할 것인지 생각해봐야 한다.
AND게이트를 만족하는 w1, w2, θ의 조합은 무수히 많다.
예>
(w1, w2, θ) -> (0.5, 0.5, 0.8), (1.0, 1.0, 1.0)
*NAND(Not AND) 게이트 진리표
NAND게이트를 표현하기 위한 매개변수의 값
(w1, w2, θ) = (-0.5, -0.5, -0.7)
* OR게이트 진리표
입력신호 중 하나 이상이 1이면 출력이 1이되는 논리 회로
퍼셉트론 표현할 때는 가중치와 임계값을 설정하여 표현할 수 있다.
이 매개변수(w, θ)의 값을 적절히 조절하면 AND, NAND, OR게이트를 모두 표현 가능하다.
실습.
import numpy as np
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.8
tmp = w1*x1+w2*x2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
결과.
[ 가중치와 편향을 도입한 퍼셉트론 식]
* 위의 퍼셉트론 식에서 θ 를 -b로 치환하면
이때 b(bias)를 편향이라고 한다.
퍼셉트론은 입력신호에 가중치를 곱한 값과 편향을 합하여, 그값이
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
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))
결과.
* XOR 게이트 진리표
XOR 게이트는 배타적논리합이라고 한다.
x1과 x2 중 어느 한쪽이 1일 때만 1을 출력하는 논리회로
퍼셉트론으론는 XOR 게이트를 구현 할 수 없다.
직선하나로는 XOR 게이트의 출력을 구분할 수 없다.(구분 불가능)
퍼셉트론(단층 퍼셉트론)은 직선 하나로 나눈 영역만 표현할 수 있다는
한계가 있다.
선형 : 직선의 영역을 선형 영역
비선형 : 곡선의 영역을 비선형 영역
# 다층 퍼셉트론(Multi Layer Perceptron)
* 단층 퍼셉트론으로는 XOR게이트를 표현할 수 없다.
즉, 단층 퍼셉트론으로는 비선형 영역을 분리할 수 없다.
기존 게이트(AND, OR, NAND) 조합하여 층을 쌓으면 XOR 게이트를 구현할 수 있게 된다.
게이트를 조합한 XOR 게이트의 진리표
실습.
# -*- coding: utf-8 -*-
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
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
def XOR(x1,x2):
s1 = NAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))
print("-------------")
print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))
print("------ XOR ---------")
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
결과.
댓글목록
등록된 댓글이 없습니다.