작성일 : 2020.01.12

 

인공지능을 처음 공부할 때 일반적으로 접하게 되는 XOR 문제로부터 layer의 필요성과 다층 퍼셉트론의 필요 이유를 학습하게 됩니다.

"Frank Rosenblatt"은 연결주의 퍼셉트론을 주장하였으나 XOR 문제 해결을 근본적으로 할 수 없다는 거센 비판을 받게 되고, Frank Rosenblatt는 자살을 하고 맙니다. 하지만 이후 그를 보완하여 다층 퍼셉트론 개념과 역전파 개념이 나타나며 이러한 문제를 해결하고, 현재 인공지능계를 엄청난 발전으로 이끌었습니다.

 

하지만 제목과 같이 위의 문제를 해결해 보고자 합니다. 

이 글을 쓰게 된 계기는 Tensorflow KR 그룹에서 우연히 [1] 깃허브 개인 실험 게시물을 보았고 굉장히 재미있는 주제인 것 같아 위 실험을 따라 해 본 글과 함께, 그와 관련한 정보에 대해서도 정리해 보려고 합니다.

 

 

활성함수를 이용한 단일 퍼셉트론 문제 해결

위의 [1] 저장소의 내용으로 실험을 해본 내용입니다.

https://science.sciencemag.org/content/367/6473/83?fbclid=IwAR2ZeS2yG1DCXD_RNqgA-4LRNoEXerdP3uWLAmydzz7xFa5OZlAfSgQBEPI

 

Dendritic action potentials and computation in human layer 2/3 cortical neurons

A special developmental program in the human brain drives the disproportionate thickening of cortical layer 2/3. This suggests that the expansion of layer 2/3, along with its numerous neurons and their large dendrites, may contribute to what makes us human

science.sciencemag.org

우선 위와 같이 생각한 배경이라고 적혀있었습니다.

 

요약하자면 인간의 뇌의 뉴런은 전기적 입력 및 출력을 형성하며 뇌 기능을 하게 되는데, 이중 어떠한 뉴런은 신호의 임계치 수준 이상의 강도가 되면 오히려 강도가 감쇠되는 모습을 보였다는 연구 내용입니다.

( 생명공학과로서 매우 흥미 생기는 이야기입니다..! )

 

이를 이용하여 위의 개발자분은 활성함수에서 임계치 이상의 값이 나오면 0으로 바꾸는 ReaLU라는 활성 함수를 고안했다고 합니다.

(자세한 것은 위 저장소에도 매우 잘 소개 되어있습니다.)

개발자님이 고안한 ReaLU

얼추 이러한 모양으로 생겼는데 위의 개발자분은 1.6을 임계값으로 지정하여 { [x > 1.6] = 0, [x < 0] = 0 }으로 하셨습니다.

위와 같은 모델을 똑같이 만들어 보고 어떤 모양의 XOR 모델이 만들어 질까 실험해 보았습니다. [2]

위 링크의 실험은 colab단일 페이지로 만들어 보았습니다.

 

X

위와 같은 입력을 넣었을 때!

y_

학습 후 이렇게 올바른 Y값이 나오는 것을 볼 수 있었습니다. 본인은 퍼셉트론이 XOR을 만들 수 없는 이유만을 들어왔던 터라 혼자 이런저런 생각을 해보다가 시각화를 진행해 보았습니다.

너무 예쁘다 생각한 그대로 나왔다.

시각화 사진을 보면 {0, 0}에서 0의 수치를 가지고 있고, {1, 1}에서는 1.6의 임계치를 넘어 0이 된 값을 볼 수 있다. 또한

{0, 1}과 {1, 0}도 1.0에 근사한 값을 가진 것을 볼 수 있었습니다. (조금 낮아 보이는 건 기분 탓이다. 진짜다!)

 

이와 같이 XOR을 해결하는 합성함수를 사용한 모델을 검증해보았고, 모델의 시각화를 통해 이해를 해볼 수 있었습니다.

 

그렇다면 시행착오도 조금 작성해보려고 한다. 위와 같은 학습이 단번에 이루어지지는 않았습니다.

잘못 학습되어버림

예를 들면 이렇게 학습되기도 했다는 이야기입니다. 즉 local minimum에 빠지는 경우가 많았습니다. 

ㅠㅠ

무엇이 문제인지는 몇 가지를 더 시행해 봐야겠지만, 만약 이 글을 보게 된다면 코멘트를 좀 달아 주시면 좋겠습니다.

인공지능을 공부하게 된 지 얼마 안됐고 pytorch를 사용해보는 게 처음이기에 코드 내부의 문제가 있을 수도 있다고 생각했습니다.

 

가설 - loss함수를 다른 걸 써야 하나??

초기 - mes loss  (안됨)

loss = (y_hat - y_var). pow(2). sum() (안됨)

 

시간 날 때 이어서 써보도록 하겠습니다.

 

 

다른 개발자는 XOR을 어떻게 단인 퍼셉트론으로 해결하려고 하였나.

천천히 읽으며 채워볼까 생각해봤는데 이는 간단하게 요약/소개를 하고 마무리를 해보려고 합니다.

 

https://medium.com/@lucaspereira0612/solving-xor-with-a-single-perceptron-34539f395182

 

Solving XOR with a single Perceptron

Advocating for polynomial transformations as a way to increase the representational power of artificial neurons.

medium.com

이 문서는 단일 퍼셉트론의 표현력을 높이기 위해 선형의 분류에서 벗어나 비선형 퍼셉트론을 만드는 방법에 대해 XOR문제를 이용하여 소개했습니다.

 

XOR이 선형적으로 분리되지 않는 문제를 activation function앞에 

이러한 다항식을 추가하여 아래와 같이 XOR을 표현할 수 있다고 합니다.

또한 이 글에서는 여러 다항식을 추가해서 문제를 해결해보는 여러 가지 솔루션 소개하고 있고 수학적 이해를 돕게 하기 위한 식 유도 등을 포함하고 있습니다. 한번 읽어 보시길 하랍니다.


[1] https://github.com/sunggukcha/xor

[2] https://github.com/lunaB/AI-Experiment/blob/master/XOR%20perceptron.ipynb

+ Recent posts