배너
닫기

테크노트

배너

CNN(Convolution Neural Network) (2)

  • 등록 2018.09.05 10:57:49
URL복사
[#강추 웨비나] 설계 산업의 미래 다가가기: AI기능 및 신기능 업무에 적용하기 (6/12)

[첨단 헬로티]

 

LAON PEOPLE’s 머신러닝 아카데미 (6)


머신비전산업에서 인공지능 기술(머신러닝, 딥러닝)이 빠르게 확산되고 있다. 인공지능 기술을 통해 기존의 컴퓨터비전 기술로는 어려웠던 검사가 가능해질 뿐만 아니라 ‘데이터의 자기 학습’으로 보다 빠르고 쉬우며 신뢰성과 유연성을 갖춘 머신비전 검사가 가능해졌다. 이에 따라 자연스럽게 인공지능 기술에 대한 관심이 높아지고 있다. 국내 대표적인 머신비전 전문업체인 라온피플은 ‘LAON PEOPLE’s 머신러닝 아카데미’를 통해 인공지능의 대표적인 기술인 머신러닝 기술에 대해 연재한다.  


Convolution Layer


convolution을 사용하면 영상이 갖는 공간적인 특성(local receptive field)을 최대한 활용하고, 전체 영상에 대해 가중치 및 바이어스를 공유(shared parameter)하여 자유 변수(free parameter)의 수를 줄임으로써 CNN 학습 시간을 줄이고, overfitting의 가능성을 줄일 수 있으며, 영상에서 잘 구별할 수 있는 특징(salient feature)을 얻을 수 있게 해준다.

실제 구현 시에는 어떻게 되는지 다음에서 살펴보자.


1. ‌Lecun - ‘Gradient-based learning applied to document recognition’

아래 그림1은 Lecun이 발표한 유명한 논문(4500번 이상 인용) ‘Gradient-based learning applied to document recognition’에 실린 블럭도이다. LeCun은 CNN의 개념을 처음으로 만든 사람이며, 이 논문은  한동안 정체기에 빠진 신경망 연구에 돌파구가 되었다. LeCun은 이 논문을 통해, CNN이 필기체 인식에 있어 탁월한 효과가 있음을 입증하였으며, 이후 이 논문에 자극을 받은 많은 사람들이 CNN을 사용하여 다양한 분야에서 놀라울 만한 성과를 보여주었다.


▲ 그림 1. ‘Gradient-based learning applied to document recognition’에 실린 블럭도


1) Lecun - CNN의 구조

이 논문을 보면, 32x32 크기의 입력 영상에 대해, 먼저 5x5 convolution을 적용하여 28x28 크기를 갖는 6개의 feature map을 생성하고, 이것을 다시 sub-sampling(pooling)을 거쳐 6개의 14x14 크기의 중간 영상을 만들어낸다. 


다시 이것에 대해 5x5 크기를 갖는 kernel을 사용해 convolution을 수행하고 총 16개 feature map을 갖는 10x10 영상을 만들어내고, sub-sampling을 통해 총 16개의 5x5 영상을 얻는다. 그 중 120개를 선택하여 FC(Fully connected) NN에 연결하고 최종적으로 10개의 class를 분류할 수 있도록 하였다.


2) Lecun - CNN 적용 결과 

아래 그림2는 LeCun이 개발한 CNN을 이용하여 실제로 필기체 숫자 인식 루틴을 수행했을 때, 각 단계별로 얻을 수 있는 결과들을 보여주는 것이다. C1~F6까지의 각 단계별 중간 영상을 보면, 1단계와 2단계 convolution 과정을 거치면서 어떤 feature map을 얻어 낼 수 있는지 알 수 있으며, convolution 결과로 얻어진 다양한 feature map의 조합을 통해 잡음이 많이 끼어 있는 영상들에 대해서도 탁월한 결과를 내는 것을 볼 수가 있다.


▲ 그림 2. CNN 이용해 필기체 숫자 인식 루틴을 수행했을 때, 각 단계별로 얻을

수 있는 결과


그림2에서 C1과 C3는 각각의 convolution을 거쳐서 얻어진 feature map 영상을 보여준다. C1 단계에서는 6개의 다른 feature map을 얻을 수 있도록 서로 다른 convolution kernel이 적용이 되었고, C3 단계에서는 16개의 다른 feature map을 얻을 수 있는 서로 다른 convolution이 적용 되었다. C1과 C2 convolution 단계 및 S2와 S4 pooling 단계를 거치면서, topology 변화에 강인한 특성을 갖게 되었으며, 결과적으로 인식 능력이 크게 개선되었다. 그림2를 보면, 상단의 비교적 깨끗한 영상 뿐만 아니라 하단처럼 상당한 잡음이 있는 경우에 대해서도, 각각의 convolution kernel이 각각 다른 특징을 추출해내는 것을 알 수가 있다.


2. ‌Krizhevsky - ‘ImageNet classification with deep convolution neural network’

아래 그림3은 3800회 이상 인용이 된 Krizhevsky의 유명한 논문 ‘ImageNet classification with deep convolution neural network’에 나오는 또 다른 신경망의 구조를 보여준다. 이 논문에서 Krizhevsky는 ImageNet ILVRC-2010 120만개의 영상을 약 1000개의 class로 분류하는데 CNN을 사용하여 압도적인 결과를 얻을 수 있었다. 또한 GPU에 적용하여 괄목할만한 성과를 냈고, 관련 소스 코드까지 공개를 하여, 이후 많은 연구자들의 연구 결과에 큰 영향을 끼쳤다.


▲ 그림 3. ‘ImageNet classification with deep convolution neural network’에 나오는 신경망의 구조


1) Krizhevsky - CNN의 구조 

Krizhevsky는 224x224x3 크기를 갖는 color 영상에 대해 총 5단계의 convolution을 적용하였으며, 1단계에는 11x11 크기의 convolution kerney을 사용하고 건너뛰기(stride)4를 적용하여, 최종적으로 55x55 크기를 갖는 96개의 feature map을 얻을 수 있었다. 2단계에는 1단계 영상에 대해 normalization과 max-pooling 단계를 거치고, 5x5 크기를 갖는 kerney을 적용하여 총 256개의 feature map을 얻었으며, 3단계에선 3x3 크기를 갖는 kernel을 적용하여 총 384개의 feature map을 얻었으며, 4단계는 max pooling 단계없이 3x3 convolution 을 적용하여 다시 13x13 크기를 갖는 384개의 feature map을 얻었으며, 5단계에서는 비슷하게 256개의 feature map을 얻었다. 이후 과정은 비슷하다.


2) Krizhevsky - 1 단계 convolutional kernel

아래 그림4는 Krizhevsky가 1단계 과정에 적용한 96개의 kernel을 보여준다. 얼핏 보기에는 어떤 특징을 추출할 수 있는지 한눈에 파악이 어렵겠지만, 바로 이런 kernel을 갖는 여러 단계의 convolution 중첩을 통해 영상을 1000개의 class로 분류할 수 있는 특징을 추출할 수 있게 되었다.


▲ 그림 4. Krizhevsky가 1단계 과정에 적용한 96개의 kernel


영상 처리(Image processing) 이론을 배우면 convolution(영상으로부터 각각 다른 특징을 추출해 낼 수 있기 때문에 filter라고도 부름)을 통해 영상을 부드럽게 보이게 하거나 에지 등을 추출할 수 있는데, 이때 대부분 필터의 계수가 고정이 되어 있다. CNN에서의 convolution은 이처럼 계수가 고정이 되어 있는 것이 아니라, 학습을 통해 계수 값을 정한다는 점이 다르다. 


즉, CNN 알고리즘을 통해 처리하고자 하는 과제에 따라 최종 convolution kernel의 계수가 달라질 수 있음을 뜻하며, 동일 과제일지라도 학습에 사용하는 학습 데이터에 따라서도 달라질 수 있고, 설정한 hyper-parameter의 값에 따라서도 달라질 수 있다는 것을 의미한다. 


계수의 값은 기존 신경망과 마찬가지로 gradient에 기반한 back-propagation에 의해 결정이 된다.또 한가지 주목해야 할 점은 Krizhevsky의 논문은 LeCun의 논문과는 좀 구조가 다른 점이다. Krizhevsky의 논문에서 위/아래로 구조가 나눠져 있는 것은 2개의 GPU에 적용을 하기 위함이다. 이 논문에서는 stride라는 개념이 적용되었고, convolution을 거치고 max-pooling 단계없이 곧바로 convolution을 적용하는 등 구조가 상당히 다르며 convolution의 단계도 5단계나 된다. 이렇게 구조가 달라지고, 이것들이 무슨 의미를 갖고, 어떻게 정할 것인가에 대해서 여러 시스템 변수(hyper-parameter)에 대해서는 알아보아야 한다.


얼핏 보더라도 CNN은 기본 신경망(MLP)에 비해 복잡해 보이기 때문에 짐작을 했겠지만, CNN에서는 더 많은 hyper-parameter에 대해 신경을 써줘야 한다. 그중 convolution layer에 관련된 중요한 hyper-parameter가 바로 필터의 개수와 필터의 형태이다.

 

(1) Filter의 개수

 Feature map의 크기(즉, convolutional layer의 출력 영상의 크기)는 layer의 depth가 커질수록 작아지기 때문에, 일반적으로 영상의 크기가 큰 입력단 근처에 있는 layer는 filter의 개수가 적고, 입력단에서 멀어질수록 filter의 개수는 증가하는 경향이 있다. 무턱대고 감으로 필터의 개수를 정할 수도 없는데, 과연 어떤 원칙으로 필터의 개수의 정할까? 먼저 CNN에서 convolution layer의 연산 시간을 살펴보자. 연산 시간은 대략적으로 아래의 수식으로 결정이 된다.


Tc = Np x Nf x Tk 


(Tc: 각 layer에서의 연산시간)

(Np: 출력 pixel의 수)

(Nf: 전체feature map의 개수)

(Tk: 각 filter 당 연산 시간)


필터의 개수를 정할 때 흔히 사용하는 방법은 각 단에서의 연산 시간/량을 비교적 일정하게 유지하여 시스템의 균형을 맞추는 것이다. 이를 위해 일반적으로는 각 layer에서 feature map의 개수와 pixel 수의 곱을 대략적으로 일정하게 유지시킨다. 그 이유는 위 식에서 살펴본 것처럼 convolutional layer에서의 연산 시간이 픽셀의 수와 feature map의 개수에 따라 결정이 되기 때문이다. 보통 pooling layer를 거치면서 2x2 sub-sampling을 하게 되는데, 이렇게 되면 convolutional layer 단을 지날 때마다, pixel의 수가 1/4로 줄어들기 때문에 feature map의 개수는 대략 4배 정도로 증가시키면 될 것이라는 것은 감을 잡을 수가 있을 것이다. 


Feature map의 개수는 가중치와 바이어스와 같은 free parameter의 개수를 결정하며, 학습 샘플의 개수 및 수행하고자 하는 과제의 복잡도에 따라 결정이 된다.


(2) Filter의 형태

필터의 형태는 논문마다 상당히 다르다는 것을 알 수 있으며, 학습에 사용하는 학습 데이터 집합에 따라 적절하게 선택을 한다. 일반적으로 32x32나 28x28과 같은 작은 크기의 입력 영상에 대해서는 5x5 필터를 주로 사용을 하지만, 큰 크기의 자연 영상을 처리하거나 1 단계 필터에 11x11이나 15x15와 같은 큰 크기의 kernel을 갖는 필터를 사용하기도 한다. 


LeCun의 논문에서는 5x5로 동일한 크기를 갖는 convolutional kernel을 사용했지만, Krizhevsky의 논문에서는 1단에서는11x11, 2단계에서는 5x5, 3단계 이상은 3x3 크기를 갖는 convolutional kernel을 사용했다. 그렇다면, 큰 kernel 크기를 갖는 필터 1개을 사용하는 것이 좋을까? 아니면 작은 크기를 갖는 filter 여러 개를 중첩해서 사용하는 것이 좋을까? 결론부터 말하자면, 결과는 여러 개의 작은 크기의 필터를 중첩해서 사용하는 것이 좋다. 이는 작은 필터를 여러 개 중첩하면 중간 단계에 있는 non-linearity를 활용하여 원하는 특징을 좀더 돋보이도록 할 뿐만 아니라, 작은 필터를 여러 개 중첩해서 사용하는 것이 연산량도 더 적게 만든다.


(3) Stride 값

Stride는 convolution을 수행할 때, 건너 뛸 픽셀의 개수를 결정한다. 쉽게 설명하기 위해, 1차원의 경우를 예를 들면 아래 그림5와 같다.


▲ 그림 5. 1차원의 경우


그림5에서는 1차원 convolution 커널이 {1, 0, -1}이고 입력 데이터가 {0, 1, 2, -1, 1, -3, 0}인 경우 왼쪽은 stride 1을 적용하여 출력 {-2, 2, 1, 2, 1}을 얻는 경우이고, 오른쪽은 한 픽셀씩 건너뛰면서 convolution을 수행하여 {-2, 1, 1}을 얻는 경우를 보여준다. 위 그림5처럼, stride는 건널 뛸 픽셀의 수를 나타내며, 2차원인 영상 데이터에 대해서는 가로 및 세로 방향으로 stride에서 정한 수만큼씩 건너 뛰면서 convolution을 사용한다. 


앞서 살펴본 LeCun의 논문은 stride를 1을 사용했지만, Krizhevsky의 논문에서는 1단계 convolution에서는 stride 값을 4를 사용하고, 나머지에서는 1을 사용했다. Stride는 입력 영상의 크기가 큰 경우, 연산량을 줄이기 위한 목적으로 입력단과 가까운 쪽에만 적용을 한다. 


그럼 stride를 1로 정하고, pooling을 적용하는 방식과 stride 값을 크게 하는 방식에는 어떤 차이가 있을까? Stride를 1로 하면, 경계가 아닌 모든 입력 영상에 대해 convolution 연산을 수행하고 pooling을 하면서 값을 선택적으로 고를 수가 있지만, stride를 크게 하면 그런 선택의 기회가 사라지게 된다. 그러므로 통상적으로 보았을 때는 stride를 1로 하고, pooling을 통해 적절한 sub-sampling 과정을 거치는 것이 결과가 좋다. 하지만 Krizhevsky의 논문처럼, 큰 영상에 대해 CNN을 적용하는 경우는 연산량을 줄이기 위해 입력 영상을 직접적으로 처리하는 1단계 convolutional layer에서는 stride 값을 1이 아닌 값을 적용하기도 한다.


(4) Zero-padding 지원 여부

아래 그림6은 유명한 LeCun의 논문에 나오는 CNN의 구조를 보여준다.


▲ 그림 6. LeCun의 논문에 나오는 CNN의 구조


그림6을 보면 32x32 입력 영상에 대해 kernel의 크기가 5x5인 convolution을 적용하면 feature map의 크기가 28x28로 줄어 들었고, 14x14 영상에 대해 다시 5x5 convolution을 수행하면 결과는 10x10으로 줄어드는 것을 볼 수가 있다. 보통 convolution 연산을 하게 되면, 경계 처리문제로 인해 출력 영상인 feature map의 크기가 입력 영상보다 작아지게 된다. zero-padding은 작아지는 것을 피하기 위해 입력의 경계면에 0을 추가하는 것을 말하며, FFT 등에서도 많이 사용이 된다. 만약에 입력 영상의 경계에 0을 2 픽셀씩 추가하여 36x36 크기의 영상을 만들었다면 feature map의 크기는 32x32가 된다. 이렇게 zero-padding을 지원하면 영상 크기를 동일하게 유지할 수 있다. 


그럼 zero-padding을 하는 이유는 무엇일까? 단순하게 영상의 크기를 동일하게 유지하는 장점 이외에도, 경계면의 정보까지 살릴 수가 있어 zero-padding을 지원하지 않는 경우에 비해 zero-padding을 지원하는 것이 좀더 결과가 좋다. 


(주)라온피플










배너









주요파트너/추천기업