CNN은 Convolutional Neural Network의 약자로, 우리나라 말로는 합성곱 신경망이라고 불리기도 하지만 일반적으로 CNN이라고 통칭합니다. CNN은 합성곱 연산 혹은 컨볼루션 연산 (convolution)을 기반으로 합니다. Convolution 연산이 무엇인지는 아래에서 자세히 살펴보도록 하겠습니다.
CNN은 CV(Computer Vision) 분야에서 매우 높은 정확도와 성능을 보이며, 신경망 연구를 새로운 차원으로 진화시킨 모형이기도 합니다. CNN이 최초로 고안된 것은 1980년대 Yann LeCun의 ConvNets으로, 매우 기초적인 이미지 인식 기술을 선보였습니다. 이후 손글씨나 인쇄된 글씨 수준은 인식할 수 있었지만, 문제는 연산량이었습니다. 이미지들은 일반적으로 가로와 세로 각각 수백 혹은 수천개의 픽셀(pixels)로 이루어져 있는데, 당시의 컴퓨팅 자원으로는 이를 처리하기 힘들었기 때문입니다. 따라서 인공신경망 분야는 침체기를 겪게 되고, 사람이 직접 코딩한 규칙 기반(rule-based)의 visual recognition을 구현하게 됩니다.
그러던 와중 2012년 인공지능계에 역사적인 사건이 발생합니다. AlexNet[1]이라는 신경망은 딥러닝 분야를 재방문(revisit)하여, ILSVRC(ImageNet Large Scale Visual Recognition Challenge) 대회에서 우승을 하게 됩니다. 이는 CNN 뿐만 아니라 인공지능 전반의 부흥을 이끌었습니다.
Hubel과 Wiesel의 대뇌 피질 연구 (출처: https://www.researchgate.net/figure/Fig-In-the-classic-neuroscience-experiment-Hubel-and-Wiesel-discovered-a-cats-visual_fig1_335707980)
1950~60년대 이루어진 생물학적 발견을 바탕으로 합성곱(convolution) 연산을 기본으로 합니다. 1959년 Hubel과 Wiesel[2]은 고양이에게 특정한 그림을 보여주며 어떠한 뉴런이 활성화되는 지를 실험했습니다. 시각피질(visual cortex)은 대뇌 반구 양쪽의 후두엽에 위치해 있는데, 시각정보는 망막을 통해 시상을 거쳐 후두엽의 시각피질에 들어오기전 시각교차(optic chaism)에 의해 왼쪽 반구의 시각피질은 오른쪽 시야에서, 오른쪽 시각피질은 왼쪽 시야에서 신호를 받습니다. 연구자들은 고양이의 특정 뉴런의 전기 신호를 측정했을 때, 특정한 각도의 직선에서만 활성화되는 것을 실험을 통해 확인했습니다.
이러한 연산은 convolution 연산이 시각 및 음성 정보에서 원하는 정보를 추출하는 데에 기반이 되었습니다. 즉, 시각 정보는 1차적으로 직선이나 곡선과 같은 매우 단순한 정보를 추출한 뒤, 이러한 정보들을 복잡하게 조합하여 구체적인 형상을 인식할 수 있다는 것을 추론할 수 있습니다. 이를 수학적으로 구현하는 연산이 합성곱 혹은 convolution 연산입니다.
정의역이 각각 이산형, 연속형 변수일 때 convolution 연산은 아래와 같이 수식으로 작성할 수 있습니다.
$$ f*g = \sum_{a\in \mathbb{Z}^d} f(a)g(i-a) = \sum_{a \in \mathbb{Z}^d} f(i-a)g(a) = g*f $$
$$ f*g = \int_{\mathbb{R}^d} f(z)g(x-z)dz = \int_{\mathbb{R}^d} f(x-z)g(z)dz = g*f $$
수식으로 이해하는 것은 쉽지 않지만, 중요한 것이 함숫값은 $i$ 혹은 $x$ 일 때 구하는 것이고, convolution filter는 $a$ 또는 $z$가 되는 것입니다.
실제로 CNN에서 사용하는 convolution 연산은 실제로는 cross-correlation 연산이라고 불린다고 합니다. 위의 수식과는 유사하지만, 가운데의 부호가 $-$가 아닌 $+$로만 바뀐 형태입니다.
$$ f*g = \sum_{a\in \mathbb{Z}^d} f(a)g(i+a) = \sum_{a \in \mathbb{Z}^d} f(i+a)g(a) = g*f $$
$$ f*g = \int_{\mathbb{R}^d} f(z)g(x+z)dz = \int_{\mathbb{R}^d} f(x+z)g(z)dz = g*f $$
이 연산의 가장 큰 특징은 convolution filter 혹은 kernel이 정의역 내에서 움직여도 변하지 않고 (translation invariant), 주어진 신호에 국소적(local)으로 적용된다는 점입니다.
[1] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "Imagenet classification with deep convolutional neural networks." Advances in neural information processing systems 25 (2012): 1097-1105.