비둘기 둥지

[인공지능 기초 / python] 1. 퍼셉트론 본문

인공지능 공부/기초 개념

[인공지능 기초 / python] 1. 퍼셉트론

KimDove 2022. 4. 17. 17:21
728x90

1. 퍼셉트론

  • 다수의 신호를 입력받아 하나의 신호를 출력
  • 신경망의 기본 단위 정도로 생각하면 될 것 같다. 
  • 이미지에서 Xn은 입력신호, Wn은 가중치, Y는 출력신호이다.  

[그림 1] 퍼셉트론 도식

  • 입력신호(Xn)가 뉴런에 보내질 때 각각 고유한 가중치(Wn)가 곱해짐
  • 뉴런에서 보내온 신호의 총합이 임계값을 넘길 때 뉴런이 활성화 된다.
    [그림 2] 퍼셉트론 수식

  • 퍼셉트론은 복수의 입력 신호 각각에 고유한 신호를 부여한다.
  • 이 가중치가 클 수록 해당 신호가 그만큼 더 중요하다는 의미임.

예제) 퍼셉트론 예제 - 논리 회로 구현하기

a. AND 게이트

  • 두 개의 입력이 1일 때만 1을 출력하는 논리 회로
x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

b. NAND (Not AND) 게이트

  • AND게이트의 출력결과를 뒤집어 두 개의 입력이 1일 때만 0을 출력하는 논리 회로

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

c. OR 게이트

  • 두 개의 입력이 0일 때만 0을 출력하는 논리 회로
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

d. 논리회로 퍼셉트론 구현

## AND 게이트 구현 코드
def AND(x1, x2):
    
    ## 가중치와 임계값
    w1, w2, theta = 0.5, 0.5, 0.7
    temp = x1*w1 + x2*w2
    
    output = lambda x: 1 if x > theta else 0
    return output(temp)

print(f'x1 : {0}, x2: {0}, output : {AND(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {AND(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {AND(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {AND(1, 1)}')

## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 0
x1 : 0, x2: 1, output : 0
x1 : 1, x2: 1, output : 1

(!) 편향의 도입

[그림 3] 편향을 도입한 퍼셉트론의 수식

  • 가중치 w는 각 입력신호가 결과에 주는 영향력을 조절하는 매개변수
  • 편향 b는 뉴런(노드)이 얼마나 쉽게 활성화 되는지 조절하는 매개변수

e. g)

(1) b = -0.7인 경우  
→ 가중합(w1*x1 + w2*x2 + ... + wn*xn)이 0.8 이상이어야 활성화 됨.  

 

(2) b = 20인 경우  
→ 가중합(w1*x1 + w2*x2 + ... + wn*xn)이 21 이상이어야 활성화 됨.

import numpy as np

## 편향을 추가한 AND 게이트
def AND_w_bias(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    
    b = -0.7
    ## temp = x[0]*w[0] + x[1]*w[1] + b와 동일
    temp = np.sum(w*x) + b
    output = lambda x: 1 if x > 0 else 0
    
    return output(temp)
    
print(f'x1 : {0}, x2: {0}, output : {AND_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {AND_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {AND_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {AND_w_bias(1, 1)}')

## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 0
x1 : 0, x2: 1, output : 0
x1 : 1, x2: 1, output : 1
## 편향을 추가한 NAND 게이트
def NAND_w_bias(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    
    b = -0.7
    ## temp = x[0]*w[0] + x[1]*w[1] + b와 동일
    temp = np.sum(w*x) + b
    output = lambda x: 1 if x < 0 else 0
    
    return output(temp)

print(f'x1 : {0}, x2: {0}, output : {NAND_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {NAND_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {NAND_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {NAND_w_bias(1, 1)}')

## 출력 결과
x1 : 0, x2: 0, output : 1
x1 : 1, x2: 0, output : 1
x1 : 0, x2: 1, output : 1
x1 : 1, x2: 1, output : 0
def OR_w_bias(x1, x2):
    x = np.array([x1, x2])
    w = np.array([0.5, 0.5])
    
    b = -0.2
    ## temp = x[0]*w[0] + x[1]*w[1] + b와 동일
    temp = np.sum(w*x) + b
    
    output = lambda x: 1 if x > 0 else 0
    return output(temp)

print(f'x1 : {0}, x2: {0}, output : {OR_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {OR_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {OR_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {OR_w_bias(1, 1)}')

## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 1
x1 : 0, x2: 1, output : 1
x1 : 1, x2: 1, output : 1

1-1. 퍼셉트론의 한계

  • AND, NAND, OR 게이트는 단층 퍼셉트론만으로 구현이 가능하였으나,  
    XOR 게이트는 단층 퍼셉트론으로는 구현할 수 없다.

a. XOR 게이트

  • 입력 x1, x2 둘 중에 하나만이라도 1인 경우에 1을 출력하는 논리 회로
x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 0
  • AND, NAND, OR 게이트의 경우 선형(직선 1개)으로 0과 1의 경계를 구분할 수 없지만,
    XOR 게이트의 경우 선형으로 0과 1의 경계를 구분 할 수 없다.
  • 이런 경우에 단층 퍼셉트론을 조합하여 다층 퍼셉트론으로 만들어 구현할 수 있다.
  • XOR은 (x1 OR x2) AND (x1 NAND x2)로 표시할 수 있다.

(1) x1 OR x2

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

(2) x1 NAND x2

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

(3) (x1 OR x2) AND (x1 NAND x2)

x1 x2 y
0 1 0
1 1 1
1 1 1
1 0 0
#### a. XOR 게이트 구현

def XOR_w_bias(x1, x2):
    s1 = OR_w_bias(x1, x2)
    s2 = NAND_w_bias(x1, x2)
    return AND_w_bias(s1, s2)

print(f'x1 : {0}, x2: {0}, output : {XOR_w_bias(0, 0)}')
print(f'x1 : {1}, x2: {0}, output : {XOR_w_bias(1, 0)}')
print(f'x1 : {0}, x2: {1}, output : {XOR_w_bias(0, 1)}')
print(f'x1 : {1}, x2: {1}, output : {XOR_w_bias(1, 1)}')

## 출력 결과
x1 : 0, x2: 0, output : 0
x1 : 1, x2: 0, output : 1
x1 : 0, x2: 1, output : 1
x1 : 1, x2: 1, output : 0

99. 자료 출처

99-1. 도서

  • 한빛 미디어 | 밑바닥부터 시작하는 딥러닝

99-2.웹 사이트

  • 하얀종이 개발자 | 딥러닝에서 가중치(W), 편향(Bias)의 역할 [블로그 링크]

99-3. 데이터 셋


전체코드

 

GitHub - EvoDmiK/TIL: Today I Learn

Today I Learn. Contribute to EvoDmiK/TIL development by creating an account on GitHub.

github.com


내용 추가 이력


부탁 말씀

개인적으로 공부하는 과정에서 오류가 있을 수 있으니, 오류가 있는 부분은 댓글로 정정 부탁드립니다.


728x90

'인공지능 공부 > 기초 개념' 카테고리의 다른 글

[인공지능 기초 / python] 2. 신경망  (0) 2022.04.17
Comments