머신러닝&딥러닝/이론

[머신러닝&딥러닝] CNN이란?

거북이07 2024. 2. 29. 16:35

CNN(Convolutional Neural Networks)

해당 포스트는 아래 블로그 글을 보고 작성한 포스트입니다.

 

✅ 참고

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

[딥러닝/머신러닝] CNN(Convolutional Neural Networks) 쉽게 이해하기

필자는 뉴욕에서 머신러닝 전공으로 석사학위 취득과정에 있습니다. 학교 수업을 듣고 실습 과제를 하며 항상 느끼는 점은 이 분야는 무엇보다도 튼튼한 이론지식이 중요하다는 것입니다. 물론

mijeongban.medium.com

 

CNN이란 Convolutional Neural Networks의 약자로 딥러닝에서 주로 이미지나 영상 데이터를 처리할때 쓰이고 이름에서 알 수 있다시피 Convolution이라는 전처리 작업이 들어가는 Neural Network 모델입니다.

 

컨볼루션(Convilution)은 합성곱이라고 하며 영어로는 "대단히 복잡한 것, 난해한 것, 얽히고 설킨 것"등을 의미합니다.

 

CNN이라는 방법을 쓰기 시작한 이유는 DNN(Deep Neural Network)의 문제점에서부터 출발하는 것을 알 수 있습니다. 기본적으로 DNN은 1차원 형태의 데이터를 사용하기 때문에  이미지가 입력값이 되는 경우, 이것을 flatten 시켜 한 줄 데이터로 만들어야 하는데 이 과정에서 이미지의 공간적/지역적 정보가 손실되게 된다고 합니다. 또한 추상화 과정 없이 바로 연산 과정으로 넘어가 버리기 때문에 학습 시간과 능률의 효율성이 저하됩니다.

 

위 문제점에서부터 고안한 해결책이 CNN인데 CNN은 이미지를 날것(raw input) 그대로 받음으로써 공간적/지역적 정보를 유지한 채 특성(feature)들의 계층을 빌드업합니다. CNN의 중요 포인트는 이미지 전체보다는 부분을 보는 것, 그리고 이미지의 한 픽셀과 주변 픽셀들의 연관성을 살리는 것입니다.

 

출처 - https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

예를들어 우리는 위와 같은 이미지가 주어졌을 때 이것이 새의 이미지인지 아닌지를 결정할 수 있는 모델을 만든다는 가정을 합니다. 그렇다면 새의 주요특징인 부리가 중요한 포인트가 될 수 있습니다. 때문에 모델이 주어진 이미지에 새의 부리가 있는지 없는지를 판단하는것이 아주 중요합니다. 하지만 새의 전체 이미지에서 새의 부리 부분은 생각보다 작은 부분입니다. 떄문에 모델이 전체 이미지를 보는 것 보다는 새의 부리 부분을 잘라 보는게 더 효율적이라는 생각이 듭니다. 그리고 이것을 해주는것이 CNN입니다.

출처 - https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

또한 위의 두 이미지를 보면 새의 부리부분이 이미지의 다른 부분에 위치해 있다는 것을 알 수 있습니다. 위의 이미지는 이미지의 새의 부리가 왼쪽 상단에 위치한 반면 아래의 이미지는 상단 가운데 부분에서 약간 왼쪽 부분에 위치하는것을 확인할 수 있습니다. 때문에 전체적인 이미지보다는 이미지의 부분 부분을 캐치하는 것이 중요하고 효율적일 수 있습니다.

 

CNN의 구조

 

위 이미지는 CNN의 전체적인 구조입니다. 위 이미지를 보면 다소 생소한 단어들을 만나볼 수 있는데요 Input, Convolution, Pooling, Flatten, Output, Kernel(filter) 등...  CNN은 Convolutional Layer와 Pooling Layer들을 활성화 함수 앞뒤에 배치하여 만들어집니다.  위에 이미지를 보면 Input > Convolution > Pooling ...Flatten > Fully > Output 순서로 진행이 되는데 우선 Convolution 부터 자세히 알아보도록 하겠습니다:)

 

Convolutional Layer

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

위 이미지를 보면 28x28 단위의 픽셀로 구성되어있는 Input이미지가 있습니다. 우리는 이 데이터 입력값을 28x28 matrix(행렬)로 표현할 수 있는데 이 말은 우리는 2차원 이미지를 matrix로 표현할 수 있습니다. 우리가 CNN에 넣어줄 입력값은 이렇게 matrix로 표현된 이미지입니다.

간략한 예를 위해 위와 같이 5x5의 matrix로 표현된 이미지 입력값이 있다고 가정해봅시다. 그리고 CNN에는 filter(kernel)라는것이 존재하는데 위 이미지의 경우에는 3x3크기의 필터입니다. 이 하나의 필터를 이미지 입력값에 전체적으로 훑어준다고 생각하면 되는데, 즉 입력값 이미지의 모든 영역에 같은 필터를 반복 적용해 패턴을 찾아 처리하는 것이 목적입니다.

 

그렇다면 이미지 위에 이 필터를 훑어줄때 어떤 일이 일어날까요? 정확히 말하면 이 필터를 이용해 연산처리를 해주는것인데. 이 연산처리는 matrix와 matrix간의 Inner Product라는 것을 사용합니다.

 

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

Inner product는 이산수학의 아주 기초이며 쉽게 말해 같은 크기의 두 matrix를 놓고 각 위치에 있는 숫자를 곱해 모두 더해주는 것 입니다. 

 

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

위 이미지를 보면 입력값 matrix의 부분과 필터가 연산처리 되는지를 한눈에 확인할 수 있습니다. 5x5크기의 이미지에 3x3의 필터를 연산한 후 다 더하면 4라는 값이 나오며 이 작업을 반복적으로 수행하면 아래 result와 같은 3x3크기의 결과값이 나오게됩니다. 여기서 Result의 크기가 입력값보다 작아진 이유는 3x3크기의 블록을 한칸씩 옆으로 움직이다보면 총 3번을 움직일 수 있다는것을 확인할 수 있습니다.

 

위에 결과물처럼 3x3으로 줄어들었다는 것은 손실되는 부분이 발생한다는 뜻입니다. 그럼 데이터 손실을 막기 위해서는 어떻게 해야할까요? 답은 Padding값을 넣어주는 것입니다.

 

Padding이란?

padding이란 쉽게 말해 어떠한 값으로 구성된 테두리를 이미지 가장자리에 감싸주는것입니다. 아래 이미지를 보시면 Input부분 가장자리에 7, 7, 6 ... 라고 쓰여있는 부분을 확인할 수 있습니다 우리는 이 부분을 padding이라고하며 padding은 주변의 값으로 채워줄수도있고 0으로 채워줄수도 있습니다. 일반적으로는 0으로 채워주는 방식을 많이 사용하지만 때에 따라 다르게 사용하므로 상황에 맞게 써주는게 좋습니다.

 

padding과 함께 알아야 할 것이 있습니다.

 

Stride란?

Stride라고 하는 것인데요 Stride는 쉽게 말해 필터를 얼마만큼 움직여 주는가에 대한 것입니다. stride의 값이 1일 경우 필터를 한칸씩 움직여 준다고 생각하면 됩니다. stride값이 커질 경우 필터가 이미지를 건너뛰는 칸이 커짐을 의미하므로 결과값 이미지의 크기는 작아짐을 의미합니다.


지금까지 우리는 2차원 이미지의 입력값을 살펴보았는데요. 이미지에는 2차원 이미지의 입력값만 있는것이 아닙니다. 입력값이 3차원인 경우도 존재합니다. 예를들어 컬러이미지는 R, G, B 세가지 채널로 구성되어 있기 때문에 d1 x d2 x d3과 같은 3차원의 크기를 갖습니다.

 

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

연산처리는 똑같이 Inner product를 사용하며 그 결과값은 당연히 matrix가 됩니다.

 

Pooling Layer

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

Convolutuon 다음에는 Poolin Layer입니다. 우리는 이 단계를 정확하게 이해하려면 Pooling이라는 것을 알아야 할 필요성이 있는데요.

 

우리는 전 단계인 convolusion 과정을 통해 많은 수의 결과값(이미지)들을 생성했습니다. 하지만 위와 같이 한 개의 이미지에서 10개의 결과값이 나오게되는데 출력이 너무 많으면 파라미터 수 증가, 계산 비용 증가, 과적합 가능성 등의 문제점이 발생할 수 있어 pooling layer를 사용하여 공간 차원의 크기를 줄이는것이 일반적입니다.

 

Pooling이란 각 결과값(feature map)의 dimentionality를 축소해 주는 것을 목적으로 합니다. 풀링은 특징 맵 내에서 주요한 정보를 유지하면서 공간적인 크기를 줄이는 데 사용됩니다.

 

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

Pooling에는 대표적으로 두가지 방법이 있습니다. 그 방법은 Max pooling과 Average pooling이 있습니다. 위 이미지와 같이 Pool의 크기가 2x2인 경우 2x2 크기의 matrix에서 가장 큰 값(max)이나 평균값(average)를 가져와 결과값의 크기를 반으로 줄여주게 됩니다.

 

Flatten

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

위 이미지를 보면 최종적으로 4x4x20의 텐서가 나온것을 확인할 수 있는데요 flatten은 이 텐서를 일자 형태의 데이터로 쭉 펼쳐주는 과정이라고 생각하면 됩니다. 쉽게 말해 세로줄을 일렬로 쭉 세워두는 것 입니다. 이 과정을 거치면 총 320개의 dimension을 가진 벡터 형태가 됩니다.

 

Fully-Connected Layer

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

이제 마지막으로 하나 혹은 하나 이상의 Fully-Connected Layer를 적용시키고 마지막에 Softmax activation function을 적용해주면 드디어 최종 결과물을 출력하게 됩니다.

 

Parameter와 Hyper-parameter

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

우선 파라미터와 하이퍼 파라미터의 용오 정리부터 해보도록 하겠습니다.

 

Parameter는 모델 내부에 있으며 데이터로붜 값이 추정될 수 있는 설정변수(configuraion variable)입니다.Hyper parameter는 모델 외부에 있으며 데이터로부터 값이 주정될 수 없는 설정 변수입니다.

 

딥러닝의 기본은 파라미터들을 최적의 값으로 빠르고 정확하게 수렴하는것을 목적으로 합니다. 그러므로 최적의 파라미터값을 찾는 것이 모델 트레이닝의 중요한 포인트라고 할 수 있습니다.

 

학습 가능한 매개변수의 수

https://mijeongban.medium.com/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-cnn-convolutional-neural-networks-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-836869f88375

 

이제 우리가 아까 살펴본 CNN 모델의 학습 가능한 매개변수(trainable parameters)는 몇개나 되는지 살펴봅시다.

 

  • 첫 convolution과정에서 5x5크기의 필터 10개를 사용하였으므로 250개의 매개변수가 존재합니다.
  • Pooling layer에서는 단순히 크기를 줄이는 개념이므로 매개변수가 없습니다.
  • 두번째 convolution 과정에서 5x5x10크기의 텐서 스무개를 사용하였으므로 5,000개의 매개변수가 추가되었습니다
  • 두개의 Fully-connected layer들에서 각각 매개변수 32,000개, 1000개가 추가되었습니다.

결과적으로, 생략한 intercepts 값까지 고려해보면 총 38,250 이상의 학습 가능한 매개변수를 갖게 됩니다.

 

 

초매개변수(Hyper-parameters)

마지막으로 CNN모델에서 튜닝 가능한 하이퍼파라미터는 어떤 것들이 있는지 간단히 살펴보겠습니다.

  • Convolutional layers: 필터의 갯수, 필터의 크기, stride값, zero-padding의 유무
  • Pooling layers: Pooling방식 선택(MaxPool or AvgPool), Pool의 크기, Pool stride 값(overlapping)
  • Fully-connected layers: 넓이(width)
  • 활성함수(Activation function): ReLU(가장 주로 사용되는 함수), SoftMax(multi class classification), Sigmoid(binary classification)
  • Loss function: Cross-entropy for classification, L1 or L2 for regression
  • 최적화(Optimization) 알고리즘과 이것에 대한 hyperparameter(보통 learning rate): SGD(Stochastic gradient descent), SGD with momentum, AdaGrad, RMSprop
  • Random initialization: Gaussian or uniform, Scaling

 

이로써 CNN 기본 개념 설명글을 마치도록 하겠습니다. 이 글은 맨 위에 적어놓았던 링크를 보고 이해한 후 포스트 원작자분의 글을 인용하여 포스트하였습니다. 참고 포스트보다 생략된 부분이 많으므로 CNN을 더욱 자세하게 이해하고 싶으신 분은 참고 포스트를 읽어주세요:)