본문 바로가기

ML/CNN

1. CNN ?

 

DNN(Deep Neural Network) → CNN(Convolutional Neural Networks) 전환기

DNN(Deep Neural Network)은 다양한 사례를 해결해주는 머신러닝으로 급부상했었다. 일반 수치형, 범주형 변수로 이루어져 있는 데이터는 모든 파라미터를 다 고려하여 모델링을 하는 것이 좋을 수도 있겠지만, 문제는 이미지와 같이 고차원의 데이터에서는 DNN의 모델링이 제대로 작동하지 않는다는 것이다. 여기서 등장한 것이 CNN이다. CNN은 어떤 점이 특별하기에 DNN의 문제점을 해결했을까?

 

 

1. CNN( Convolutional Neural Networks 합성곱 신경망 )

딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이며 이름에서 알 수 있다 시피 Convolution이라는 전처리 작업이 들어가는 Neural Network 모델이다.

일반 DNN(Deep Neural Network)과 합성곱 신경망(CNN)의 차이는 일반 DNN(Deep Neural Network)은 1차원 형태의 데이터(Fully-Connected layer(FC layer 혹은 Dense layer)를 사용한다. 때문에 DNN의 데이터는 2차원 데이터의 이미지가 flatten 시켜서 한 줄로 입력되어 이미지의 공간적/지역적 정보(spartial/totpological info)가 손실되며, 추상화 과정 없이 바로 연산과정으로 넘어가 학습시간과 능률이 저하된다.

 

 

 

CNN은 이미지를 그대로 받음(2차원 이상의 데이터)으로써 공간적/지역적 정보를 유지한 채 특성(feature)들의 계층을 빌드업한다. CNN의 중요 포인트는 이미지 전체보다는 부분을 보는 것, 이미지의 한 픽셀과 주변 픽셀들의 연관성을 살린다.

 

예를 들어 어떤 이미지가 주어졌을 때 이것이 새의 이미지인지 아닌지 결정하는 모델을 만든다면 새의 주요 특징인 새의 부리가 주요 포인트가 될 수 있다. 때문에 이미지에 새의 부리가 있는지 없는지가 중요 척도가 될 것이다. 하지만 전체 이미지에서 새의 부리 부분은 비교적 작은 부분이다. 모델은 전체 이미지를 보는 것보다 새의 부리 부분을 잘라서 보는 게 더 효율적이다.  CNN의 뉴런은 패턴을 파악하기 위해 전체 이미지를 다 보지 않는다.

 

 

2. CNN의 전체적인 네트워크 구조

CNN은 위 이미지와 같이 이미지의 특징을 학습하는 부분과(FEATURE LARNING) 클래스를 분류하는 부분(CLASSIFICATION)으로 나눌 수 있다. 특징 추출(Feature extraction/learning) 영역은 Convolution Layer와 Pooling Layer를 여러 겹 쌓는 형태로 구성된다. Convolution Layer는 입력 데이터에 필터를 적용 후 활성화 함수를 반영하는 필수 요소이다. (Pooling Layer는 선택적인 레이어이다.)

CNN 마지막 부분에는 이미지 분류(Classification)를 위한 Fully Connected Layer가 추가된다. 이미지의 특징을 추출하는 부분과 이미지를 분류하는 부분 사이에 이미지 형태의 데이터를 배열 형태로 만드는 Flatten 레이어가 위치한다.

 

 

2.1 Convolution layer

2.1.1 필터 적용

5x5의 matrix로 표현된 이미지 입력값에 CNN 필터(커널) 3x3로 이미지 입력값 전체에 적용한다. 즉 우리의 입력값 이미지의 모든 영역에 같은 필터를 반복 적용해 패턴을 찾아 처리하는 것이 목적이다.

빨간 테두리 부분의 matrix와 필터의 Inner product연산을 해주면 그 결괏값은 4가 되며 이를 전체 input image에 반복적으로 수행한다.

 

 

2.1.2 Zero Padding

Convolution처리를 보면 5x5크기의 이미지에 필터 처리로 인해 결괏값의 크기가 3x3로 변환되어 손실된 부분이 발생한다. 이 부분을 해결하기 이미지 가장자리를 0으로 감싸준다.(padding 처리)

5x5 → 7x7로 되어 3x3 필터를 적용해줘도 똑같이 5x5가 된다.

 

2.1.3 Pooling Layer

이미지의 크기를 계속 유지한 채 Fully Connected layer로 가게 된다면 연산량이 기하급수적으로 늘 것이다. 적당히 크기도 줄이고, 특정 feature를 강조할 수 있어야 하는데 그 역할을 Pooling layer에서 하게 된다. (크기를 계속 줄여서 속도를 높인다)

 

처리 방법은 총 세 가지가 있다.

  • Max Pooling
  • Average Pooling
  • Min Pooling

CNN에서는 주로 Max Pooling 사용한다. 이는 뉴런이 가장 큰 신호에 반응하는 것과 유사하다고 한다. 이렇게 하면 노이즈가 감소하고 속도가 빨라지며 영상의 분별력이 좋아진다.

아래 그림은 stride가 2로 설정된 max-pooling 기반 풀링 계층의 동작을 보여준다.

2.1.4 ReLu 활성화 함수

ReLu(Rectified Linear Unit) 활성화 함수는 비선형성 함수로 기본 선형 특성을 나타내는 layer에 비선형성을 증가시켜 준다. ReLu 함수의 범위는 R(z)=max(0, z) 양수이기 때문에 vanishing gradient 문제점을 극복하고 학습 속도와 성능을 향상해 CNN에서 주로 사용되는 활성화 함수이다.

 

 

2.1.5 Drop-Out

Dropout은 오버 피팅을 줄이기 위한 정규화(regularization) 작업으로 신경망 층에 있는 일정 노드(유닛)를 확률적으로 제외시키기 때문에 “dropout”이라고 불린다.

 

 

2.2 classifier

2.2.1 Fully Connected Layer

Convolution layer와 pooling layer를 거치면 local feature (직선이나 곡선 등의 특징)를 찾을 수 있다. local feature를 여러 개 찾는다면 직선과 곡선의 조합으로 이미지 안에서의 귀, 입, 바퀴 등의 특정한 feature를 찾을 수 있다. 이런 특징점을 찾고 분류하기 위해 다음과 같은 작업을 거친다.

  1. 2차원 배열 형태의 이미지를 1차원 배열로 평탄화
  2. 활성화 함수(Relu, Leaky Relu, Tanh, 등) 뉴런을 활성화
  3. 분류기(Softmax) 함수로 분류

2.2.1.1. 평탄화

2차원/3차원의 행렬 구조를 1차원의 Vector로 변환하는 과정

 

다차원의 데이터를 1차원으로 평탄화시키면 더 간단한 훈련 모델을 훈련시킬 수 있으나

평탄화되기 이전 데이터에 담겨있던 고유한 특성도 같이 없어진다는 단점을 가지고 있다. (앞써 이미지의 특징점은 해당 지점의 값이 아닌 주위와 연동되어 학습해야 하기 때문이다. )

이러한 단점을 극복하기 위해 2차원 데이터(이하 특징 맵)의 특성을 그대로 보존하면서 패턴을 학습하는 신경망을 만들어 낸다.

 

입출력 모두 3차원(배치 처리 시엔 4차원) 데이터로 처리하기 때문에 공간적 정보를 유지한다.

 

2.2.1.2 활성화 함수, Activation function

1) ReLU 함수 ( Rectified Linear Unit )

 

0 이하의 값은 0으로 고정하고 0 값을 초과할 경우 해당 값을 그대로 출력해주는 함수

 

 

2) Leaky Relu

 

ReLU와 거의 비슷한 형태. 입력 값이 음수일 때 완만한 선형 함수를 그려줍니다. 일반적으로 알파를 0.01로 설정

 

 

3) Tanh

하이퍼볼릭 함수란 쌍곡선 함수를 의미. (RNN, LSTM 등을 학습시킬 때 사용)

 

2.2.1.3 분류기 (softmax) 함수로 분류

sigmoid, LeRu와 같은 액티베이션 함수의 일종이다. sigmoid가 결과 값에 따라 1, 0과 같이 이산 분류하는 함수라면, Softmax는 여러 개의 분류를 가질 수 있는 함수이다. 이 결과로는 다음과 같은 예시로 나올 수 있다.

카테고리가 강아지, 고양이, 자동차, 기차 일 때 어떤 인풋 데이터에 대해서

  • 강아지일 확률은 0.8
  • 고양이일 확률 0.1
  • 자동차일 확률 0.01
  • 기차일 확률 0.09

가 나온다면 해당 이미지의 분류는 강아지가 된다.

이때 모든 카테고리의 합은 1이 되어야 한다.

 

 

 

 

이렇게 CNN 작동방법에 대해서 간단하게 알아보았다.

실제 코딩에 들어가면 CNN의 동작대로 그대로 코딩하는 것도 볼 수 있다.

실습은 다음 포스팅에서

 

 

참고사항

https://techblog-history-younghunjo1.tistory.com/125

https://velog.io/@jaehyeong/합성곱-신경망ConvNet-Convolutional-Neural-Network

https://www.quora.com/What-is-padding-in-a-neural-network

https://kevinthegrey.tistory.com/142

https://blog.naver.com/PostView.nhn?blogId=intelliz&logNo=221709190464

https://dalsacoo-log.tistory.com/entry/what-is-CNN

https://yeomko.tistory.com/39