딥러닝

밑바닥부터 시작하는 딥러닝1 (perceptron) #part2-2

관형이 2023. 6. 18. 18:07

어제 다 설명 못한 perceptron에 대하여 설명하겠다. 저번 시간에는 단층 퍼셉트론에 대한 설명과 논리회로를 알아봤다면, 이번 시간에는 다층 퍼셉트론단층 퍼셉트론의 한계에 대하여 알아보겠다.

지난 포스팅과 같이 보기를 추천한다.

 

목차

  • XOR 게이트
  • 다층 퍼셉트론의 등장

먼저 XOR 게이트에 대하여 설명하겠다.

 

XOR 게이트

XOR 게이트는 

배타적 논리합으로 불리며, 즉, X1, X2중 한쪽이 1일때만 1을 출력하는 구조이다.

(복습 OR게이트는 1, 1 ->1을 출력하지만, XOR 게이트에서는 1, 1->0이 출력되는 구조이다.)

 

그렇다면 이 논리 회로도 앞에서 설명한 일차함수의 부등식 영역 관점으로 표현 할 수 있을까?

그림을 먼저 봐보자

결론부터 먼저 말하자면, XOR 게이트는 단층 퍼셉트론 즉, 하나의 선으로는 표현이 불가능하다. 

위의 그림에서 검정색 점을 포함하면서 하얀색 점을 포함하지 않는 그래프는 일차식으로 표현이 불가능하다.

최소 직선 2개 이상을 그리던가, 비선형 직선을 그려야 표현이 가능한 식이다.

왼쪽에서 알 수 있듯이 선형 식으로는 구현이 불가능하다 어떤 선을 그어도(가중치와 편향을 조정해도) 구현할 수 없다.

이것을 단층 퍼셉트론의 한계라고 설명한다.

 

그렇다면 이러한 문제를 해결하려면 어떻게 해야할까?

 

성냥 개비 예시로 설명하겠다.

Q. 성냥개비 6개로 정삼각형 4개를 만들 수 있는가

 

A. 평면상에서는 불가능 그렇다면 어떻게 해야할까?

 

 

고정관념을 깨고 3차원으로 만들면 문제 해결 가능 -> XOR 퍼셉트론에도 관점 적용할 수 있다.

 

다층 퍼셉트론의 등장

기존 입력층(0층), 출력층(2층) 사이에 층을 하나 더 쌓는 것이다.

새롭게 쌓인 층은 입력층과 출력층 사이에 숨겨져있다고 해서 은닉 층으로 부른다.

이렇게 은닉층은 경우에 따라서 하나말고도 원하는 만큼 층을 쌓을 수 있다.

 

논리회로에서는 어떤 방식으로 층을 쌓는 것일까?

A, B가 입력층(X1, X2)이다. 회로에서 보이는 것처럼 X1, X2의 출력값이 각각 S1과 S2에 저장되는 방식이다.

X1, X2의 NAND출력 값이 S1에 저장되고, X1, X2의 OR게이트 출력 값이 S2에 저장된다. 

그리고 S1, S2는 AND 게이트를 구성하는 새로운 입력 값이 된다. S1, S2의 AND 게이트 출력 값으로 y가 나오는 방식이다. 즉, 회로안에 NAND와 OR게이트, AND 게이트를 넣어서 XOR게이트를 구현할 수 있게 되는 것이다.

 

이런식으로 구현 XOR 게이트의 문제를 해결해보면,

이런 비선형 그래프를 그리거나

두개의 선으로 XOR을 표현할 수 있게 되는 것이다.

 

다층 퍼셉트론에서 심층 신경망으로

 

구분해보자면, 다층 퍼셉트론은 XOR 게이트와 같이 은닉층의 개수가 하나 이상인 것을 의미하며, 심층 신경망은 다층 퍼셉트론 보다는 조금더 심화된, 은닉층의 개수가 2개 이상인 것을 의미한다.

그리고 퍼셉트론은 위의 사진처럼 출력시 그냥 출력되는 것이 아니고, 활성화 함수를 이용하여 출력 값을 결정하게 된다.

이때 활성화 함수로는 시그모이드 함수, RELU함수, 계단 함수, 부호 함수 등이 있다.

자세한 내용은 다음 시간에 설명한다.

 

XOR 게이트를 구성하는 코드를 살펴보자.

XOR 게이트의 코드는 아까 설명한 그대로 구현하면 된다. 앞에 시간에서 만든 NAND, OR, AND 함수를 이용하여 함수를 정의한다.

입력값과 출력 값 확인 (배타적 논리합)

데이터 프레임으로 변환하기 위해, Y값들과 S1과 S2의 값들을 새로운 리스트에 담았다.

데이터 프레임으로 출력

set_index 함수를 이용하여 입력값과 은닉층의 값, 출력값을 나눴다.

 

시각화 하기 위해 plt.scatter 함수를 사용하여, 점을 구분해서 찍어봤다.

이렇게 두개의 직선이나 비선형 그래프로 표현하지 않는 이상은 표현하기가 어렵다. 이상으로 2장 퍼셉트론에 대한 내용을 마치겠다.

 

 

마무리하며

  • 얼마전 시각화 공부를 따로 해봤는데, 내가 생각한대로 코드를 직접짤 수 있으니 흥미롭고 보기가 더 편했다.
  • 기본적인 넘파이 코드를 활용하는 것이므로 딥러닝의 대표 라이브러리 텐서플로에 대해 따로 공부 해야겠다.
  • 앞서 그림에 있는 비선형 그래프를 그려보고 싶었는데 못 표현했다. 어떻게 하면 비선형 그래프를 그릴 수 있을까? 궁금해졌다.
  • 논리 회로에서 굳이 은닉층의 존재하는 게이트가 OR하고, NAND게이트였는데, 이 3가지의 순서를 무작위로 바꿔도 똑같이 XOR 게이트를 구현할 수 있는지 궁금해졌다.