본문 바로가기
데이터 과학 관련 스터디/모두의 딥러닝

[모두의 딥러닝] 6장/7장 단층, 다층 퍼셉트론

by inhovation97 2020. 6. 1.

 

 

 

6장부터는 신경망의 이해라는 큰 챕터로 들어섭니다. 드디어 인공지능, 딥러닝에 대해 한 발짝 다가가는 거예요~

어떻게 인공지능이 21세기 최근에서야 발전하고 핫해졌는지 마주쳤던 한계들과 이를 극복했던 방법도 나옵니다. 그 방법론이 바로 다층 퍼셉트론 이거든요~

 

 

 

 

 

<인공 지능의 출발>

 

'AI(Artificial Intelligence)' 어떻게 컴퓨터로 인간의 지능을 구현해 낼 수 있을까요? 이는 인간의 뇌 구조와 굉장히 비슷합니다. 인간의 뇌는 약 천억 개의 뉴런으로 이루어져서 각각의 뉴런은 자극을 받고 그 자극이 어느 정도의 임계값을 넘기면 다음 뉴런으로 전달합니다.(임계값을 넘기지 못하면 아무것도 하지 않아요.) 이렇게 계속 수많은 뉴런으로 뻗어나가 인간은 지능을 가지고 생각을 하게 되죠.

AI는 바로 여기서 출발합니다. 자극을 받아 임계값이 넘어가면 전달하는 뉴런은 바로 우리가 전에 배운 로지스틱 함수의 구조와 매우 유사하다고 볼 수 있어요!

우리는 로지스틱 함수를 이용하는 퍼셉트론을 생성하고, 이를 여러 겹 만들어 인간의 뇌 구조와 비슷하게 구현합니다. 이게 바로 인공 신경망 (Artificial Neural Network)입니다. 퍼셉트론은 인공 신경망에 있어서 가장 작은 기본단위가 되는 것입니다. 하나의 퍼셉트론 안에는 활성화 함수가 있어야 합니다. 위에서 말씀했듯이 퍼셉트론은 로지스틱 회귀를 이용한 분류 알고리즘이라고 했어요. 그래서 활성화 함수는 "시그모이드 함수" 함수들을 이용해서 가중합의 결과로 1 또는 0의 출력 값을 내놓습니다. 하지만 여기서 문제가 발생합니다.

 

 

 

 

 

 

<초기 퍼셉트론의 한계점과 해결>

 

아래 평면 위에 검은 점과 흰점을 독립시키는 하나의 직선을 그을 수가 있나요? 아무리 그어도 그런 직선은 없을 거예요.

AND, OR는 가능하지만 XOR에서 한계에 부딪친 거죠. 

이 문제를 'XOR 문제'라고 칭하며 이때 AI의 겨울이라고 불리는 인공지능의 침체기가 다가옵니다. 

,

10여 년의 침체기 끝에 XOR문제를 해결할 수 있었습니다. 바로 퍼셉트론 층을 추가시키는 '다층 퍼셉트론'입니다.

그림을 보면 보통 이런 것은 넌센스 퀴즈에서나 볼 법한 것인데 고정관념에 사로잡혀 10여 년 동안이나 침체기를 겪었던 것이죠. 아래 사진처럼 평면을 휘어주기 위해 퍼셉트론을 여러 개를 이용해서 공간을 왜곡시키는 것입니다.

이렇게 퍼셉트론 사이에 은닉층을 넣어주는 것입니다. 아마도 함수가 두 번 쓰이면서 파라미터도 많아지면서 좀 더 구조가 복잡해지고, 차원이 높아지는 것 같은데(뇌피셜) 책에 자세한 수식은 나와있지 않아요... 궁금해서 책 관련 말고 다른 포스팅으로 수식까지 파헤쳐 보고 싶네요!

각설하고! 이렇게 퍼셉트론을 다층으로 만들면서 한계점에도 해결하고 AI(Artificial Intelligence) 실현에 한 층 더 가까워지게 된 것이죠.

 

 

 

 

 

<퍼셉트론 설계>

 

다층 퍼셉트론은 입력층 은닉층 출력층으로 설계합니다. 아래 사진은 그 도식이구요.

입력값에서 4개의 가중치와 2개의 바이어스를 생성하면, 그것이 은닉층에서 n1, n2값을 이루고, 다시 2개의 가중치와 1개의 바이어스를 n1, n2와 조합해 최종적인 출력값을 생성합니다. (σ <- 이 기호는 활성화 함수 시그모이드 함수를 표현하는 것입니다.)

아래 표를 보면 n1에서는 AND 게이트의 반대 NAND 게이트가 출력됐고, n2에서는 OR게이트가 마지막 출력값에서는 XOR 게이트가 출력된 것을 보아 드디어 XOR 문제가 해결됨을 확인할 수 있어요! (설명이 빈약하긴 하지만요...)

 

 

 

 

 

<XOR 문제해결with 코딩>

import numpy as np

w11=np.array([-2,-2])
w12=np.array([2,2])
w2=np.array([1,1])
b1=3
b2=-1
b3=-1

def MLP(x, w, b):
    y = np.sum(w * x)+b
    if y<= 0 :
        return 0
    else :
        return 1

 # NAND 게이트
def NAND(x1,x2):
    return MLP(np.array([x1,x2]),w11,b1)
 # OR 게이트
def OR(x1, x2):
     return MLP(np.array([x1,x2]),w12,b2)
 # AND 게이트
def AND(x1,x2):
     return MLP(np.array([x1,x2]),w2,b3)
 # XOR 게이트                                -> NAND,OR 게이트의 결과를 AND 게이트에 넣으면 됨.
def XOR(x1,x2):
     return AND(NAND(x1,x2),OR(x1,x2))

 # x1, x2 값을 번갈아 대입하며 최종값 출력
if __name__=='__main__':
      for x in[(0,0),(1,0),(0,1),(1,1)]:
         y = XOR(x[0],x[1])
         print("입력값:" + str(x) + "출력값:"+str(y))
        

특별한 코딩은 아니고 위의 게이트 표를 그저 파이썬으로 구현한 겁니다. 결과는 당연히 마지막 XOR 게이트의 결과가 나옵니다.

댓글