CNN(Convolutional Neural Network)
사람은 고양이와 강아지를 눈으로 보고 손쉽게 구분해낼 수 있습니다. 하지만 컴퓨터에게 이미지 한 장을 주고 강아지와 고양이를 구분할 수 있게 만드는 것은 앞을 볼 수 없는 장님에게 강아지와 고양이를 구별하라는 것과 동일하다고 볼 수 있습니다.
그렇다면 컴퓨터는 강아지와 고양이를 어떻게 분류해낼 수 있을까요?
바로 인공지능의 고전적인 알고리즘 중에 하나인 CNN(Convolutional Neural Network)를 통해 고양이와 강아지를 분류해낼 수 있습니다. 다양한 데이터 종류 중에서도 데이터의 depth가 크고 정보량도 많은 것이 이미지와 영상 데이터입니다. 이미지는 기본적으로 2차원 평면 배열로 되어 있는데 여기에 색깔 정보, 밝기 정보, 빛 정보 등이 더해지면 N차원 정보가 되어 영상 기술이 발전할수록 이미지 분류에 사용되는 계산 양도 기하급수적으로 늘어나게 됩니다.
CNN 알고리즘을 설명하기 전에 먼저 컴퓨터가 이미지를 인식하는 방식에 대해서 알아볼까요?
우리가 이미지를 인식하는 방식과 컴퓨터가 이미지를 인식하는 방식은 완전히 다릅니다. 사람은 이미지를 눈에 보이는 모습 그대로 인식한 뒤 기본적인 상식을 더하여 그 이미지가 무엇인지 바로 분간해낼 수 있습니다.
하지만 컴퓨터의 경우 이미지는 W*H*C(W: Width, H: Height, C: Channel) 3개의 픽셀 값으로 이루어져 있습니다. N차원 행렬 데이터, 쉽게 말해 숫자로 되어있습니다. 이 픽셀 값들을 바탕으로 수많은 연산을 통해 강아지와 고양이인지 구별을 하게 됩니다.
즉, 컴퓨터는 이미지로부터 Feature(특징)를 뽑아낸 결과를 연산하여 결과값을 도출합니다.
기본적으로 주어지는 이미지가 있고, 이 이미지로부터 feature 들을 뽑아내게 됩니다. feature는 이미지에서 얻어낼 수 있는 패턴을 말합니다. 일례로 털이 복슬복슬하고, 수염이 어떠하고, 크기가 몇 인지 등 이 모든 것들을 특징이라고 합니다.
이러한 특징들을 각각의 데이터별로 분류하는 작업을 인공지능이 해주는 것입니다. 예를 들어, 총 20개의 사진을 통계적으로 분석하였을 때 고양이가 대체적으로 코가 작고 귀가 개보다 뾰족하다고 판단을 내릴 수 있고 이러한 통계치에 근거하여 강아지와 고양이를 분류해내는 원리입니다.
이 feature을 뽑아내는 함수를 f라 하면 feature를 바탕으로 분류 값을 도출해내는 함수 g(f(X)) 가 있습니다. 이 g 함수에서는 각 분류별로 확률 p를 도출해내게 됩니다. 이 이미지가 특정 분류에 속할 확률을 계산해내는 것이죠. 그래서 가장 높은 확률을 가지는 분류를 최종 결과값으로 출력해주어 마침내 그 이미지가 무엇인지 분간해내게 되는 것입니다.
CNN(Convolutional Neural Network)
CNN 알고리즘은 인공지능 딥러닝 알고리즘 중에서 영상 이미지 분류에 가장 적합한 방법으로 알려져 있습니다. 일례로, 어떤 이미지를 CNN 알고리즘에 Input 데이터로 넣어주면 그 이미지가 강아지인지 고양이인지 등을 분류해낼 수 있게 되는 것이죠.
합성곱(Convolution)
CNN 알고리즘에서 기억해두어야 할 원리는 합성곱이라는 개념입니다. CNN 알고리즘은 여러 개의 Layer를 지나면서 각 Layer의 출력이 단순화되고 추상화됩니다. 이 과정을 거치면서 Input 데이터가 수백 개의 다차원 행렬에서 결국 최종 결과는 이 동물이 무엇이다라는 한 단어로 출력되게 되는 것입니다. 이렇게 크기가 큰 행렬을 줄여나가는 과정을 합성곱(Convolution)이라고 합니다. 합성곱은 크기가 큰 행렬에 작은 크기의 행렬을 계속 곱해서 얻어나가는 방식으로 진행됩니다.
즉, 이미지에서 원하는 특징만을 추출한 합성 지도(Feature Map)를 합성곱이라는 필터를 이용해 만드는 것이 CNN의 원리입니다. 결과적으로 Feature Map이 신경망에 입력되어 이미지가 어떤 클래스 라벨에 속하는지를 분류해주는 것입니다.
추상화(Abstraction)
각 신경망 층은 반복적으로 추상화 과정을 거치게 됩니다. 예를 들어, 첫 Layer의 Input이 사진 이미지라면, 두 번째 Layer는 윤곽과 테두리를 표현하고, 세 번째 Layer는 코, 입, 귀를 판단하는 등을 거쳐 최종적으로 이미지가 무엇인지를 파악하는 과정을 거칩니다. 이 학습 과정에서 계속해서 행렬 연산이 이루어지게 됩니다.
위 예시로 설명해보면, 28x28 size의 이미지 행렬을 4개의 필터를 사용하여 각각 24x24의 Feature Map으로 만듭니다. 그리고 SubSampling으로 12x12로 압축을 합니다. 여기서 SubSampling은 화면의 크기를 줄이는 과정이라고 보시면 됩니다. 그다음 Layer에서 8x8 Size로 12개의 Feature Map을 만들고 다시 4X4로 SubSampling을 합니다.
이렇게 계속 Layer의 출력을 단순화하는 과정을 거쳐나가다 보면 주요 특징만이 남게 되고 신경망에 바로 Input 데이터로 사용 가능한 일차원의 Fully Connected 가 나오게 됩니다.
즉, CNN 알고리즘은 Convolution(합성곱)과 SubSampling을 거쳐 다차원 이미지 행렬이 주요 특징만 남긴 1차원 행렬로 바뀌게 되고, 최종적으로 12x4x4=192개의 입력을 가진 신경망에 연결시켜 학습을 하여 이미지를 분류해내게 됩니다.
CNN의 한계
이러한 CNN 알고리즘에도 한계가 존재합니다. CNN의 Convolution Filter들은 이미지 픽셀에서 중요한 피쳐가 무엇인지를 감지합니다. 처음에는 간단한 특징을 잡고 Higher Layer로 갈수록 더욱 복잡한 특징들을 잡게 됩니다. 그리고 가장 최상위에 위치한 Top Layer에서 최종 분류를 하게 됩니다.
여기서, Higher Layer는 단순히 Lower Layer들의 가중합(Weighted Sum)으로 Feature 간의 위치 관계를 전혀 고려되지 않습니다.
즉, 아래 이미지를 보면 둘 다 같은 얼굴이지만 눈, 코, 입의 위치가 극명히 다르므로 분명히 다른 이미지로 인식되어야 합니다. 하지만 CNN 알고리즘의 경우 위치 관계를 고려하지 않기 때문에 둘 다 같은 얼굴이라고 인식을 하게 되는 것이죠.
CNN은 이러한 문제점을 해결하기 위해 Max Pooling이라는 방법을 도입하여 Higher Layer들의 시야각을 넓혀주는 방식, 즉 한눈에 보이는 시야를 넓혀주어 최대한 위치 정보에 대한 한계를 개선하는 방식으로 진행되고 있다고 합니다. 컨볼루션 필터가 추출한 특징을 상하좌우로 훑으며 핵심적인 정보만을 영역별로 샘플링하는데, 주로 영역 내 가장 큰 값만을 남기고 나머지 값을 버리는 방식입니다. 이 방식을 통해 좀 더 정확하게 이미지를 인식할 수 있게 되는 것이죠.
이처럼 CNN 과 같은 이미지 인식 기술은 0과 1의 데이터만 다루던 컴퓨터에게 세상을 보는 ‘눈’을 생기게 해주었습니다. 시간이 흘러 기술이 좀 더 발전하면 컴퓨터가 이미지를 인식하는 것을 넘어 시각을 기반으로 다양한 사고를 추론하는 것도 가능하게 되지 않을까요?
이미지 출처
https://m.blog.naver.com/msnayana/220776380373
http://www.yaronhadad.com/deep-learning-most-amazing-applications/