ABOUT ME

dokylee🐥
Try to do something fun everyday :)

Today
Yesterday
Total
  • [NLP] 딥러닝의 기원이 되는 알고리즘 : 퍼셉트론 Perceptron
    ML/NLP 2020. 3. 3. 04:21

     

     

     

     

     

    퍼셉트론이 뭔데?


    퍼셉트론은 딥러닝의 기원이 되는 알고리즘이라고 한다! 그러면 그게 뭘까?

     

    퍼셉트론여러 신호를 입력으로 받아 하나의 신호를 출력하는 것을 의미한다.

     

     

    즉, 입력이 여러 개가 들어가면 퍼셉트론 안에서 쭉쭉 흘러가다가 하나의 출력이 띡! 하고 나오는 거다.

     

    그리고 나오는 출력은 0 (못 흘러간다!) 아니면 1 (잘 흘러간다~) 두 가지로 나뉜다.

     

     

    퍼셉트론 = " 인풋 여러 개 -> 아웃풋 한 개 "

     

     

     

     

     

    그래서 그 퍼셉트론이 어떻게 생긴 건데!


    퍼셉트론을 눈으로 보자.

    [Figure 1]

    [Figure 1]은 입력 2개, 출력 1개의 퍼셉트론이다.

     

    x1, x2, y 가 입출력 값이라는 건 알겠다.

     

    하지만 w1, w2는 처음 볼 것이다. 이건 바로 가중치라는 거다~!

     

     

    그림의 원을 뉴런 혹은 노드라고 부르는데, 입력 신호가 동그라미 뉴런들을 거쳐 흘러갈 때는

     

    각각의 길에 정해져있는 고유한 가중치가 곱해져서 넘어간다.

     

     

    그렇게 흘러흘러 뉴런들이 보내 준 신호의 총합이 정해진 한계(임계값, θ)를 넘어설 때만 '1'을 출력한다.

     

    퍼셉트론의 동작 원리는 이게 다이다. (대박)

     

     

     

     

     

     

    퍼셉트론을 수식화 해보자 (멋있다)


    위에서 설명한 대로 퍼셉트론을 수식으로 나타내보자.

     

    [Figure 1]
    [Figure 2]

     

    [Figure 2] 와 같다. 

     

    해당 퍼셉트론은 2개의 입력 신호 x1, x2에 대해 각각 w1, w2 라는 가중치를 곱한 후 그 값이 θ보다 커야 1이 된다.

     

     

    그리고 하나 더 알 수 있는 사실은, 가중치의 크기가 클 수록 그 길을 타고 오는 입력값이 결과에 주는 영향력이 커진다.

     

    만약에 가중치가 w1=3, w2=1 이어서 x1, x2는 각각 3, 1 씩 곱해져서 출력으로 흘러간다고 하자.

     

    이때 총 2번의 입력이 띡!(x1, x2) 띡!(x1, x2) 하고 들어갈 거다.

     

     

    그리고 그때 x1첫번째 입력이 1이었다가 두 번째 입력은 3이 되었다고 하자. 그러면 입력으로 따지면 2라는 숫자가 늘어난 건데,

     

    길을 따라 흘러간 후 y=w1x1+w2x2로 합쳐질 때, w1*x1 쪽은 3*1 -> 3*3이 된거니까 총 6이라는 숫자가 늘어나게 된다.

     

    x2도 똑같이 처음에는 1이었다가 3이 되었다고 하자. 얘도 입력으로 따지면 2라는 숫자가 늘어난 건데,

     

    길을 따라 흘러간 후 y=w1x1+w2x2로 합쳐질 때, w2*x2 쪽은 1*1 -> 1*3이 된거니까 총 2라는 숫자가 늘어난다.

     

     

    자! x1, x2는 같이 흘러가는 데도 불구하고 y에 주는 영향력이 x1는 6이고 x2는 2이다. 

     

    즉, 가중치(w)가 클 수록, 거기에 입력되는 인풋(x)이 더 중요해짐을 뜻한다.

     

     

     

     

     

     

     

    논리 회로(AND, NAND, OR) 퍼셉트론으로 구현하기


    • AND 게이트
    x1 x2 y
    0 0 0
    1 0 0
    0 1 0
    1 1 1

     

      e.g. 

     

     

     

     

    ㄴ> w1, w2, θ 에 들어갈 수 있는 수는 여러 가지 경우가 있다. 그중, 0.5 0.5 0.7 로 python을 이용한 구현을 해보자.

     

     

     

     

    def AND(x1, x2):
        w1, w2, theta = 0.5, 0.5, 0.7
        tmp = w1*x1 + w2*x2
        if tmp <= theta:
            return 0
        else:
            return 1
    
    print(AND(0,0), AND(1,0), AND(0,1), AND(1,1))

    [Out] 0 0 0 1

     

     

     

     

     

     

     

     

     

     

    ㄴ> 이렇게 생긴 수식을 구현 완료함

    하지만 앞으로를 생각해서 다른 방식으로 수정할 거다.

     

     

     

     

     

     

     

     

    ㄴ> 이렇게 수정함! θ를 -b로 치환하여 이렇게 변함

     

     

     

     

    두 가지 식은 기호 표기만 바꿨을 뿐, 그 의미는 같다.

    그리고 여기서 b를 편향(bias)라고 한다.

     

    수정한 수식 관점에서 해석해보면,

    퍼셉트론은 입력 신호에 가중치를 곱한 값과 편향을 합하여, 그 값이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력한다.

     

     

    수정한 수식으로 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

     

     

    이렇게 편향의 개념이 도입됐다.

     

    편향은 가중치와 가능이 다르다.

     

    w1, w2는 각 입력 신호가 결과에 주는 영향력(중요도)를 조절하는 매개변수고,

     

    편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 조정하는 매개변수이다.

     

    만약 위에서 b가 -0.7이 아니고 -100이었다면, 활성화되기가 더욱 힘들었을 거다.

     

     

     

    추가적으로 NAND, OR 게이트도 구현해보자.

     

    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

     

    AND, NAND, OR 는 모두 같은 구조의 퍼셉트론이고, 차이는 가중치 매개변수의 값뿐이다.

     

     

     

     

     

     

     

    퍼셉트론의 한계


    XOR 게이트는 AND, NAND, OR 와 같은 퍼셉트론으로는 구현 못한다.

     

     

     

     

     

     

     

    ㄴ> 이 수식을 통해 OR 게이트를 x1, x2를 축으로 가지는 평면의 직선으로 나타내면

     

     

     

     

     

     

     

     

     

     

     

     

     

    ㄴ> 이와 같다. 초록색은 출력 '1' 을 의미하고, 주황색은 '0' 출력을 의미한다.

        

     

     

     

     

    그런데, XOR은?

    • XOR
    x1 x2 y
    0 0 0
    1 0 1
    0 1 1
    1 1 0

     

     

     

     

     

     

     

     

     

     

     

    ㄴ> 직선으로 나눌 수가 없다. 곡선이 필요해진다.

     

     

     

    즉, 퍼셉트론은 직선 하나로 나눈 영역만 표현할 수 있다는 한계가 있다. 위와 같은 곡선의 영역은 표현할 수 없다.

     

    (덧붙여서 곡선의 영역을 비선형 영역, 직선의 영역을 선형 영역이라고 한다.)

     

     

     

     

     

     

    다층 퍼셉트론이 출동한다면?


    퍼셉트론으로는 XOR 게이트를 표현할 수 없었다. 하지만 퍼셉트론의 층을 하나 더 쌓는다면 가능해진다.(다층 퍼셉트론이라 칭함)

     

    기존에 단층 퍼셉트론으로 만들었던 AND, NAND, OR 게이트를 조합해서 XOR을 만들어보자.

     

     

     

     

     

     

     

     

     

     

    ㄴ> 이거면 구현 가능해진다.

     

     

    python으로도 구현해보자

    def XOR(x1, x2):
        s1 = NAND(x1, x2)
        s2 = OR(x1, x2)
        y = AND(s1, s2)
        return y
        
    print(XOR(0,0), XOR(1,0), XOR(0,1), XOR(1,1))

    [Out] 0 1 1 0

     

     

     

     

     

    XOR 게이트를 뉴런을 이용한 퍼셉트론으로 표현하면 아래와 같다.

     

     

     

     

     

     

     

     

     

     

     

    ㄴ> AND, NAND, OR 퍼셉트론과 달리, XOR는 2층 퍼셉트론이다.

     

     

     

    이처럼 층이 여러 개인 퍼셉트론을 다층 퍼셉트론이라 하며, XOR은 2층 퍼셉트론으로 표현이 가능하다.

     

     

     

     

     

    정리해보자


    • 퍼셉트론은 입력이 여러 개, 출력이 하나인 알고리즘이다.
    • 퍼셉트론의 매개변수는 가중치와 편향이다.
    • 단층 퍼셉트론으로 AND, NAND, XOR 등의 논리 회로 표현 가능하다.
    • XOR 게이트는 2층 퍼셉트론(다층 퍼셉트론)으로 표현할 수 있다. 단층은 안됨.
    • 단층 퍼셉트론은 직선형 영역만 표현할 수 있고, 다층 퍼셉트론은 비선형 영역도 표현 가능하다.
    • 다층 퍼셉트론은 (이론상) 컴퓨터를 표현할 수 있다고 한다...(짱)

     

     

     

     

    Source

    밑바닥부터 시작하는 딥러닝 1
    국내도서
    저자 : 사이토 고키 / 이복연(개앞맵시)역
    출판 : 한빛미디어 2017.01.03
    상세보기

    댓글

dokylee's Tech Blog