🧐 CNN (Convolution Neural Network

🤫 CNN, 합성곱 신경망이란?
여러 분야, 특히나 image classification에서 좋은 성능을 보여주는 방법이다.
이런 합성곱 신경망에서 합성곱의 연산은 정의 자체에 가중치를 flip하는 연산이기에 아래와 같은 수식으로 표현한다.
i와 j시점에서 input x와 kernel(= weight)의 합성곱에 편향(bias)를 각 pixel에 더해 output y를 도출한다.
이때, 아래와 같은 연산식을 Cross-Correlation이라 부른다.

 

🤫 CNN이 등장하게 된 이유는 무엇일까?    MLP  vs   CNN 

▶ image classification에서 MLP보다 CNN이 더 선호된다.

1. 
MLP는 각 input(한 image의 pixel)에 대해 하나의 퍼셉트론만 사용하고 large한 image에 대해 weight가 급격하게 unmanageable해진다. 이는 너무 많은 parameter들이 fully-connected 되어 있기 때문이다. 따라서 일반화를 위한 능력을 잃는, 과적합(overfitting)이 발생할 수 있다.

2. MLP는 input image와 shift된 image가 다르게 반응한다는 점이다. (translation invariant(불변)가 아니기 때문)

예를 들어 고양이 사진이 한 사진의 이미지 왼쪽 상단에 나타나고 다른 사진의 오른쪽 하단에 나타나면 MLP는 자체 수정을 시도하고 고양이가 이미지의 이 섹션에 항상 나타날 것이다.

즉, MLP는 이미지 처리에 사용하기에 가장 좋은 아이디어가 아니다. 
주요 문제 중 하나는 이미지가 MLP로 flatten(matrix -> vector)될 때 공간 정보가 손실된다.

고양이가 어디에 나타나든 사진에서 고양이를 볼 수 있도록
image features(pixel)의 공간적 상관 관계(spatial correlation)를 활용할 방법이 필요.

∴ 이를 위한 해결책으로 등장한 것이 바로 CNN 이다!

좀 더 일반적으로, CNN은 공간적 상관관계가 있는 data에 잘 반응할 수 있다.
따라서 CNN은 input으로 image data를 포함하는 문제에 대한 prediction의 한 방법이다.

이런 CNN의 사용은 2차원 이상의 image의 내부적 표현에 대한 좋은 이점을 갖는다.
즉, image작업 시, 가변적인 구조의 data안에서의 position과 scale을 model이 배우기 쉽게 해준다.

 

 

 

 

🧐  Padding, Stride, Pooling 

🤫 Padding
예를들어 4x4차원이 input에 2x2의 kernel로 합성곱을 하게되면 output 차원은 3x3으로 차원이 줄어든다.
이렇게 차원이 줄어드는 현상을 방지하기 위해서 padding이라는 방법을 사용한다.
위 사진처럼 입력 데이터는 3x3이지만 zero-padding을 통해 차원의 축소가 일어나지 않게 할 수 있다.
🤫 Stride
한 번의 합성곱연산 이후 다음 계산영역으로 이동을 해야하는데, 이때 얼마나 이동할 것인지 간격을 정하는 값이며 이때
 output 데이터 행렬의 차원이 더 작아지는 것을 알 수 있다.

그렇다면, padding과 stride를 해도 output data의 크기를 미리 계산할 수는 없을까?
🤫 Pooling
CNN에서 feature의 resolution을 줄일 때, 사용하는 방식으로 아래와 같이 작동한다.


그렇다면, 이쯤에서 드는 생각이 있을 것이다.
Question?
왜 굳이? pooling을 사용하는거지? 
그냥 convolution layer를 stride = 2로 줄여서 작동하면 같은작업이지 않나?

Answer!

  • convolution layer를 이용하여 stride = 2로 줄이면 학습 가능한 파라미터가 추가되므로 학습 가능한 방식으로 resolution을 줄이게 되나 그만큼 파라미터의 증가 및 연산량이 증가하게 됩니다.
  • 반면 pooling을 이용하여 resolution을 줄이게 되면 학습과 무관해지며 학습할 파라미터 없이 정해진 방식 (max, average)으로 resolution을 줄이게 되어 연산 및 학습량은 줄어든다.
    다만
     convolution with stride 방식보다 성능이 좋지 못하다고 알려져 있습니다.
    따라서, layer를 줄여서 gradient 전파에 초점을 두려고 할 때 pooling을 사용하는게 도움이

 

 

 

 

 

 

🧐 고차원 데이터의 CNN 

🤫 width,  height,  channel

사실 하나의 픽셀은 2차원이 아닌, 3차원으로 이루어져 있다. (참고: https://chan4im.tistory.com/74 )


입력 데이터가 고차원이 됨에 따라 kernel도 채널 수만큼 필요하게 되는 것이다.
고차원 데이터의 합성곱 연산은 동일한 channel의 입력데이터와 kernel의 합성곱연산 후 연산 결과값 행렬을 모두 더한 값을 의미한다.

이때, kernel을 여러개 쓸수록 output의 채널 수가 kernel 수만큼 많아지는 것을 알 수 있다.


또한 차원이 커질수록 for문의 과다사용으로 인한 과부하의 우려로 인해 다음과 같이 고차원을 2차원 평면으로 변형해 표현한다.

 

 

+ Recent posts