머신러닝

4-3 XOR 로직 뉴럴 네트워크 모델링, back-propagation 계산, Hypothesis 3D Graphic Visualization

coding art 2021. 7. 4. 13:34
728x90

자연계의 신경망은 이론적인 신경망 보다 말할 수 없이 복잡한 양상을 보이겠지만 특히 2개의 입력 문제를 다뤄야 하는 AND, OR 또는 XOR 로직 계산 문제를 생각할 때 최대한 간략하게 모델링 해보면 2개의 입력에 대하여 4개의 웨이트 2개의 바이아스와 아울러 firing 효과를 주기 위한 Sigmoid로 구성이 가능할 것이다. 역으로 이 뉴럴 네트워크 모델 NN(Neural Network)을 더욱 간단한 유닛들로 구성해 본다면 2개의 입력에 대해 2개의 퍼셉트론을 병렬 연결하여 구성이 가능하다.

이와 같은 뉴럴 네트워크에서 생성된 출력을 처리하기 위해서는 1개의 뉴론에 해당하는 퍼셉트론 구조에 Sigmoid 처리를 포함하면 된다.

이런 방식의 뉴럴 네트워크 모델링에 의해 2개의 입력을 학습해야 하는 AND, OR 또는 XOR 로직 계산 문제 처리가 가능하다. Minski Papert 교수가 그들의 저서 퍼셉트론에서 그들도 이와 같은 가능성은 지적하였으나 어떻게 웨이트 값을 찾아 낼 것인가? 즉 다시 말하면 웨이트를 어떤 방식으로 업데이트 해 나갈 것인가 하는 문제에서 벽에 부딪혔던 것 같다.

 

이와 같은 구조를 가지는 뉴럴 네트워크에서 적절한 크기의 learning rate 값과 초기 웨이트 값을 부여받은 상태에서 cost 함수의 웨이트와 바이아스들에 대한 편미분이 계산 가능하면 충분한 반복학습 횟수가 주어졌을 때 경사하강법을 사용하여 cost 함수를 최소값으로 수렴시키는 과정이 바로 back-propagation 이다.

 

한편 TensorFlow 라이브러리 모듈 지원 하에 신경망 계산이 가능한 xor_nn_01.py 코드에 서의 TensorFlow 변수 layer1hypothesisSigmoid 함수를 사용하여 다음과 같이 수학적인 형태로 표현이 가능하다.

이 식에서 사용되는 웨이트와 바이아스 값들은 물론 back-propagation 방식으로 적절한 learning rate , 반복학습 횟수 조건하에서 최종적인 계산 값이 얻어질 수 있다.

 

XOR 논리 문제를 풀기 위한 xor_nn_01.py 코드에서 learning rate = 0,5, 반복학습 횟수 2000 조건하에서 실행해보자. 반복학습 횟수가 그리 많지 않아 때로는 실패한 결과를 줄 수 있음에 유의하자.

 

코드 실행을 통해 제대로 된 결과 즉 Correct: [[0.] [1.] [1.] [0.]] 이 얻어진 경우를 대상으로 다음과 같이 표로 정리하였다.

위에 주어진 결과표를 사용하여 이 2개의 수식을 다음과 같이 정리하고 4개의 입력 데이터 [0.0],[1,0],[0,1],[1,1]에 대하여 수계산을 해 본 결과 xor_nn_01.py 코드에 의한 계산 결과와 잘 일치함을 확인할 수 있다.

최종적으로 4가지 경우의 XOR 입력 값들에 대한 hypothesis 계산 결과를 비쥬얼한 방법으로 살펴보자. 입력 값들이 “0” 또는 “1” 로 주어졌으나 TensorFlow 계산 결과는 바로 앞의 수계산 결과에서 보듯이 “0” 또는 “1” 에 가까운 근사값으로 주어지게 된다.

 

이와 같은 과정을 한번에 쉽게 이해할 수 있도록 “0” 또는 “1”을 사용하여 표현되는 입력 값들과 back-propagation을 통해 웨이트와 바이아스 업데이트를 통해 계산된 최종 hypothesis값과 곡면을 비쥬얼하게 매스매티카 Plot3D 명령을 사용하여 3차원 그래픽 처리하여 관찰해 보자. 지금까지 살펴보았던 AND 또는 OR 로직 계산에서의 hypothesis 곡면들보다는 다소 곡률이 큰 복잡한 형상을 보여주고 있다. 입력 값에 대해 학습을 통해 계산된 결과들도 잘 맞는 듯하다.

최종적으로 4가지 경우의 XOR 입력 값들에 대한 hypothesis 계산 결과를 비쥬얼한 방법으로 살펴보자. 입력 값들이 “0” 또는 “1” 로 주어졌으나 TensorFlow 계산 결과는 바로 앞의 수계산 결과에서 보듯이 “0” 또는 “1” 에 가까운 근사값으로 주어지게 된다.

 

이와 같은 과정을 한번에 쉽게 이해할 수 있도록 “0” 또는 “1”을 사용하여 표현되는 입력 값들과 back-propagation을 통해 웨이트와 바이아스 업데이트를 통해 계산된 최종 hypothesis값과 곡면을 비쥬얼하게 매스매티카 Plot3D 명령을 사용하여 3차원 그래픽 처리하여 관찰해 보자. 지금까지 살펴보았던 AND 또는 OR 로직 계산에서의 hypothesis 곡면들보다는 다소 곡률이 큰 복잡한 형상을 보여주고 있다. 입력 값에 대해 학습을 통해 계산된 결과들도 잘 맞는 듯하다.

마지막으로 이 그래프를 해석해 보자. 많은 머신 러닝 전문가들이 다음 그림의 왼쪽 편을 지적하면서 하나의 분리선을 사용하여 두 영역으로 분리가 불가능하다고 지적한다. 아울러 제안된 신경망 구조를 모델링한 xor_nn_01.py 와 같은 코드를 개발하여 성공적인 결과를 얻어내었다. 하지만 더 이상 2차원 평면적 사고에 머물렀던 왼쪽 그림에 대한 개선 논의는 없었던 것으로 보인다.

따라서 성공적인 뉴럴 네트워크 계산 결과는 바로 위 그림 중앙에서처럼 최종 hypothesis 곡면과 threshold 면을 포함하는 3차원 그래픽으로 표현된다는 점을 반드시 지적해 두어야 할 필요가 있다. 아울러 OR 집합 원리에 입각하여 2개의 퍼셉트론을 사용한 계산 결과가 뉴럴 네트워크 계산 결과와 거의 유사함을 확인할 수 있을 것이다.

아무런 해결 방안 제시가 없었던 2차원 평면적인 사고에 의한 문제 제기는 단순 문제 제기에 해당하며 제대로 문제 제기를 하려면 위 그림의 중앙이나 오른쪽 3차원 그래픽 처리 모델을 대상으로 문제 제기를 해야 할 것이다.

 

이번 블로그 내용에 사용된 뉴럴 네트워크 파이선 코드는 아래 주소 사이트에 첨부되어 있음을 참조하기 바란다.

 

3-5 XOR 논리 처리를 위한 Neural Network(NN) 구성

http://blog.daum.net/ejleep1/1134