반응형

※ 학습하는 과정이기 때문에 틀린 내용이 있을 수 있습니다. 댓글로 지적 부탁드립니다.

 

초기 딥러닝 분야에서 주로 사용했던 방법론은 Fully Connected를 이용한 신경망 구조였다. 이는 단순이 모든 변수들과 가중치에 대한 노드를 빠짐없이 연결한 방법으로 연산, 시간, 속도 모든 측면에서 좋은 방법론이 아니었다. 2000년 즈음부터 Convolution에 대한 연구가 활발히 진행되었으나 막대한 연산비용, 미흡한 컴퓨팅파워 등으로 주목을 받지 못하였다.

 

그러던 중 2012년 ImageNet 대회에서 ResNet이 등장하면서 CNN은 부활의 신호탄을 쏘아 올렸다.

 

Convolution이란 합성곱 이라는 말로 고등학교 수학시간때 많이 보았던 합성함수의 형태를 생각하면 된다. 간단히 말하자면 두 함수간 연산을 하고자는 것이다. 딥러닝 분야에서는 주로 Input으로 들어오는 이미지에 대하여 Feature(특징)을 추출하기 위해서 사용되는 연산을 뜻한다.

 

CNN을 이해하기 위해서 기초적인 내용을 살펴보도록 하자.

 

Image

Convolution에 대해 학습하기에 앞서 이미지에 대하여 구체적으로 알아야할 필요가 있다.

 

1. Chennel

컬러이미지는 3가지 채널로 구성되어있으며, 흑백이미지는 1가지 채널로 구성되어있다. 여기서 채널이라함은 0~255 사이의 값들로 구성되어있는 색정보를 나타내주는 형상이라고 생각하면 된다.

 

예를들어 흑백이미지는 흰/검의 색조합만으로 모든 표현을 할 수 있다. 컬러이미지는 흰검으로는 모든 색을 표현할 수 없기때문에 빨강, 초록, 파랑 3가지의 색조합으로 표현을 하게 된다.

 

컬러이미지는 R,G,B 3가지 채널로 구성되어있다.(https://en.wikipedia.org/wiki/Grayscale)

2. Shape

또한가지 집고 넘어가야 하는 부분은 표현이다. 딥러닝을 접하다보면 이미지의 형상(Shape) 때문에 종종 뚝배기가 터질때가 있기 때문이다.

 

1024x1024의 크기를 가진 컬러 이미지 1장에 대한 표현은 (# of Image, Weigth, Heigth, Channel) = (1, 1024, 1024, 3)으로 표기한다.

 

마찬가지 방법으로 512x512의 크기를 가진 흑백이미지 5장에 대한 표현은 (5, 512, 512, 3) 으로 표기한다. Pytorch와 Tensorflow 에서는 Channel정보의 위치가 조금 다르기는 하지만 기본적인 개념은 위와 같다.

 

3. 축소

Convolution 연산을 하게되면 이미지가 줄어들기도 하고 Pooling이라는 작업을 거치면 일반적으로 절반으로 축소된다. 이렇게 이미지가 축소되는 경우에 이미지 자체에 어떤일이 일어나는지 알아야한다.

 

왼쪽 과일 이미지의 형상이 (1, 450, 450, 3)이라고 해보자. 가운데 이미지는 원본 이미지를 50배 축소 시킨것이다. 이렇게 이미지를 축소하게 되면 가운데 이미지의 가장 왼쪽 상단의 Grid Cell에 해당하는 픽셀값은 하나의 숫자로 나타날 것이다.

 

하지만 왼쪽 이미지에서 같은 영역에 해당하는 Grid Cell은 50개의 픽셀값이 존재한다. 즉 모종의 방법으로 픽셀값들을 합쳐서 이미지를 축소한 것이다. 이것이 중요한 이유는 Convolution 연산을 통해 이미지가 축소되는데, 이때 픽셀에 대한 정보가 지속적으로 손실된다는 사실이다.

(추후 Visualizing and Understanding Convoluional Networks에서 더욱 자세히 살펴볼것이다)

 

이미지가 축소되면 픽셀정도가 손실된다

 

Convolution Layer

 

Convolution Layer를 알기 위해서는 몇가지 용어와 같이 알아보아야 한다. 웹에 돌아다니는 아주 유명한 그림이 있다. 이것을 함께 보자.

 

Convolution 연산의 모든것을 보여주는 짤방이다

 

가운데 Filter W0, Filter W1 라고 써있는 부분이 Convolution Layer이다. 자세히 보면 (3x3x3)으로 되어있는데 이것은 Conv Layer의 형상이 (Channel, Width, Height) = (3, 3, 3) 라는 뜻이다.

 

특이하게 Channel에 대한 차원이 맨 앞쪽으로 배치되어있는 이유는, Input으로 들어오는 이미지의 형상인 (1, 5, 5, 3) 인데, Channel 값과 동일하게 맞추어주어야 하기 때문이다. 이 부분이 맞지 않으면 에러가 난다. 그리고 W0, W1의 뜻은 Filter가 2개가 있다는 것인데 이것은 출력이 될 Channel의 수를 정한다. 또한 Filter의 각 값들은 가중치(Parameter)라고 부른다.

 

  • Input Image = (1, 5, 5, 3)
  • Conv Layer = (3, 3, 3, 2) # 2는 Filter의 갯수
  • Output Feature Map = (1, 3, 3, 2)

 

1. Stride

Conv Layer는 이미지를 Sliding 하면서 왼쪽에서 오른쪽으로, 위에서 아래로 훑어 내려가기 시작한다. 이때 얼마만큼 이동할것인가에 대한것이 Stride이다. 위 짤방의 예시에서는 Conv Layer가 2칸씩 이동하고 있으므로 Stride=2가 된다. 때문에 큰 값의 Stride를 지정하면, 픽셀에 대한 정보를 제대로 추출할 수 없게될 뿐만아니라 Output Feature Map의 크기가 줄어든다는 것은 직관적으로 이해할 수 있을것이다.

 

2. Padding

입력 이미지의 테두리를 보면 회색으로 0이 채워져 있는것을 볼 수 있다. 이것은 Padding=1로 처리한것이다. 이짓을 하는 이유는 Output Feature Map의 형상을 조절하기 위함이다.

 

3. Feature Map

Input으로 들어온 이미지가 Convolution 연산을 거친후 출력되는 산출물을 Feature Map(혹은 Activation Map)이라고 한다. Feature Map은 픽셀정보들의 특.징 이다. 이것은 Conv Layer와도 밀접하게 관련이 있다. 이것도 추후 Visualizing and Understanding Convoluional Networks에서 더 자세히 알아보기로하고, 이정도로만 이해하고 넘어가자

 

Pooling Layer

매우 복잡하고 많은 가중치를 가진 모델이 A라는 사건을 해결하기 위해 설계됐다고 생각해보자. 그러던 중 A와 유사한 사건인 B 사건이 발생했다. 우리는 이 사건이 A 사건과 유사한 사건이라 판단하여 A 모델을 도입하였지만 이상하게 해결이 되지 않았다.

 

왜냐하면, A 모델의 가중치가 너무 많아서(수억개) 몇개~몇백개가 수정된다 하더라도 사건 A를 푸는데 너무 최적화되어 버려 다른 사건을 해결하지 못하는 것이다. 즉, 사건 A에 너무나도 적합(Over-Fit) 해버리게 되어 유사한 B사건도 해결하지 못하게 되는것이다.

 

딥러닝 모델의 깊은 신경망은 상당히 많은 가중치를 가지고 있다. 따라서 Over-Fit을 방지하기 위해 정보를 최대한 보존하면서 가중치의 수를 줄여주어야 한다. 이러한 방법이 Pooling이다.

 

Max Pooling(좌) / Global Average Pooling(우)

 

1. Max Pooling

일반적으로는 Feature Map을 2x2 크기의 Layer로 Sliding하여 훑어 내려가는 방식이다. 그리고 2x2 내부의 해당하는 Grid Cell에서 가장 큰(Max) 값을 뽑아내는 것이다. 물론 2x2가 아니라 다양한 크기로 사용하기도 한다.

 

2. Global Average Pooling

일반적으로 신경망의 맨 마지막 Feature Map을 Pooling할때 한번 사용한다. 이전 Layer에서 획득한 Feature Map에서 각각의 Channel에 대하여 평균을 낸 값을 하나씩 뽑아내는 것이다.

 

Activation Layer

Activation Layer는 Feature Map을 적절하게 변형시켜주는 역할을 한다. 변형을 시키는 이유는 다양한데, Loss 계산을 보다 최적화 하기위해서기도 하고 선별적으로 값을 컨트롤 할 수 있기 때문이다. 가장 잘 알려진 Activation Function은 ReLU, Sigmoid, SoftMax가 있다.

 

1. ReLU

ReLU는 0이하의 음수를 0으로 변환한다

가장 많이 사용하는 활성함수이다. 주로 Conv Layer 뒤에 붙여서 사용하게된다. 그 이유는 역전파 방식을 통해 미분을 하다보면 초기 Layer로 돌아갈 수록 가중치에 대한 영향력이 사라져버리게 되는 Gradient Vanishing 문제가 발생하게 된다.

 

초기 CNN은 활성함수로 Sigmoid를 사용했는데 이것이 문제가 된다는것을 발견하였고, 2006년 Hinton교수는 ReLU를 제안하였다. 현재까지도 사용되는 강려크한 활성함수이다.

 

2. Sigmoid / SoftMax

모든 값을 0~1 사이의 값으로 변환한다

Sigmoid는 최종 Feature Map에서 출력을 제어하는 활성함수로 많이 사용한다. 통계학에서 사용하는 Logistic Regression에 사용되는 모델이며 이진분류(Binary Classification)가 가능하다. 두개 이상을 분류하고 싶을때믄 SoftMax 활성함수를 사용하면 된다. 활성함수와 관련된 자세한 내용은 추후에 한번 더 다루도록 하겠다.

 

마치며

Vision 관련하여 공부를 하다보니 다시한번 CNN의 기본 개념에 대해서 책을 펼처볼 일이 생겼다. 어줍잖게 알고 넘어가서 그런것인지 알고있는 개념도 햇갈리기 시작하였다. 사상누각이라 했던가, 기초가 중요하다는것을 다시한번 깨닳았다.최대한 자세히 써본다고는 하였지만, 내맘에 쏙 들지도 않았고 무엇보다 지식을 말이나 글로 옮긴다는것이 상당히 어렵다는것을 알게되었다.(모든 기술블로거들 Respect!) 이번기회에 차근차근 정리하면서 CNN부터 시작하여 포스팅을 하며 탄탄한 지식을 마련할 수 있도록 해야겠다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기