머신러닝

CNN 필터와 스트라이딩 코드 작성을 위한 워밍업

coding art 2021. 7. 9. 18:29
728x90

머신 러닝의 여러 가지 문제 중에서 CNN(Convolutional Neural Network)에 다다르게 되면 왜 이렇게 복잡한 코딩을 하는지 이해하기가 무엇보다 어렵다고 생각할지도 모르겠다.

 

그럴 때면 항상 머신 러닝의 발전과정을 단계적으로 돌이켜 볼 필요가 있다. 1940년대 초 이미 McCulloch Pittsdp 의해 신경 병리학적인 관찰 결과를 논리학적인 토대 위에 뉴론에 입력되는 신호들에 대하여 웨이트를 부여하는 뉴럴 네트워크 모델이 제안되었다. 그로부터 시작해서 1957년에 Rosenblatt이 오늘날의 조도센서로 알려진 포토 센서를 사용하여 컴퓨터와 인터페이스를 통해 퍼셉트론을 시현했다. 이 퍼셉트론으로만 해도 이미 문자 인식이 가능했고 아울러 이미지 인식이라든지 인간처럼 말하거나 듣고 이해한다든지 오늘 날의 머신 러닝의 미래를 미리 예견했었다.

한편 당시에는 Rosenblatt이 연구하던 퍼셉트론과의 관계를 지우기 어렵겠지만 하버드의 닥터 후벨에 의해 흑백 명암으로 구성된 edge 형 오브젝트에 대한 고양이 시각 피질 반응에 대한 실험 연구가 이루어졌다. 이로 인해 그 후로도 평생 시각인식에 대한 연구에 헌신한 닥터 후벨이 1981년에 노벨 의학상을 받게 되는 공로도 결국은 고양이 시각 피질 반응연구였다.

 

하지만 1960년대 머신 러닝의 발전이 극도로 부진했던 시기인 1969년에 Minsky 교수가 퍼셉트론이 XOR 로직 문제를 풀지 못한다고 지적하였던 시기를 거쳐 미제로 남겨졌던 멀티 레이어 뉴럴 네트워크가 1980년대 힌튼 교수에 이르러서 back-propagation 이론 정립으로 간신히 명맥을 유지해 나가게 된다. 문헌에 의하면 1970년대 초 Rosenblatt의 사고 사 이후 머신 러닝 분야 자체가 아예 사양화 되어 이 분야를 연구하는 사람 수가 당시의 논문 출판 결과물에 근거하여 판단해 보면 전 세계에 45명 이내였던 시절이 있었던 것 같다.

 

1980년대 후반기에 이르면 마이클 잭슨과 같이 락큰롤 스타와 같은 인물이 머신 러닝 분야에 혜성과 같이 나타나는데 그가 바로 뉴욕대의 Yann LeCun 교수이다. 프랑스에서 컴퓨터 과학 분야에서 박사학위를 취득 후 1987 1988년에 미국에서 완전 사멸된 머신 러닝 연구의 족보를 들고 캐나다에서 망명 캠프를 꾸리고 있던 힌튼 교수의 실험실에 박사후 과정(postdoctor)을 하게 된다. 이어서 미국 이공계 출신이 취업하고 싶어 하는 꿈의 연구소라 불렸던 AT&T 벨랩에 연구원으로 가게 된다.

 

그 당시 AT&T 는 우리로 치면 KT 에 해당하는데 미국의 많은 기업 중에 엄청난 수익을 올렸으며 특히 통신 업계의 독점자가 되어 버려 어쩔 수 없이 분할하게 되는 과정을 겪게 된다. 여기서 LeCun 교수느 생물학 분야에서 영감을 받은 CNN 연구를 최초로 시작하게 된다. 이미 1970년대 후반부터 컴퓨터 과학 분야에서 광학카드판독기술 즉 OCR(Optical Card Reader)과 펀치 카드가 전 세계적으로 특히 우리나라에서는 그 당시 오늘날의 수능 시험인 예비고사 채점기술로 활용되고 있었다. OCR 에서는 사람이 직접 데이터를 보고 타이핑하여 펀치카드를 준비해야 한다. 즉 인식 작업은 사람이 담당하는 몫이었다.

 

LeCun의 연구 즉 MNIST 수기숫자 인식 분야의 연구는 OCR 기술을 넘어서야 하는 기술로서 생물학적인 영감을 받아서 새로운 즉 지금은 CNN 으로 알려진 기술을 창조해야 하는 엄청난 과제로 보아도 무방할 것이다.

 

물론 생물학적 영감이란 것이 LeCun 의 머리속에 자연히 떠 오른 것이 아니라 Hubel 박사의 고양이 시각피질 반응 연구일 것이라 추정한다. 이미 인터넷에 LeCun이 출판한 논문들이 오픈소스화 되어 있으므로 읽어보게 되면 이에 대한 단서를 찾을 수 있을지도 모르니 참고하기 바란다.

 

머신 러닝에서 후벨 박사의 연구 내용 즉 고양이가 흑백 명암으로 구성되는 기울어진 사선(edge)형 오브젝트에 대해 시각 피질의 특정 뉴론들이 반응한다는 사실을 컴퓨터 코드로 실현해야 하는데 바로 그 내용이 CNN 에 있어서 필터링에 해당한다.

 

CNN 에 있어서 특히 edge 형태의 오브젝트를 인식함에 있어서 이미지 전체를 한 방에 인식하는 것이 아니고 이미지보다 크기가 아주 작은 카메라로 TV에서 전자빔을 주사하듯 스트라이딩 시켜 뭔가 잘 알 수는 없지만 고양이 시각 피질이 수행하는 연산 결과와 동일한 결과를 CNN에서도 얻어 내야 한다. 그러한 필터 중에 가장 기본적인 것이 스트라이딩 하는 과정에서 필터에 대응하는 각 픽셀 값을 1로 곱한 후 합산 후 필터의 픽셀 수로 평균하여 얻은 값을 기록하게 되면 스트라이딩 이전의 이미지 매트릭스 보다 작은 크기의 필터링 된 이미지 매트릭스가 얻어진다.

CNN에서 사용하는 필터의 크기는 특별한 제한이 없겠지만 전체 이미지의 크기에 상관없이 대체로 연습 단계에서 2X2 3X3을 주로 사용한다. 위 그림에서처럼 필터링 할 때 마다 필터링 된 픽셀 값이 얻어지는데 오른쪽으로 한 칸씩 오른쪽 경계에 도달하면 좌측 경계로 아래로 한칸 이동하는 것을 1X1 스트라이딩이라고 한다. 좋은 인식률을 얻어내기 위해서는 다양한 스트라이딩 경우를 테스트해 봐야 할 것이다.

 

이와 같은 CNN 필터를 하나만 쓰는 것이 아니라 아예 파라메터화 하여 2, 4, 8, 16, 32 와 같이 임의로 갯수를 설정하여 사용하게 된다. 물론 첫 번째 필터는 매트릭스의 값이 1인 필터로 구성된다고 보면 된다. 그밖에도 많은 CNN 필터가 있는데 MNIST TensorFlow 해석에서는 그냥 파라메터화 되어 있기 때문에 갯수만 지정하면 된다. 아마도 LeCun이 이미 1990년대에 필터 만드는 작업을 다 완성 해버린 것 아닌가 생각된다.

 

위 그림에서 그 픽셀 값이 1, 2, 3,..., 9 로 표현된 전체 이미지는 이미지로서 특별한 의미는 없고 뒤따르는 CNN 코드 작성을 위한 단순 수치 예제로 보면 된다.

 

다음 그림을 참조하면서 스트라이딩의 첫 번째 단계에서 필터링 된 값은 3이 된다. 반드시 평균값을 취해야 하는 이유는 예를 들어 픽셀 값이 0255 범위를 가진다면 픽셀 값 합한 수만큼 나누어 주어야 255를 넘지 않으므로 픽셀로서의 의미가 유지된다고 볼 수 있을 것이다.

 

두 번째 단계에서 필터링 된 값은 4이며, 세 번째는 6, 네 번째는 7이 된다.

CNN 이 처음에는 어렵고 생소하게 느껴질지 모르지만 단계적으로 처리과정을 따라 코딩 연습을 뒷받침하면서 따라가 보기로 한다.