CNN(Convolutional Neural Network)
Intro
이번 글에서는 YOLO를 분석하는 과정에서 CNN에 대한 선수 지식이 필요해 CNN에 대해 자세히 정리해 보려고 합니다.
합성곱 신경망(Convolutional Neural Network, CNN)은 시각적 이미지를 분석하는 데 많이 사용되는 feed-forward적인 DNN(Deep Neural Network)의 한 종류입니다.
합성곱 신경망에서 뉴런 사이의 연결 패턴은 동물의 조직에서 영감을 얻었다고 합니다. 예를 들어 시각 피질 뉴런들은 전체를 보는 것이 아니라 제한된 공간(시야각)에서 나오는 자극에만 반응하지요.
CNN 필요성
기존의 인공신경망(Artificial Neural Netwrok ,ANN)은 이전 레이어의 모든 노드가 다음 레이어의 모든 노드에 연결된 레이어입니다. 이를 Fully Connected Layer 또는 Dense Layer라고 합니다.
이러한 특징을 갖는 인공신경망의 입력 데이터는 1차원(배열) 형태로 한정됩니다.
하지만 한 장의 흑백 사진은 2차원 데이터, 컬러 사진은 3차원 데이터입니다. 심지어 배치 모드에 사용되는 여러장의 사진은 4차원 데이터입니다.
그렇기 때문에 전연결 신경망(FC Layer)을 학습시키기 위해서는 고차원의 이미지 데이터를 1차원으로 평면화해야 합니다.
평면화 시키는 과정에서 공간 정보 손실을 초래하기 때문에 그 신경망이 특징을 추출하거나 학습하는 과정에서 비효율적이며 정확도를 높이기 어렵습니다.
공간 정보를 유지한 상태로 학습이 가능하게 하는 것이 바로 CNN입니다.
또한 전연결 신경망을 채용할 경우 가장 왼쪽 첫 번째 픽셀의 값(x1)과 가장 오른쪽 맨 아래 픽셀의 값(xn) 사이의 연관 관계 w1, wn을 계산할 것이지만, 일반적인 이미지 데이터에 있어서 이러한 weight는 필요하지 않을 것 입니다. 그러므로 전연결 신경망을 이용하여 이미지를 학습시키는 것은 아주 비효율적입니다.
또한 이미지속의 해당 object의 위치만 바뀌면 똑같은 pixel임에도 불구하고 feature의 위치에 민감해져 다른 object로 인식하게 될 것입니다.
두 사진에서 ‘입’은 서로 같은 픽셀값을 가진 입이지만 서로 다른 입으로 인식될 것입니다.
하지만 CNN을 사용하게 된다면 검사 중인 특정 픽셀과 그 픽셀의 주변픽셀들과의 연관관계만을 연산합니다.
이 점들 말고도 딥러닝에서 합성곱 신경망을 사용하는 사례가 급증한 이유는 여러가지가 있습니다.
정리하자면
- 각 레이어의 입출력 데이터의 형상 유지
- 이미지의 정보를 유지하면서 인접 이미지와의 특징을 스스로 효과적으로 인식
- 복수의 필터로 이미지 특징 추출 및 학습이 가능
- 필요에 따라 추출 이미지의 특징을 모으고 강화하는 sub sampling 레이어
- 필터를 공유 파라미터로 사용하므로 ANN과 비교하여 학습 파라미터가 매우 적음
등이 있겠습니다.
CNN이 도대체 어떻게 생겼길래 이런 게 가능한 지 살펴봅시다.
CNN(Convolutional Neural Network)
CNN은 전통적인 ANN 앞단에 여러 계층의 컨볼루셔널 계층을 붙인 모양새를 가집니다.
컨볼루셔널 레이어를 통해서 입력 받은 이미지에 대한 특징(Feature)을 추출하고, 이를 기반으로 기존의 전연결된 뉴럴 네트워크를 이용해 분류를 하는 원리입니다.
이 글에서는 CNN이 ANN과 비교하여 갖는 특징을 위주로 설명하고자 핵심이 되는 Convolutional Layer가 포함된 앞쪽의 Feature Learning 부분을 중점적으로 설명하며, 뒷 단의 전통적인 FC Layer가 포함된 Classification 부분은 설명하지 않습니다.
Convolutional Layer
앞서 설명했듯이 입력 데이터로부터 특징을 추출하는 역할을 합니다.
특징을 추출하는 기능의 필터(Filter)와 그 값을 비선형 값으로 바꾸어주는 활성화함수(Activation Function)으로 구성됩니다.
활성화함수를 사용하는 이유는 활성화된 특징만을 다음 계층으로 전달하기 위함입니다. ReLU는 음수값을 0에 매핑하고 양수값을 유지하여 더 빠르고 효과적인 학습을 가능하게하는 특징을 가지므로 많이 사용됩니다.
컨볼루션 레이어에 유입되는 입력 데이터에는 한 개 이상의 필터가 적용됩니다.
또한 1개의 필터는 Feature Map의 채널이 됩니다. 다시 말해 Convolutional Layer에 n개의 필터가 적용된다면 출력 데이터는 n개의 채널을 갖습니다.
Filter & Stride
필터는 이미지의 특징을 찾아내기 위한 공용 파라미터입니다. Filter를 kernel 또는 mask라고 하기도 합니다. CNN에서 Filter와 Kernel은 같은 의미입니다.
필터는 일반적으로 3,3 또는 5,5와 같은 홀수 정방 행렬로 정의됩니다.
필터는 입력 데이터를 지정된 간격(Stride)으로 순회하며(sliding window 방식을 채용) 채널별로 합성곱을 하고 모든 채널의 합성곱의 합을 Feature Map로 만듭니다.
아래 그림은 채널이 1개인 입력 데이터를 3x3 크기의 필터로 합성곱하는 과정을 설명합니다.
stride가 1로 설정되었기 때문에 필터가 1칸씩 이동하면서 합성곱을 계산합니다.
필터는 입력 데이터의 각 채널을 순회하며 합성곱을 계산한 후 채널별 특징맵을 만듭니다. 그리고 각 채널의 특징맵을 합산하여 최종 특징맵으로 반환합니다.
다시 정리하자면 Convolution Layer의 입력 데이터를 필터가 순회하며 합성곱을 통해서 만든 출력 행렬을 Feature Map이라고 합니다.
Activation Map은 Feature Map 행렬에 ReLU등의 활성 함수를 적용한 결과입니다. 즉 Convolution Layer의 최종 출력 결과가 Activation Map입니다.
CNN에서 필터는 보통 그 특징이 데이터에 있는가 없는가를 검출하는 용도로 많이 사용됩니다.
위에서 설명했던 CNN 특징을 다시 상기시키자면, 도대체 filter를 어떻게 만드는 것일까요?
CNN의 신박한 기능이 바로 여기에 있습니다.
무작위로 초기화 되었던 필터는 자동으로 데이터로부터 학습을 함으로써 특징을 인식하고 최적화되는 것이라고 합니다. 즉, CNN에서는 필터의 값을 학습하는 것이 목적이 됩니다. 학습의 대상이 필터인 것이죠.
참고로 CNN의 앞쪽 Layer일수록 저차원, linear하게 결정되며 뒤쪽 layer로 갈수록 고차원으로 결정된다고 합니다.
관련하여 (출처 : https://umbum.dev/223)에 이 내용이 잘 나와있습니다!
Padding
컨볼루션을 구현할 때 첫 번째 닥치는 어려움은 영상의 가장자리 부분을 어떻게 처리할 것인가하는 문제입니다.
예를 들어 컨볼루션 필터가 이미지의 첫 번째 화소 (0,0)에 위치할 때 필터는 이미지의 바깥까지 위치하게 됩니다. 그렇다면 어떻게 이 이미지 밖의 가중치를 결정하고 처리할까요?
패딩은 입력 데이터의 외곽에 지정된 픽셀 만큼을 특정 값으로 채워넣는 것을 말합니다.
첫 번째 방법은 이 값들을 모두 0이라고 가정하는 것 입니다.
이 방법은 아주 간단하고 인공 신경망이 이미지의 외곽을 인식하는 효과도 볼 수 있어 많이 사용하지만, 만약 출력 이미지의 에지 부분이 중요하다면 좋은 방법이라고 하기 어렵습니다.
그럴 경우 두 번째 방법으로 데이터의 가장자리 값을 복사하여 사용하는 방법이 있습니다.
아래 그림은 첫 번째 방법에 대한 예시입니다.
Sub Sampling
Pooling이라고도 합니다. 쉽게 말해 이 단계는 다운 샘플링 과정입니다.
Convolutional Layer를 거쳐서 추출된 특징은 필요에 따라 sub sampling 과정을 거칩니다.
Convolutional 층 이후 어느 정도 특징이 추출되었다해도 이 모든 특징을 가지고 판단을 할 필요가 없습니다. 예를 들어, 고해상도 사진을 보고 물체를 판별할 수는 있지만, 작은 사진으로도 충분히 어떤 사진인지 판단할 수 있는 원리입니다.
그래서 추출된 특징맵을 인위적으로 줄이는 작업을 하는데, 이 과정을 sub sampling이라고 합니다.
필요없는 내용은 버리고 효율적으로 연산을 하겠다는 취지이지요.
sub sampling 방법은 여러가지가 있습니다.
대표적으로 max pooling, average pooling, L2-norm pooling 등이 있는데, 이 중 max pooling 이 많이 사용됩니다.
꼭 해야하는 것도 아니라면서 이런 과정을 굳이 거치는 이유는 전체 데이터 사이즈가 줄어드는 것이므로 연산에 소요될 컴퓨팅 리소스가 절약되며, 데이터 크기를 줄이는 과정에서도 정보 손실이 어느 정도 발생되지만 이를 통한 과적합(Overfitting)을 방지하는 효과를 얻을 수도 있다는 장점들 때문입니다.
헷갈려하는 경우가 있어 sub sampling 과 convolutional layer에서의 과정을 비교하자면 sub sampling은 아래와 같은 차이가 있습니다.
- 학습 대상 파라미터가 없음
- sub sampling layer를 통과한 이후 행렬의 크기는 감소하지만 채널 수 변경은 전혀 없음
sub sampling을 하는 경우 Feature Learning 과정은 convolutional layer와 sub sampling의 반복 조합으로 이루어집니다.
Max Pooling
다양한 풀링 방법 중 max pooling은 특징맵을 MxN 크기로 잘라내고, 그 중 가장 큰 값만을 추출하는 방법입니다.
아래 그림은 4x4 Activation Map이 나와있고, 이에 대해 2x2 max pooling 마스크를 가지고 2 stride로 하여 다운 샘플링하는 과정을 보입니다.
(max pooling은 이처럼 쉽고 간단하여 많이 사용되지만, 데이터의 사이즈를 강제로 줄이는 개념이기 때문에 연구분야에서는 사용을 지양하는 추세라고 합니다.)
CNN의 Feature Learning 과정이 끝난 이후에는 FC Layer로 가 모든 픽셀을 검사하게 됩니다.
개인이 공부하고 포스팅하는 블로그입니다. 작성한 글 중 오류나 틀린 부분이 있을 경우 과감한 지적 환영합니다!