머신러닝

4-6 CNN, NN(Neural Network), Deep Learning, Depth, Width가 무엇인지 생각해보자!

coding art 2021. 7. 5. 15:50
728x90

1959년 하버드 의과대학의 후벨과 위젤 (Hubel & Wiesel)교수는 원숭이 대뇌 실험을 통해 시각피질에서 원숭이가 시각적으로 보게 되는 오브젝트들의 특징(feature)을 탐지한다는 사실을 발견하여 훗날에 신경 병리학(Physiology)분야의 업적으로 노벨 의학상을 수상하게 된다.

 

다음 사진에서 당신의 뇌속의 CNN을 사용하여 숨은 고양이를 찾아보기 바란다.

일단 원숭이든 고양이든 사진에서처럼 옴짝 달짝 못하게 지그로 꽉 고정 시킨 후 뇌의 시각피질 (visual cortex)에 전극을 설치하는 한편 고양이에게 흑백 모니터 상에서 검은색 바를 여러 가지 양상으로 보여주면서 시각피질에서 나오는 전기 신호를 오실로스코프와 오우디오 사운드로 관찰하자.

 

이들은 특히 오브젝트의 상태에 따른 고양이의 시각 피질 반응 연구를 통해서 뇌의 신경세포들이 어떻게 구성되어 시각적인 인식을 낳게 되는지 상세한 메카니즘을 밝힘과 아울러 평생 동안 2000년 이후에 이르기까지 이 분야를 연구하여 특히 머신 러닝 발전에 근본적인 기여를 하였다. 후벨과 위젤 교수가 밝혀 낸 시각인식 메커니즘의 핵심이 바로 컨볼류션(Convilution)으로서 하나의 이미지 전체 픽셀들을 한번에 다 보는 것이 아니고 작은 단위로 나누어 컨볼루션 과정을 통해 얻어지는 정보를 종합하여 이미지를 인식하게 되는 것이다.

 

컨볼류션(Convilution)이라는 단어가 익숙하지 않을 수 있는데 revolution 이라는 단어를 비교해보자. 아주 알기 쉽게 서부영화에서 흔히 보는 6 연발 리볼버(Revolver)권총을 생각하면 된다. volution 은 돌린다는 의미며 revolve 는 하나의 중심축을 중심으로 돌린 다는 뜻임에 반해 Convolve는 큰 사각형 안에서 작은 사각형을 위에서부터 양쪽 모서릴 사이를 왔다 갔다 하는 TV 주사선 방식으로 스캔하면서 움직인다는 의미이다.

 

그 이유는 우리가 재미로 흔히 하는 숨은 그림 찾기를 생각하면 된다. 사각형 그림 안에 특징이 있는 물건을 숨겨 놓고 찾아내는 게임이다. 바로 그 원리를 말하는 것이다. 그림의 세부 세부를 훑어보거나 그림을 옆으로 또는 아래위로 뒤집어 보든가 해야 한다.

 

자연계의 신경망을 모방한 NN을 사용하여 상당히 까다로운 XOR 로직 문제를 해결할 수 있었던 것처럼 결국 NN은 생명체의 실제 뉴론은 아니지만 그래도 아주 비슷한 역할 수행이 가능한 인공 뉴론이라 할 수 있을 것이다. 따라서 이 NN으로 CNN을 구성한다면 오브젝트 이미지를 인식할 수 있는 가능성이 열리게 될 것이다.

 

CNN 코딩 작업 전에 우선적으로 NN에 대한 몇 가지 기본적인 특성을 알아두도록 하자. NN 은 꼭 CNN에만 사용되는 것이 아니라 Deep Learning에서도 핵심적으로 많이 사용되기 때문에 몇 가지 특성을 확실히 파악하고 있어야 CNN에도 제대로 적용이 가능하게 될 것이다. 그렇다면 과연 NN에서 파악해야할 어떤 중요한 내용이 있는지 알아보자.

첫째로 XOR 로직 문제를 처리하기 위해서 몇 단의 은닉(hidden) 레이어가 필요한가? 이와 같은 은닉 층의 수를 Deep Learningdepth 라 한다. 이론적으로 layer 수 제한은 없지만 layer 수를 늘려 나가면 컴퓨터 계산상의 부작용이 필연적으로 발생한다. 즉 은닉층을 무작정 많은 수로 늘려 버렸을 때 과연 back-propagation에 의한 수치 계산이 원활하게 이루어질 것인가? 이 문제를 시험 보기 위해서 MinskyPapert 교수가 제안했던 3개의 레이어를 가지는 수준의 NN 모델을 XOR 로직 문제에 적용하여 성과를 확인해 볼 필요가 있다. 그 다음에는 위 그림 수준만큼의 많은 수의 은닉 층을 가지는 NN에 대해 시험해 보도록 하자. 실제로 NN 을 기본구성단위로 하여 CNN을 구성할 경우 위 그림의 단수만큼의 레이어 구성은 기본적으로 필요하다는 점을 지적해 두자.

둘째로 은닉층을 코딩할 때에 층별로 몇 개의 웨이트를 설정할 것인가? 이 웨이트의 수를 Wide Deep Learning width 라 한다. 물론 코드 작성자가 임의로 설정이 가능한데 가급적 최소화 하는 것이 좋을 듯하다. 모델링 작업을 할 때에 불필요하게 파라메터들을 많이 잡게 되면 오히려 컴퓨팅 부담이 증가하게 될 것이다. 적정선이 있겠지만 웨이트 수를 변동시켜 시험해 보도록 하자.

 

갑작스럽게 머신 러닝의 내용이 점프한다는 생각이 들수도 있겠지만 허구한 날 데이터 1,2,3, 선형 회귀 문제라든지 , AND, OR, XOR 로직 문제가 되니 안 되니 해왔는데 사실 그 부분이 도입부분 전체로 이해하면 될 것이다. 일단 도입되고 나면 이론이고 쥐뿔이고 다 필요 없고 오직 코딩으로 결과를 보여주는 수밖에는 없다.