본문 바로가기
Deep Learning 개념정리

CNN( Convolutional Neural Network)이해하기

by inhovation97 2020. 8. 13.

모두의 딥러닝이라는 서적을 통해 딥러닝을 처음 접하면서 CNN(합성곱 신경망)이라는 모델을 공부했습니다.

통계 전공이지만 처음 알게되는 사실들이 많아 책보다는 좀 더 딥하게 공부하고 싶어서 구글링으로 더 공부하여 따로 포스팅을 하고싶어서 하게 됐습니다!

 

책에서는 CNN을 이미지 인식의 꽃 이라고 표현했지만, CNN은 자연어 처리에도 이용한다고 합니다.

제가 이 CNN을 공부하면서 가졌던 의문들이 다른 분들도 궁금할 수 있을 것이라고 생각합니다. 이 관점으로 포스팅을 시작할게요.

우선 가장 처음에 CNN을 공부할 때는 이미지 데이터에 합성곱을 적용하는 부분이 어렵진 않았지만, 이 합성곱이란게 뭔지가 궁금했습니다. 들어본 적이 없었거든요.

합성곱이 뭔지만 알고 내용을 시작하겠습니다!

 

<Convolution! 합성곱이 뭘까?>

 

https://ko.wikipedia.org/wiki/%ED%95%A9%EC%84%B1%EA%B3%B1


먼저 위키피디아에서 어떻게 정의하는지 서칭해보았습니다.

저 같은 문과 입장에서는 정말 꼴보기도 싫은 설명입니다. 구글링을 해보니 공대생들이 공업 수학에서 배우는 과목이더군요. 그리 어려운 내용은 아니예요.

뒤에 합성곱이 나오면 이에 맞춰서 설명할건데, 이해하는데 어렵지 않습니다.

 

 

 

<CNN을 써야하는 이유>

 

자! 그러면 이제 CNN을 알아봅시다. 자연어 처리에도 쓰인다지만, 저는 이미지 데이터를 예시로 설명하겠습니다.

CNN을 쓰지 않고, 일반적인 인공 신경망을 이용해 이미지를 학습시켜서 분류할 수 있습니다. 하지만 이렇게 할 경우 이미지 데이터의 특성상 문제가 발생합니다.

 

 

우선 이미지 데이터를 봅시다. 이미지 데이터는 MNIST 데이터를 예로 (28,28,1)로 28x28=784개의 픽셀로 이루어졌다는 것 인데, 만약 이미지가 컬러라면, RGB로 빨간색, 초록색, 파란색으로 (28,28,3) 총 3개의 channel로 이루어진다고 말합니다.

 

우리는 모델에 이대로 데이터를 넣는 것이 아니라, 이 픽셀들을 오른쪽 사진처럼 명암에 따라 숫자로 바꾼 뒤 이를 1차원으로 바꾸어 모델에 넣어줍니다. (여기서 말하는 모델은 기존 다층 퍼셉트론을 생각하면됩니다. 이것을 모든 층들이 유기적으로 연결되어 Fully connected layer에 연결한다고 말합니다.)

(*Fully connected 신경망(=Fc)는 말 그대로 모든 노드가 연결되어 있는 것을 의미하는데, 입력층을 거쳐 은닉층의 노드들이 모두 연결되어 가중치를 도출하는 기본 인공 신경망을 생각하면 됩니다.)

 

문제는 여기서 발생합니다. 3차원 이미지들을 1차원으로 바꾸어 Fully connected layer에 적용하면서, 각 픽셀들의 연관관계에 대한 정보 손실이 일어나고 같이 분류해야할 이미지를 올바르게 분류하지 못하게 됩니다.

 

 

https://wikidocs.net/64066

직관적으로 이해하자면, 둘의 이미지를 같은 y라고 사람들은 인식합니다. 이미지는 이렇게 한 덩어리로 봐야하지만 모델에는 1차원으로 바꿔서 입력하기 때문에 각 픽셀간의 연관성의 정보 손실이 일어나고, 심지어는 왼쪽의 y의 1차원 배열값과 오른쪽 y의 1차원 배열값이 한개씩 밀려있고 약간의 균열이 있어 똑같은 y라고 인식하지 못하게 되는겁니다.

 

 

<Convolutional layer를 추가하자!>

 

CNN이라고 완전히 다른 신경망이 아닌 기존의 신경망에서 입력층 이전에 Convolutional layer(합성곱 층)을 추가해주는 겁니다. 합성곱 층에서 이미지 벡터들의 연관관계에 대한 정보들, 이미지 특유의 공간에 대한 정보들을 지닌 Feature Map을 입력층에 input해줌으로써 더 좋은 결과를 얻어내는 CNN 모델이 되는 것이죠.

 

합성곱의 과정으로 공간에 대한 정보를 가진 Feature Map을 만드는 과정을 봅시다. Stride = 1로 설정하여 Filter를 한칸씩만 이동하여 Feature Map을 만들어냈습니다.

(*Stride는 이미지 데이터에 적용할 Filter를 얼마나 움직여 적용할지를 정하는 단위)

(*Feature Map은 이미지 데이터에 필터를 적용해 공간에 대한 정보를 지닌 변환 데이터)

두개의 함수를 이용해 적분한다는 합성곱의 개념이 여기에 적용됩니다. 필터에 적용된 가중치로 이미지 데이터의 부분 부분을 넓이로 표현한다는 개념이죠.

 

 

 

<Padding을 해줄 수 있다!>

 

 

 

 

합성곱을 하면 위의 식처럼 피쳐맵이 작아지는 것을 알 수 있어요. (N은 이미지 데이터의 높이와 너비, F는 필터 사이즈)

convolution 레이어의 출력 데이터가 작아지는 것을 방지하기 위해서는 위와 같이 어떤 수로 외곽을 둘러싸는padding 기법이 필요합니다. 보통은 0으로 제로패딩을 이용합니다. 출력 데이터의 사이즈를 보호하면서도 인공 신경망에 외곽임을 인식시키는 효과도 있습니다.

 

 

<Pooling layer 추가하기!>

 

컨볼루션 층으로부터 이미지의 특징들을 도출하였습니다. 하지만 한번만으로는 데이터가 여전히 크고 복잡해 다시 한번 더 축소해야 합니다. 이 과정을 Pooling또는 sub sampling이라고 합니다.

 

 

그림은 풀링 중에서도 가장 보편적인 MaxPooling 예시입니다. 컨볼루션으로 도출한 Activation Map(=Feature Map)의 구역을 분할하여 그 중 가장 큰 수를 구역의 대표값으로 정하는 것입니다.

 

 

<드롭 아웃으로 과적합 방지하기!>

 

더보기

모델을 학습시킬 때에는 항상 과적합을 방지해야 합니다. 앞서 기존의 인공 신경망에서 컨볼루션 층과 풀링 층을 여러개 넣어주었기 때문에 과적합의 위험이 있을 것이죠. 그 중 간단하지만, 가장 효과가 큰 기법이 Drop out 기법 입니다.

 

랜덤하게 원하는 정도의 노드를 끔으로써 과적합을 매우 쉽게 방지할 수 있습니다.

 

 

 

 

이제 CNN을 설계하는 모든 과정을 살펴봤습니다. 마지막으로 그림을 보며 CNN의 전체적인 설계를 봅시다.

http://taewan.kim/post/cnn/

컨볼루션과 맥스 풀링의 층 몇개에 걸쳐서 뽑아낸 데이터를 FC 층에 input합니다. 넣기 전에 과적합 방지를 위한 드롭아웃의 과정은 중간에 거치며 FC 층에는 1차원 데이터가 들어가야 하므로 Flatten함수를 이용합니다.

마지막 출력층에서는 softmax함수로 어떤 그림인지를 분류합니다.

 

 

 

처음에 가졌던 의문

 

1. 결론적으로 마지막에는 1차원 데이터를 넣는 것인데 왜 데이터를 압축시키는 것이 해결책인가?

2. Filter는 어떤 기준으로 만드는 것인가? 

 

http://taewan.kim/post/cnn/

두 궁금증은 오른쪽의 사진만 보면 쉽게 풀립니다.

 

1. 1개의 사진이 첫 번째 컨볼루션 층을 거치면서 channel이 20개가 됩니다. 즉, 각각 다른 가중치들을 가진 Filter가 사진 하나에 여러 개의 공간적 특징을 가진 데이터로 축소 분할하면서 사진에 대해서 더욱 다양한 정보를 가지게 되는 것이죠. 서로 다른 사진은 이렇게 나온 feature map이 전부 다를 것이기 때문입니다.

2. 그러므로 filter는 어떤 기준으로 만드는지는 중요하지 않고, 그래서 랜덤으로 Filter를 만들어도 그 가중치에 따라서 그림마다 수치가 다르기 때문에 그 그림의 고유한 특성이 된다는 것!

 

 

 

※ 이해를 돕기위해 아래 자료들을 참고하고 사진을 인용했습니다. 아래 링크는 매우 잘 설명되어있으니 참고하세요!

 

http://taewan.kim/post/cnn/

 

CNN, Convolutional Neural Network 요약

Convolutional Neural Network, CNN을 정리합니다.

taewan.kim

https://wikidocs.net/64066

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

댓글