정리 노트

CNN(Convolutional Neural Network) 본문

개념 정리/머신러닝 & 딥러닝 & A.I

CNN(Convolutional Neural Network)

꿈만 꾸는 학부생 2022. 8. 29. 11:21
728x90

이 포스트는 2015년 12월에 나온 Kerion O'shea and Ryan Nash 'An Introduction to Convolutional Neural Networks'의 일부 내용과 국민대학교X프로그래머스 주관하는 '2022학년도 여름방학 인공지능 온라인 실전 부트캠프'에서 배운 내용을 섞어서 작성했습니다. 잘못된 해석과 개념 오류 지적 등 모든 것을 환영합니다.


<An Introduction to Convolutional Neural Networks>

1. Introduction

Convolutional Neural Networks(CNNs)는 기존의 인공 신경망(ANN)과 유사합니다. 기존의 ANN과 다른 점은 CNN은 주로 이미지 패턴 인식에서 사용된다는 것입니다. 이를 통해 이미지들을 아키텍처로 인코딩을 할 수 있고 CNN이 이미지 작업에 특화될 수 있게 하는 것과 동시에 CNN 모델에 필요한 파라미터 수를 줄일 수 있습니다.

ANN의 큰 한계점 중 하나는 이미지 데이터에 대한 계산에 요구되는 계산 복잡도입니다. 흔히 알려진 MNIST 데이터베이스는 이미지 차원이 28 X 28이기 때문에 대부분의 기존 ANN은 충분히 계산할 수 있다. 하지만 64 X 64차원의 컬러 이미지를 생각하면 첫 layer에서 계산에 사용될 weight이 늘어납니다. 또한 입력의 차원이 늘어나면서 colour-normalised MNIST digits를 분류하는 데 사용했던 것보다 더 큰 neural network가 필요해집니다.

1.1 Overfitting(과적합)

더 큰 neural network가 필요해지면 hidden layer의 수를 늘리거나 neuron의 수를 늘리면 될 것 같지만 두 가지 이유에서 안 됩니다.

  1. 우리는 무한한 시간과 자원을 가지고 있지 않습니다.
  2. overfitting 문제를 막아야 합니다.

과적합은 기본적으로 network가 여러 가지 이유로 효과적으로 학습할 수 없어서 생기는 문제입니다. model이 과적합의 징후가 보인다면 학습 dataset뿐만 아니라 테스트 dataset과 예측 값에서도 일반적인 특징을 잡아내는 능력이 떨어질 것입니다.

학습에 사용되는 parameter들이 적어질수록 network가 과적합될 가능성도 적어지고, 물론, model의 예측 성능도 향상됩니다.

 

2. CNN architecture

CNN의 layer들은 3차원(입력의 공간적 차원성(너비, 높이)과 깊이)으로 정돈된 neuron들로 구성되어있습니다. 여기서의 depth는 인공 신경망의 깊이를 나타내는 것이 아니라 activation volume의 세 번째 차원을 나타낸다. 보통의 ANN과 다르게 어느 layer 던 이전 layer의 일부랑만 연결됩니다.

실제로 이는 전의 예시처럼 64 x 64 x 3(height x width x depth)의 입력을 layer들을 지나가면서 차원을 압축했기 때문에, 1 x 1 x N(N: 클래스의 수)의 출력으로 이어진다는 것을 의미합니다.

2.1 전반적인 아키텍처

CNN은 세 가지의 layer(convolutional layers, pooling layers, fully-connected layers)로 구성되어 있습니다. MNIST 분류를 위한 간단한 CNN 아키텍처는 아래의 그림과 같습니다.

출처: https://arxiv.org/pdf/1511.08458.pdf

위에 보여준 간단한 CNN은 4가지 주요 기능들로 나눠서 볼 수 있습니다.

  1. Input layer는 이미지의 픽셀 값들을 가지고 있을 것입니다.
  2. Convolutional layer는 입력의 일부와 연결(local connectivity)된 뉴런들의 출력을 weight 값들과 입력과 연결된 것 간의 scalar product 계산을 통해서 결정할 것입니다. ReLU는 elementwise 활성화 함수로 적용됩니다.
  3. Pooling layer는 주어진 입력의 공간적 차원성을 따라 downsampling을 수행해서 activation의 파라미터 수를 감소시킵니다.
  4. Fully-connected layer는 기존 ANN과 같은 일을 수행하고 분류를 위해 activation에서 class score를 생성합니다. 여기서도 성능 향상을 위해 layer 간에 ReLU를 사용하는 것을 제안합니다.

2.2 Convolutional layer

Convolutional layer는 CNN에서 중요한 역할을 담당합니다. 이 레이어의 파라미터들은 학습 가능한 kernel의 사용에 중점을 둡니다. 이 커널들은 작지만 입력의 depth 전체를 따라 퍼집니다. 데이터가 convolutional layer에 들어오면, layer안에서 각 filter는 입력 값을 슬라이딩하면서 convolution 연산을 해서 2D activation map을 생성합니다. convolution은 element-wise 곱셈한 결과들의 합을 구하는 과정입니다. activation map은 아래 그림(Fig. 3)처럼 시각화할 수 있습니다. 일반적으로 layer가 깊어질수록 사용되는 filter의 수가 많아지고 입력의 너비와 높이는 줄어듭니다. 이에 따라 깊은 layer에서는 고차원의 특징을, 얕은 layer에서는 저차원의 특징을 인식한다는 특징이 있습니다.

출처: https://arxiv.org/pdf/1511.08458.pdf

scalar product는 아래의 그림처럼 진행됩니다.

출처: https://arxiv.org/pdf/1511.08458.pdf

여기서 CNN은 입력의 어느 공간적 위치의 특정 특징을 보는 커널을 학습합니다. 이를 일반적으로 activation(활성화)이라 합니다.

각 커널은 커널과 대응하는 activation map을 가지고 있을 것이고 이는 차원의 depth만큼 쌓여 convolutinal layer의 전체 출력을 형성합니다.

 

앞에서 얘기했듯, 이미지들을 입력으로 넣는 기존 ANN을 효율적으로 학습시키기 위해서는 모델이 많이 커져야 합니다. 이는 기존 ANN의 뉴런들이 fully-connected 방식으로 연결되어있기 때문인데 그래서 convolutional layer 안의 모든 뉴런들의 연결을 완화시키기 위해 뉴런들을 입력의 일부와 연결하는 것입니다. 연결되는 영역의 차원을 일반적으로 뉴런의 수용 영역의 크기(쉽게 생각하면 커널의 크기와 같습니다.)(receptive field size)라 불립니다. 이 depth를 통한 연결의 크기는 거의 항상 입력의 depth와 같습니다.

예를 들어, 만약 입력이 64 x 64 x 3(64 x 64 크기의 RGB 이미지) 크기의 이미지이고 뉴런의 수용 크기(=커널의 size)를 6 x 6 같이 설정하면, 우리는 총 108개의 weight을 가지게 됩니다(6 X 6 X 3, 3은 depth에 걸친 연결의 크기). 이 weight을 입력 안에서 공유하기 때문에 추가적인 weight을 필요로 하지 않습니다. 비교하자면, 기존 ANN을 구성하는 뉴런은 각각 12,288개(64 x 64 x 3)의 weight을 가집니다.

 

Convolutional layer는 출력의 최적화를 통해 모델의 복잡도를 낮출 수 있습니다. 모델은 세 가지 hyperparameter들(depth, stride, zero-padding)에 의해 최적화됩니다.

Convolutional layer에 의해 생성되는 출력의 depth는 layer 안에 있는 뉴런들의 수를 입력의 같은 영역과 같게 만드는 것을 통해 설정할 수 있습니다. 이 것은 hidden layer에 있는 모든 뉴런들이 직접 미리 각 뉴런에 연결된 다른 형태의 기존 ANN에서 볼 수 있다. 이 파라미터를 감소시키는 것은 네트워크의 총 뉴런의 수를 최소화할 수 있지만 모델의 패턴 인식 능력을 감소시킬 수 있습니다.

우리는 또한 수용 영역을 배치하기 위해 입력의 공간 차원성을 중심으로 depth를 설정하는 stride를 정의할 수 있습니다. 예를 들어, stride 값을 1로 설정하면 엄청 큰 activation을 생성하고 많이 겹치는 수용 영역을 가지게 됩니다. stride를 크게 설정하면 겹치는 부분의 줄어들고 낮은 차원의 출력을 생성합니다. 간단하게 생각하면 stride는 kernel이 입력 값을 슬라이딩하는 단위라고 생각할 수 있습니다.

Zero-padding은 입력의 경계에 0으로 padding을 하는 것입니다. 그리고 이것은 출력의 차원에 대해 추가적인 control을 제공하는 효과적인 방법입니다.

이러한 hyperparameter들을 사용해서 convolutional layer의 출력 차원을 바꿀 수 있다는 것을 이해하는 것이 중요합니다. 이를 계산하기 위해서 아래의 공식을 사용합니다. 만약 계산 결과가 정수가 아니라면 뉴런들이 주어진 입력에 대해 잘 맞춰질 수 없기 때문에 stride가 잘못 설정된 것입니다.

출처: https://arxiv.org/pdf/1511.08458.pdf

  • V -  입력 크기(height x width x depth)
  • R - 수용 영역 크기
  • Z - zero padding 크기
  • S - stride

지금까지의 노력에도 불구하고 입력이 실제 차원의 크기만큼을 가지면 이 모델도 여전히 큽니다. 하지만, convolutional layer의 전체 파라미터 수를 줄이는 방법이 개발되었습니다.

파라미터 공유 방법(Parameter sharing)은 만약 하나의 영역의 특징이 설정된 공간의 영역 계산에 유용하다면, 또 다른 영역에도 유용할 가능성이 높다는 추정에서 적용됩니다. 만약 각 출력의 activation map을 같은 weight, bias로 제한하면, convolution layer에서 생성되는 파라미터의 수가 엄청 감소할 것입니다.

역전파가 발생함에 따라, 출력의 각 뉴런은 depth를 가로질러 합쳐질 수 있는 전체적인 기울기를 표현할 것입니다. 따라서 모든 가중치를 갱신하는 게 아니라 하나의 weight set만 갱신합니다.

2.3 Pooling layer

Pooling layer는 표현되는 차원을 점진적으로 감소시켜 모델의 파라미터와 복잡도를 감소시키는 것을 목표로 합니다.

Pooling layer는 입력의 각 activation map에서 작동하고, 'MAX function'을 이용해 크기를 조절한다. 대부분의 CNN에서, 이 것은 stride값이 2인 2 x 2 차원의 커널들을 적용한 max-pooling layer의 형태로 됩니다. max pooling은 pooling filter 영역 안의 최댓값을 추출하는 과정을 말합니다. 이를 통해 activation map을 원래 크기의 25%로 줄이고 depth는 유지됩니다.

Pooling layer의 특징으로 인해 일반적으로 2가지의 max-pooling 방법이 있습니다. 주로 pooling layer의 stride와 filter 모두 2 x 2로 설정해서, 입력의 공간 차원의 전체를 통해 확장될 수 있게 합니다. 그리고 overlapping pooling은 stride는 2, kernel 크기는 3으로 설정할 때 사용할 수 있을 것입니다. pooling의 특징상 커널의 크기가 3을 넘으면 모델의 성능을 굉장히 감소시킬 것입니다.

CNN 아키텍처에는 max-pooling도 있지만 general-pooling도 있을 수 있습니다. General-pooling은 L1/L2-normalization, average pooling 등 여러 일반적인 연산들을 하는 pooling 뉴런들로 구성되어있다.

2.4 Fully-connected layer

Fully-connected layer는 두 인접한 layer의 뉴런들과 직접 연결된 뉴런들을 포함하고 있습니다. 이는 기존 ANN에서 뉴런이 배치된 방식과 유사하다. 마치 아래의 그림처럼 말입니다.

출처: https://arxiv.org/pdf/1511.08458.pdf

 

3. Recipes

CNN을 구성하는데 상대적으로 적은 layer들이 필요하지만 CNN 아키텍처를 구성하는 방법이 정해져있지 않습니다. 관련된 자료들을 읽어보면 CNN도 Fig. 2 이미지처럼 fully-connected layer 전에 convolutional layer와 pooling layer들이 여러 겹 쌓는 것 같이 기존의 ANN처럼 일반적인 아키텍처를 따르는 경향이 있습니다. 또 다른 CNN 아키텍처는 아래의 그림처럼 pooling layer 전에 convolutional layer를 2개 쌓는 구조입니다. 이 구조는 입력 vector에서 더 복잡한 특징들을 잡아내야 할 때 강력히 권해지는 구조입니다.

출처: https://arxiv.org/pdf/1511.08458.pdf


참고 사이트

이 포스트를 작성하는데 참고한 사이트들입니다.

An Introduction to Convolutional Neural Networks: https://arxiv.org/pdf/1511.08458.pdf

참고 사이트 2: https://lynnshin.tistory.com/7

참고 사이트 3: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=sogangori&logNo=220952339643 

728x90