1. Convolutional Neural Network
컨벌루션 신경망(Convolutional neural network, 이하 CNN)은 뇌의 시각 피질이 이미지를 처리하고 인식하는 원리를 차용한 신경망입니다. CNN은 1980~90년대에 개발된 오래된 기술이지만, 지금은 컴퓨터 비전 분야에서 빼놓을 수 없을 정도로 많이 쓰입니다.
기본적으로 영상 인식은 분류 문제에 해당합니다. 예를 들어, 사진을 보고 개인지 고양이인지 인식하는 문제는 해당 사진을 개 와 고양이 중 어느 범주로 분류할 지와 같은 문제입니다. 글자를 인식하는 문제도 마찬가지입니다. 그래서 영상 인식에 사용되는 CNN의 출력층은 다범주 분류(Multiclass classification) 신경망으로 구성하는게 일반적입니다.
CNN의 특징 추출 신경망 Feature extraction 은 컨볼루션 계층 Convolutional layer 과 풀링 계층 Pooling 을 차례로 쌓은 형태로 되어 있습니다. 컨벌루션 계층은 이름 그대로 컨볼루션 연산을 통해 입력 이미지를 변환하는 역할 을 합니다. 일종의 디지털 필터들을 모아 놓은 계층이라고 이해하면 됩니다. 풀링 계층은 주위의 픽셀을 묶어서 하나의 대표 픽셀로 변환합니다. 즉, 풀링 계층은 이미지의 차원을 축소하는 역할을 합니다. 학습 과정을 통해 분류 신경망 뿐만 아니라 특징 추출 신경망의 가중치들도 학습되는 구조입니다.
2. Example
- ConvNetJS CIFAR-10 demo
- Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks
- Object Detection using Deep Learning
3. Convolutional Layer
컨벌루션 계층은 입력 이미지에서 고유한 특징을 부각시킨 이미지를 새로 만들어내는 역할 을 합니다. 이러한 이미지를 '특징 맵 feature map' 이라고 부릅니다. 컨벌루션 계층은 일반적인 신경망의 계층과는 구조와 작동 방식이 많이 다릅니다. 이 계층의 노드들은 연결 가중치와 가중합 등 신경망의 일반적인 개념을 사용하지 않습니다. 대신 입력 이미지를 다른 이미지로 변환하는 필터들이 들어 있습니다. 여기서는 이 필터를 ‘컨벌루션 필터’라고 부르겠습니다. 컨벌루션 필터로 입력 이미지를 처리하면 feature map 을 얻을 수 있습니다.
그럼 컨벌루션 필터에 관해 구체적으로 알아보겠습니다. 컨벌루션 계층에서 쓰이는 필터의 정체는 2차원 행렬입니다. 보통 5x5 행렬이나 3x3 행렬이 주로 쓰이는데 요즘엔 1x1 행렬로 된 컨벌루션 필터를 사용하는 경우도 있습니다. 앞에서 이미 설명했듯이 ConvNet에서 필터 행렬의 값은 신경망의 학습 과정을 통해 결정됩니다. 즉 이 필터 행렬의 값은 학습을 통해 계속 바뀝니다. 일반 신경망에서 학습을 통해 노드의 연결 가중치를 갱신하는 것과 비슷합니다. 컨벌루션 계층은 입력 이미지와 컨벌루션 필터를 연산해 feature map 을 얻어 냅니다. 컨벌루션 계층에서 추출할 feature는 컨벌루션 필터에 학습되어 있습니다. 즉 어떤 컨벌루션 필터를 사용하느냐에 따라 컨벌루션 계층에서 추출해내는 특징이 결정됩니다.
컨벌루션 연산은 2차원 상에서 이뤄지는 연산이라 글로 설명하기는 어렵지만, 개념과 계산 과정은 생각보다 간단합니다. 다음 그림은 컨벌루션 계층이 어떤 식으로 작동하는지 보여주고 있습니다.
컨벌루션 필터로 처리된 feature map은 활성 함수를 거쳐 최종 출력됩니다. 컨벌루션 계층의 활성함수는 기존 신경망에서 사용되는 활성함수와 다르지 않습니다.
Receptive field
공간 정보를 보존하려면 각 이미지를 픽셀 값을 갖는 행렬로 표시하는 것이 편합니다. 지역적인 구조를 인코딩하는 방법은 인접한 입력 뉴런의 부분 행렬들을 다음 계층에 있는 한 개의 은닉 뉴런으로 연결하는 것 입니다. 이 한 개의 은닉 뉴런이 하나의 Receptive field를 나타냅니다. 이 작업이 Convolution입니다.
당연히 부분 행렬이 겹치게 함으로써 더 많은 정보를 인코딩할 수 있습니다. 예를 들어, 한 부분 행렬의 크기가 5x5이고 이 부분 행렬을 28x28 픽셀의 MNIST 이미지에 적용한다고 가정해봅시다. 그러면 다음 은닉 계층에서 23x23 개의 Receptive field 뉴런을 생성할 수 있고, 이미지 끝 부분에 도달하기 전까지 부분 매트릭스로 23개의 위치만큼만 이동하는 것이 가능합니다. Keras에서 각 부분 행렬의 크기는 stride length 라고 부르며, 이 값은 신경망을 만들 때 세부 조정할 수 있는 하이퍼파라미터 hyperparameter 입니다.
Pooling Layer
풀링 계층은 이미지의 크기를 줄이는 역할을 합니다. 구체적으로 풀링 계층은 입력 이미지에서 특정 영역에 있는 픽셀들을 묶어서 하나의 대표 값으로 축소 합니다. 풀링은 기존의 이미지 처리에서도 많이 쓰이는 전형적인 기법입니다.
풀링 계층의 연산을 위해서는 입력 이미지에서 풀링할 픽셀을 어떻게 선택할 지와 이 픽셀의 대표값을 어떻게 결정할 것인지를 정해야 합니다. 픽셀들을 몇 개씩 묶을 지는 다루는 문제에 따라 다른데, 보통은 정방 행렬 square matrix 행태로 픽셀들을 선택합니다. 선택한 픽셀들로부터 하나의 대표 값을 계산하는 연산으로는 보통 평균값이나 최대값을 많이 사용합니다.
사실 수학적으로 풀링은 일종의 컨벌루션 연산입니다. 컨벌루션 계층과 달리 컨벌루션 필터가 고정되어 있고, 이 필터와 원본 이미지를 컨벌루션하는 영역이 겹치지 않는다는 정도만 다릅니다.
풀링 계층은 입력 이미지에서 인식 대상이 한 쪽으로 치우쳐 있거나 돌아가 있어도 어느 정도 보상해주는 역할을 합니다. 예를 들어 고양이가 중앙에서 벗어나 있는 사진을 입력해도 풀링 계층에서 치우침을 어느 정도 보상하기 때문에 제대로 인식하는 데 도움이 됩니다. 또한 풀링 계층은 이미지의 크기를 줄여 주어, 계산량을 줄이고 과적합을 방지하는 데도 도움이 됩니다.
Next: Convolutional Neural Network - 2