본문 바로가기
AI

Deep_Learning : CNN (Convolutional Neural Network)

by 월곡동로봇팔 2019. 12. 2.

CNN (Convolutional Neural Network), 합성곱 신경망 네트워크


정의 : CNN은 합성공을 이용한 신경망 네트워크를 말한다. 

 

기존의 FNN (Fully-Connected Neural Network)에서는 데이터를 모든 신경망에 연결을 하다보니, 

신경망의 수가 기하급수적으로 늘게 되었고, 우리는 조금 더 합리적이고 빠른, CNN을 찾게 되었다.

 

CNN에서 layer는 입력데이터로부터 특징을 추출하는 역할을 수행한다.

이는 특징을 추출하는 Filter

필터의 값을 비선형 값으로 바꾸어주느 활성화 함수 (Activation Function)로 이루어져 있다.

 

 

 

Filter (특징을 추출하는 역할)


filter는 오른쪽 같은 곡선의 그림을 행렬로 표현한 것이다. 

내가 이런 곡선을 그림에서 추출하고 싶다하면, 다음과 같은 필터를 써서 그림에 대조해보면 된다.

 

오른쪽 쥐의 곡선과 필터를 비교해보려고 할 때, 우리는 밑과 같은 연산을 수행한다.

 

위의 그림에서는 두 개의 행렬을 곱하였더니, 6600이라는 굉장히 큰 숫자가 나왔다.

이는 filter의 요소와 실제 찾고자 한 그림의 픽셀 행렬의 요소가 많이 겹치는 것을 의미한다.

즉, filter 행렬의 곱셈과 실제 그림의 픽셀의 행렬을 연산하였을 때, 값이 크면 클수록, 그 filter의 특징을 잘나타낸다.

따라서 우리는 이런 합성곱이 최대인 부분들을 계속해서 추려나가는 것이 굉장히 중요하다.

 

반대로, 위와 같이 합성곱의 값이 0이 나왔다면, 이는 filter의 특성을 가지고 있지 않는다는 것을 의미한다.

 

이 filter는 실제로 코드에서는 weight에 해당된다.

 

 

 

 

 

Stride (간격을 얼마나줘서 filter를 얼마나 이동할 것인가)


filter를 image에 적용하기위해서 stride 기법을 사용한다.

stride는 필터를 적용하는 "간격" 을 뜻한다.

 

위와 같이 5x5 이미지가 있을 때, 3x3 필터를 좌측 상단부터 왼쪽으로 한칸씩 그 다음 줄에서 왼쪽으로 한칸씩 적용해서 특징을 추출한다.

 

convolved feature은 합성곱의 특징을 모아둔 행렬이다.

 

stride는 보통 1로 지정을 한다. stride의 숫자가 커질수록, filter는 이미지를 많이 겹치지 않게 되어 특징들이 안타난다.

이 부분에 유의해야한다.

 

 

 

 

 

 

padding ( 특징 소실을 막는 수단 )


위의 stride 부분을 보면 filter를 거친 feature들의 행렬을 보면 data의 크기가 확 줄었음을 알 수 있다.

ConvNet은 하나의 필터를 한 번 적용하는 것이 아니라 여러 단계에 걸쳐 필터를 연속적으로 적용하여

특징을 추출하게 되는데 처음에 비해 특징이 소실 될 수 있다.
따라서 이렇게 filter를 하기 전에, padding을 취함으로써, filter를 거쳐도 특징이 소실되지 않게 크기를 유지한다.

 

 

 

Activation Function (활성화 함수 : 특징을 가지고 있다, 없다로 바꿔주는 과정 필요)


이렇게 필터 들을 통해서 특징 맵이 추출되면 이 특징 맵에 활성화 함수를 적용하여 값을 활성화 시킨다.

활성화 함수는 위 쥐 그림 예시에서 곡선 값의 특징을 가지고 있는 필터를 통해 

입력 데이터에 적용한 결과 각 6600, 0 의 값을 얻었다. 

 

이 값이 정량적으로 나오기 때문에 

이러한 값들을 "곡선 특징을 가지고 있다" 와 "없다"로 바꾸어 주는 과정이 필요하다. 

 

이 것이 바로 활성화 함수 이다. 

 

대표적인 활성화 함수로는 시그모이드(Sigmoid) 함수와 렐루(ReLU) 함수가 있다. 

보통 렐루 함수를 사용한다. 

 

시그모이드 함수를 쓰지 않는 이유는 되게 복잡하다.

이유는 신경망이 깊어질수록 학습이 어렵기 때문에, 전체 계층을 한번 계산한 후 그 계산된 값을 다시 계산하는 역전파(Back Propagation)이라는 방법을 사용하는데

시그모이드 함수를 활성화 함수로 사용할 경우, 

계층이 깊어지면 그라디언트 소실(Gradient Vanishing) 문제가 발생하기 때문에 렐루 함수를 사용한다. 

 

이는 밑에서 설명하겠다.

 

위는 만약 CNN의 계층이 깊어질수록, 학습이 어렵기 때문에, 전체적으로 한 번 학습을 진행한 후, 계산된 값을

거꾸로 다시 계산하는 역전파, back propagation을 사용한다. 이 때 시그모이드가 사용될 경우, 0 or 1의 근사값으로 

치우치게되는데, 이 때 만약 0의 근방하는 값이 주로 나오게된다면, 이들의 특징은 소멸되는

즉 gradient vanish가 생긴다.

 

따라서 시그모이드는 부적절하다고 판단하여 우리는 위의 함수 ReLu 함수를 쓰게 된다.

 

 

 

 

 

Pooling (추출된 특징들을 필요에 따라 서브 샘플링 하는 과정)


convolutional 계층을 통해 특징이 추출되면, 이 모든 특징을 고려할 필요가 없다.

 

예를 들어 예전 TV 시청률 계산시 전체 가구의 TV 시청을 계산하는 것이 아니라,

랜덤 가구에 대하여 시청률 계산만 해도 전체 시청률과 비슷한 결과를 추출 할 수 있는 것과 같은 원리이다.

 

그래서 추출된 특징 맵을 줄이는 작업을 수행하는데, 이 작업을 서브 샘플링 또는 풀링 이라고 한다. 

 

풀링 방법에는 맥스 풀링(Max Pooling), 평균 풀링(Average Pooling), L2-norm Pooling 등이 있고

그 중에서 맥스 풀링을 많이 사용한다. 

 

맥스 풀링은 특징 맵을 M x N 크기로 잘라낸 후, 그 안에서 가장 큰 값을 뽑아내는 방법이다. 

 

아래 예시에서는 4 x 4 특징 맵에서 2 x 2 맥스 풀링 필터를 스트라이드를 2로 하여 

2칸씩 이동하면서 맥스 풀링을 거친 예시이다. 좌측 상단에서는 2가 가장 큰 값이기 때문에 2를 뽑아낸다.

 

 

이러한 맥스 풀링의 장점으로는 전체 데이터 크기가 줄어들기 때문에 연산량이 적어지고,

데이터 크기를 줄이면서 소실이 발생하기 때문에 오버 피팅을 방지 할 수 있는 효과가 있다. 

 

 

 

댓글