본문 바로가기
파이썬 (Python)/딥러닝 (Deep Learning)

Python 딥러닝 퍼셉트론 이론 및 XOR 문제 해결 코드 구현

by ★√★ 2021. 6. 13.

안녕하세요, 이번 포스팅은 딥러닝에서 가장 기초이자 근간이 되는 퍼셉트론 이론 및 XOR 문제 해결을 위한 코드 구현에 대해서 설명드리도록 하겠습니다. 퍼셉트론은 모델을 만들 때 필요한 기울기와 y절편을 이용하여 모델을 만들고 출력 값을 뽑아내는 중간 매체라고 생각하시면 됩니다. 

 

퍼셉트론

퍼센트론
퍼셉트론

: 위에서 설명 드린대로 입력 값이 주어지고 기울기와 y절편에 따라 출력 값을 뽑아내는 것이 퍼셉트론입니다. 즉 모델을 통해서 입력 값에 따른 출력 값을 뽑아내는 것입니다. 제가 기 포스팅한 내용 중에 기울기와 y절편이라는 애기를 많이 하였습니다. 그런데 여기 퍼 셉트로 인에서는 가중합과 바이어스라는 용어를 씁니다.

 

▼가중합은 w, 바이어스는 b 로 표현을 하며, 가중합은 제가 설명한 기울기, 바이어스는 y절편을 얘기하는 것입니다. 똑같은 개념이라고 생각하시면 됩니다. 이전 포스팅 중에 최근에 쓴 포스팅을 첨부하니 관련 모델 구현하는 것을 먼저 보고 오시면 더 도움이 되실 겁니다. 

 

 

Python 딥러닝 로지스틱 회귀 (시그모이드 함수)

 안녕하세요 이번 포스팅은 Python에서 딥러닝에 사용하는 방법인 선형 회귀에 이어 로지스틱 회귀에 대해서 설명 및 코드를 구현을 통해서 어떻게 딥러닝을 하는지에 대해서 설명드리도록 하겠

davey.tistory.com

 

 퍼셉트론 이론은 1957년 코넬 항공 연구소의 프랑크 로젠블라트라는 사람이 이 개념을 고안해 발표하고 여러기에 퍼셉트론이라는 이름을 붙였다고 합니다. 이 퍼셉트론은 그 후 여러 학자들의 노력을 통해 인공 신경망, 오차 역전파 등의 발전을 거처 지금의 딥러닝으로 이어지게 되었다고 합니다. 

 

 사실 딥러닝 or AI 라는 단어를 보시면 우리 사람의 머리의 뇌세포와 뉴런의 작동 원리를 기반으로 고안한 것입니다. 즉 인간의 뇌에 존재하는 뉴런이라는 구조를 여기 딥러닝에 적용을 한 것입니다. 여기에서 이 퍼셉트론은 이 인공 신경망을 구성하는 기본 요소입니다. 즉 뉴런과 뉴런이 서로 새로운 연결을 만들기로 하고 필요에 따라 위치를 바꾸는 것처럼, 여러층의 퍼셉트론을 서로 연결시키고 복잡하게 조합하여 주어진 입력 밧에 대한 판단을 하게 하는 것 그것이 바로 신경망의 기본 구조입니다.

 

XOR 문제 해결 코드 구현하기, 다중 퍼셉트론

 

: 그럼 위에서 설명한 퍼셉트론을 이용해서 XOR 문제를 해결하는 코드를 구현해보도록 하겠습니다. 여기에서 어떤 분들은 왜 XOR 문제를 해결하는 코드를 구현해야 하는지에 대해서 의문을 가질 것입니다. 왜냐하면 옛날 딥러닝을 공부하시고 개발하시던 개발자 분들이 가장 난해하고 해결하지 못한 문제였기 때문입니다. 좀 더 자세히 들여다보면 인공지능 분야의 선구자였던 MIT 마빈 민스키 교수가 1969년에 발표한 퍼셉 트론즈라는 논문이 이 문제에 발단이 되었습니다. 즉 딥러닝을 통해서 어느 정도는 우리가 생각하는 것이 구현될 것이라고 생각하였지만 정말 단순한 XOR 문제조차도 해결할 수가 없었다고 합니다. 이로 인해 중간에 딥러닝 연구가 침체기를 겪었다고 합니다.

 

▼ 하지만 계속적인 연구 끝에 이를 해결하기 위해서 다중 퍼셉트론을 적용하였다고 합니다. 

 

 다중 퍼셉트론이라는 이름에서 "다중"이라는 말을 보시면 유추하실 수 있듯이 여러 개의 퍼셉트론을 가지고 코드를 구현을 하는 것입니다. 원래는 하나의 모델로 구현을 했는데 여러가지 모델을 통해서 구현을 한다는 것이라고 생각하시면 될 거 같습니다. 이와 관련된 그림은 구글이나 네이버에서 검색하시면 충분히 찾을 수 있으니 저는 코드 구현에 집중하도록 하겠습니다. 그럼 XOR 문제를 해결할 수 있는 코드를 구현해보도록 하겠습니다. 일단 먼저 말씀 드리는 게 XOR 문제를 해결한다는 것은 가중합과 바이어스를 구해서 입력값을 집어넣으면 우리가 원하는 출력 값을 출력되게 하는 것입니다.

 

▼ 하지만 이런 가중합과 바이어스를 구하려면 오차 역전파의 개념을 알아야 합니다. 즉 여기에서 제가 구현하는 코드의 가중합과 바이어스는 이미 제가 검증을 한 값이라고 생각하시면 될 거 같습니다. 

# 가중합과 바이어스를 2개 사용할 예정
# NAND, OR 함수 구현 예정

w1 = np.array([-2, -2])
w2 = [1,2]

# w1, w2의 출력 값을 확인
print(w1)
print(w2)

# 사칙계산이 어떻게 이뤄지는지 보여주는 출력 값
print(w1*w2)
print(w2*w1)

 

 본 코드에 앞서 몇 몇 분들이 행렬에 사칙 계산이 어떻게 적용이 되는지에 대해서 잘 인지를 못하시는 분들이 계실 겁니다. 저도 처음에 그래서 그런 부분을 인지하고 있는 거 같습니다. 위에서 간단하게 코드를 보여 드리면 행렬과 리스트의 곱을 표현하였습니다.

 

▼ 위의 사칙계산을 실행을 해보면 1행 1열, 1행 2열 의 위치에 있는 숫자끼리 곱해지는 걸 확인하실 수 있습니다. 결과 값은 아래와 같습니다. 직접 코드를 작성해서 구현을 해보시는 걸 추천드립니다. 

[-2 -2]
[1, 2]
[-2 -4]
[-2 -4]

 

 그럼 이제 사칙계산은 다 이해하셨을 거라고 생각하고 본격적으로 코드를 구현해보도록 하겠습니다. 입력 값은 1, 0의 조합이며 결과 값은 x1, x2의 입력 값이 다를 경우에는 "1"을 출력하는 XOR 게이트의 결괏값입니다. 

# 첫번째 퍼셉트론을 위한 행렬을 선언
w1 = np.array([-2, -2])

# 두번째 퍼셉트론을 위한 행렬을 선언
w2 = np.array([2,2])

#결과값을 도출하는 퍼셉트론 행렬을 선언
w3 = np.array([1,1])

# 각각의 퍼셉트론의 바이어스를 선언
b1 = 3
b2 = -1
b3 = -1

#가중합과 입력값 그리고 바이어스를 입력해서 출력값이 나오는 계산 함수
def Formual(x, w, b):
    y = np.sum(w * x) + b
    if y <= 0 :
       return 0
    else:
       return 1

# NAND Gate Fomula 구현
def NAND_F (x1, x2):
    return Formual(np.array([x1, x2]), w1, b1)

# OR Gate Fomula 구현
def OR_F (x1, x2):
    return Formual(np.array([x1, x2]), w2, b2)

# AND Gate Fomula 구현
def AND_F (x1, x2):
    return Formual(np.array([x1, x2]), w3, b3)

# 최종 XOR Gate Fomula 구현
def XOR_F (x1, x2):
    return AND_F(NAND_F(x1, x2), OR_F(x1, x2))

# XOR_F를 적용한 결과 값을 도출
if __name__ == '__main__':
    for x in [(0,0),(1,0),(0,1),(1,1)]:
        y = XOR_F(x[0], x[1])
        print("x1, x2 입력 값: " + str(x) + " XOR 게이트의 출력 값 : " + str(y))

 

▼ 위의 코드를 보면 NAND Gate 와 OR Gate을 위한 함수를 따로 따로 선언을 하고 최종적으로 XOR_F라는 함수로 결과 값을 도출하는 것을 확인하실 수 있습니다. 각 코드마다 제가 주석을 달아서 설명을 해드렸으니 참조하시면 도움이 되실 겁니다. 위의 코드를 구현을 해보면 아래와 같이 결과 값이 도출이 되는 걸 확인하실 수 있습니다.

x1, x2 입력 값: (0, 0) XOR 게이트의 출력 값 : 0
x1, x2 입력 값: (1, 0) XOR 게이트의 출력 값 : 1
x1, x2 입력 값: (0, 1) XOR 게이트의 출력 값 : 1
x1, x2 입력 값: (1, 1) XOR 게이트의 출력 값 : 0

 

  즉 XOR Gate 출력 값 처럼 입력 값 x1, x2의 값이 같으면 "0"  다르면 "1"을 출력하는 코드가 잘 구현이 된 걸 확인하실 수 있습니다. 앞에서 말씀드렸지만 위의 가중합과 바이어스는 오차 역전파 코드를 통해서 이상적인 값을 도출해야지만 위와 같이 결과 값이 잘 출력이 되는 걸 확인하실 수 있습니다. 

 

 이상입니다. 지금까지 딥러닝에서 가장 기초이자 근간이 되는 퍼셉트론 이론 및 XOR 문제 해결을 위한 코드 구현에 대해서 포스팅을 작성하였습니다. 퍼셉트론을 이해를 하고 모델 구현을 이해를 하면 나름대로 딥러닝을 구현하는데 기초는 닦았다라고 생각합니다. 코드를 보시고 이해하셨으면 실제적으로 파이 참으로 돌려보시는 걸 추천드립니다. 그럼 이만 마무리하도록 하겠습니다. 감사합니다. 

 

 

관련 다른 글

728x90

댓글


// 내부링크를 현재창으로 열기 // Open internal links in same tab