Research/ML, DL

딥러닝 알고리즘의 대세, 컨볼루션 신경망(convolutional neural network, CNN)

bskyvision.com 2019. 3. 1. 17:20

인공지능이 핫하다. 핫하게 된 지 벌써 꽤 오랜 시간이 지났다. 인공지능이 발전하게 된 계기로는 크게 세 가지 이유를 생각해 볼 수 있다.

 

1) 딥러닝 알고리즘의 발전. 2) 데이터량의 폭발적인 증가. 3) GPU의 발전.

 

딥러닝 알고리즘은 가장 간단한 피드포워드 신경망(feed-forward neural network)부터 시작되었다. 우리 뇌에 있는 뉴런들이 층층이 연결되어 있는 것을 모방한 것이다. 피드포워드 신경망은 인공신경망(artificial neural network)이라 불리기도 한다. 

 

하지만, 신경망의 층수가 늘어나면서 경사감소소멸(gradient descent vanishing) 문제가 발생했다. 쉽게 말해서 역전파(BP, back propagation)를 통해 신경망 내의 가중치들이 제대로 훈련이 되지 않았다. 신경망 층이 늘어나면서 출력층의 정보가 역전파되는 과정에서 판별력이 소멸되었기 때문이다[3]. 이 문제를 해결하기 위해서 신뢰심층망(DBN, deep belief network)과 stacked auto-encoder(SAE) 등의 방법이 제안되었다. DBN과 SAE는 각 층의 가중치들을 우선 사전학습(pre-training)을 통해 어느 정도 정확해에 근접한 값으로 보정한 후에 튜닝(fine-tuning)과정을 통해 최종 가중치를 계산하는 방식들이다. 

 

또한 사람의 시각인지 과정을 모방해서 피드포워드 신경망에 추가한 컨볼루션 신경망(CNN, convolutional neural network)이 개발되었다. CNN은 컴퓨터 비전 쪽 딥러닝계를 거의 평정해버렸고, CNN의 구조를 변경하는 방식으로 딥러닝 알고리즘들이 계속해서 발전해가고 있다. 

 

그림1. 딥러닝의 발전사

 

이미지 분류(image classification) 분야에서는 LeNet, AlexNet, VGGNet, GoogLeNet, ResNet, SENet 등이 개발되어 사용되고 있다. 객체 검출(object detection) 분야에서는 RCNN, Fast RCNN, Faster RCNN, SPP Net, Yolo, SDD, Attention Net 등이 사용되고 있다. 이미지 분류와 객체 검출의 차이에 대해서는 링크 건 글을 참고하세요(https://bskyvision.com/413). 그리고 Semantic Segmentation 분야에서는 FCN, DeepLab v1, v2, U-Net, ReSeg 등이 활용되고 있다. 이 알고리즘들의 이름을 지금 외울 필요는 없다. 중요한 것은 이 모두가 초기 CNN을 발전시킨 알고리즘들이라는 것이다. 

 

그래서 오늘은 딥러닝의 핵심 알고리즘인 CNN의 구조에 대해서 정리하려고 한다. 

 

컨볼루션 신경망이란?

전통적으로 컨볼루션 신경망(CNN)은 이미지 분류를 위해 사용되었다. 어떤 이미지를 CNN에 입력시켜주면, 그 이미지가 개인지 고양이인지 소인지를 분류해내는 목적으로 사용되어왔다. 기존의 피드포워드 신경망의 경우 이미지 픽셀값들을 그대로 입력받아서 어떤 클래스에 속하는지 분류해냈다. 하지만 같은 고양이 이미지라도 살짝 회전되어 있거나, 크기가 다르거나, 변형이 조금만 생겨도 분류하는데 어려움을 겪었다. 그런 경우에 대한 훈련데이터가 모두 필요했고, 그만큼 훈련시간도 상당히 길어진다는 단점이 있었다. 그래서 이미지 픽셀값들을 그대로 입력받는 것보다는 이미지를 대표할 수 있는 특성들을 도출해서 신경망에 넣어주는 것이 선호되었다. 어떤 특성을 도출해야 분류에 도움이 될지는 사용자의 판단에 따라 결정되었다. 예를 들어 사과와 바나나를 분류하는 문제라면 색에 대한 특성, 길이에 대한 특성, 형태에 대한 특성들을 도출하는 식이었다. CNN은 이 특성 도출과정을 자동화시켰다. 

 

CNN은 입력된 이미지로부터 이미지의 고유한 특징을 부각시킨 특성지도(feature map)를 새로 만들어낸다. 그 특성지도는 피드포워드 신경망에 입력되어 이미지가 어떤 클래스 라벨에 속하는지 분류해준다. 그래서 CNN에 사용되는 피드포워드 신경망은 분류 신경망으로 불리기도 한다. 정리하자면, CNN은 특성 추출 신경망과 분류 신경망을 직렬로 연결한 구조로 되어 있다고 말할 수 있다(그림2 참고). 

 

그림2. CNN 구조[4]

 

 

이미지를 수평 엣지 필터와 컨볼루션해주면 수평 엣지가 강조된 이미지를 얻게 되고, 이미지를 수직 엣지 필터와 컨볼루션해주면 수직 엣지가 강조된 이미지 등을 얻게 된다. 여기서 어떤 필터가 사용될지는 훈련 과정을 통해 결정된다. 필터 행렬의 값이 학습을 통해 결정된다는 뜻이다. 컨볼루션 또는 필터링 과정을 통해 얻은 특성지도들은 ReLU와 같은 활성함수를 거쳐 출력된다. 그 다음에 서브샘플링(subsampling) 또는 풀링(pooling)이라고 불리는 과정을 통해 활성화된 특성지도들의 크기를 줄인다. 이 특성지도들에 다시 컨볼루션, 활성화, 서브샘플링을 수행해서 점차적으로 로컬한 특성지도로부터 글로벌한 특성지도를 만들어간다. 이 과정을 여러번 반복하여 얻어진 최종 특성지도는 fully-connected layer, 즉 피드포워드 신경망에 입력되어 분류 작업을 시행한다. 

 

CNN 네트워크 안에서 어떤 일이 일어나는 것인지는 그림3을 참고하면 좋다. 컨볼루션, 활성화, 서브샘플링 과정을 반복함으로 저차원적인 특성부터 시작해서 고차원적인 특성을 도출해나간 후 최종 특성을 가지고 분류작업을 실시하는 것이다. 

 

그림3. CNN 내에서 일어나는 일을 가시화한 것.

 

글을 마무리하며...

컴퓨터 비전 분야에서 사용되는 딥러닝 알고리즘 중에 단연 강자는 CNN이다. 내가 연구하는 분야인 이미지 품질 평가에서도 이 CNN을 활용한 연구 결과물들이 3-4년 전부터 많아지고 있다. 

 

글이 도움이 되셨다면 공감을 눌러주세요. 공감과 댓글은 척박한 연구실 생활에 큰 힘이 됩니다. ㅎㅎ 

 

관련 글

오차 역전파(error backpropagation) 개념 제대로 파악하기

[Anaconda+python] 의상 분류기 만들어서 훈련시키고 테스트하기2(컨볼루션 신경망)

[Anaconda+python] CIFAR-10 데이터셋으로 이미지 분류기 만들기(컨볼루션 신경망)

 

참고자료

[1] https://reniew.github.io/08/, CNN의 발전사

[2] https://laonple.blog.me/220587920012, 라온피플 CNN 개요

[3] 김의중 지음, "알고리즘으로 배우는 인공지능, 머신러닝, 딥러닝 입문", 위키북스

[4] https://sungjk.github.io/2017/04/27/Ch6-convolutional-nn.html, 제레미's 블로그, 컨벌루션 신경망

[5] https://wiki.tum.de/display/lfdv/Convolutional+Neural+Networks