본문 바로가기

ML

[ML] 딥러닝 1 - 1강 퍼셉트론

※ 본 글은 한경훈 교수님의 머신러닝 강의를 정리, 보충한 글입니다. ※

[딥러닝 I] 1강. 퍼셉트론 - YouTube

 


퍼셉트론이란?

퍼셉트론은 신경 세포 뉴런을 수학적으로 모델링한 초기 인공신경망(Artificial Neural Network)이다.

퍼셉트론은 다수의 입력으로부터 하나의 결과를 도출한다.

퍼셉트론은 뉴런을 모델링한 것이므로, 뉴런의 작동법과 비슷한 방식이 적용된다.

 

뉴런의 작동법

가지 돌기(Dendrite) : 주변 뉴런으로부터 전기신호를 받아들인다.

시냅스(Synapse) : 뉴런의 축삭 말단과 가지 돌기 사이의 공간으로, 전기신호의 세기를 재조정한다.

세포체(Soma, cell body): 가지돌기에서 받은 전기신호들이 합쳐진다.

축삭돌기(Axon) : 세포체의 전위가 일정 이상이면 이웃 뉴런으로 전기신호를 보낸다.

위의 뉴런작동법이 퍼셉트론에도 그대로 적용된다.

 

퍼셉트론의 작동법

  • 뉴런과 마찬가지로 여러 입력으로부터 하나의 결과(1 or 0)를 출력한다.
    ex. 전기가 흐른다 = 1 = True , 전기가 흐르지 않는다 = 0 = False
  • 시냅스에서 신호세기가 재조정되는 것처럼, 고유의 가중치가 입력 신호에 곱해진다.
    이때 가중치가 클수록 해당 신호가 중요함을 의미한다.
  • 가중치(w) * 입력신호(x)의 모든 합이 임계값(theta)을 넘을때만 1을 출력한다.

net 함수 : 모든 입력값과 그에 대응하는 가중치 곱의 총합을 구하는 함수
활성화 함수 : net 값과 임계값 theta를 비교하여 0 또는 1을 출력하는 함수


논리회로를 퍼셉트론으로 구현하기

두 개의 입력이 있는 퍼셉트론을 구현한다면, 각 입력에 대응하는 가중치 w_1, w_2편향 b (bias)를 설정해야 한다.

 

cf. 이때 편향이란, 임계치의 마이너스를 의미한다. -> b = - θ

x1w1 + x2w2 ≤ θ 를 조사하는 것 보다

x1w1 + x2w2 + b ≤ 0를 조사하는 것이 더 직관적이므로 편향 b가 임계치 theta 보다 더 자주 쓰인다.

 

논리회로를 구현하기 위해선 파이썬 numpy의 array, sum 메서드를 사용해야 한다.

array 메서드는 리스트 데이터 타입을 벡터로 바꿔준다.

백터는 연산이 쉽다는 장점이 있다.

ex. 벡터 1 * 벡터 2 ⇒ 좌표끼리의 곱인 벡터 3

sum 메서드는 벡터의 모든 원소의 합을 리턴한다.

 

가중치와 임계값을 설정할 때, 해당 게이트의 기하학적 의미를 생각하면 쉬워진다.

 

AND 게이트

모두 참이어야만 참 출력

(w1, w2, theta) = (0.5, 0.5, 0.7)

# AND
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

inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]
print('AND :')
for x1, x2 in inputs:
   y = AND(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
   
# AND : 
# (0, 0) -> 0
# (1, 0) -> 0
# (0, 1) -> 0
# (1, 1) -> 1

 

NAND 게이트 (not and)

AND 게이트에 not을 붙인 것이므로 가중치, 편향을 음수로 바꾸면 됨.

(w1, w2, theta) = (-0.5, -0.5, -0.7)

# NAND
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

inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]
print('NAND :')
for x1, x2 in inputs:
   y = NAND(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
  
# NAND :
# (0, 0) -> 1
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 0

 

 

OR 게이트

둘 중 하나만 참이더라도 참 출력

(w1, w2, theta) = (0.5, 0.5, 0.2)

# OR
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

inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]
print('OR :')
for x1, x2 in inputs:
   y = OR(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
   
# OR :
# (0, 0) -> 0
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 1

 

XOR 게이트

논리 값이 다를 때만 참 출력

⇒ 단층 퍼셉트론으론 구현할 수 없음

ex. (0,0) -> 0 , (1,0) ->1, (0,1) ->1, (1,1) -> 0


XOR 게이트를 단층 퍼셉트론으로 구현할 수 없는 이유

단층 퍼셉트론으로 구현된 논리 게이트를 기하학적으로 해석하면,

좌표평면 위에 (0,0) (0,1) (1,0) (1,1) 의 점들이 있을 때 직선으로 참과 거짓을 분리하는 작업이다.

XOR 게이트는 직선으로 점들을 분리할 수 없으므로, 다중 퍼셉트론으로 구현되어야 한다.

단층 퍼셉트론은 직선형 영역만 표현할 수 있지만, 다중 퍼셉트론은 비선형 영역도 표현할 수 있다.

 


다중퍼셉트론으로 XOR 구현

AND, NAND, OR의 다중 구조로 XOR 게이트를 구현할 수 있다.

OR과 NAND의 AND 가 XOR 이므로, 아래와 같이 표현할 수 있다.

 

올바른 결과가 나옴.

 

def XOR(x1, x2):
  return AND(NAND(x1,x2), OR(x1,x2))

inputs = [(0, 0), (1, 0), (0, 1), (1, 1)]
print('XOR :')
for x1, x2 in inputs:
   y = XOR(x1, x2)
   print('({x1}, {x2}) -> {y}'.format(x1=x1, x2=x2, y=y))
   
# XOR :
# (0, 0) -> 0
# (1, 0) -> 1
# (0, 1) -> 1
# (1, 1) -> 0

 

'ML' 카테고리의 다른 글

[ML] 딥러닝 1 - 6강 손실함수  (0) 2021.07.23
[ML] 딥러닝 1 - 5강 신경망 구현  (0) 2021.07.23
[ML] 딥러닝 1 - 4강 MNIST  (0) 2021.07.17
[ML] 딥러닝 1 - 3강 인공신경망  (0) 2021.07.14
[ML] 딥러닝 1 - 2강 활성화 함수  (1) 2021.07.13