본문 바로가기
Book Review/[케라스 창시자에게 배우는 딥러닝] 리뷰

합성곱 연산: Convnet / CNN 이해하기

by 3n952 2023. 2. 7.

딥러닝을 활용하는 분야 중 컴퓨터 비전은 초기 딥러닝의 부흥을 이끈 분야입니다.

현재 우리에게 널리 사용되는 구글, 네이버의 이미지 검색 / 카메라로 신분증 정보 입력하기 등이 있습니다.

최근에는 자율 주행, 로봇공학, AI 기반 의료진단, 농업 자동화와 같은 첨단 산업 및 연구 분야에서

딥러닝 비전 모델이 핵심이 되기도 합니다.

이번 포스팅에서는 컴퓨터 비전 초기 모델인 CNN에 대해 공부해보고 리뷰해보도록 하겠습니다.


그렇다면 이러한 딥러닝 비전 모델은 어떻게 사람의 눈을 대신하여 판단할 수 있는 기능을 할 수 있는 것일까요?

그것을 가능하게 한 것은 합성곱 신경망(convolutional neural network)라고 불리는 딥러닝 모델의 한 종류 덕분일 것입니다.

합성곱 신경망은 줄여서 CNN 혹은 Convnet이라고도 부릅니다.

 

그림 1)숫자를 분류하는 합성곱 신경망

그림 1은 합성곱 신경망의 간단한 그림 예시 입니다.

합성곱 신경망은 합성곱 층과 완전 연결 층이 연결되어 이루어져 있습니다.

그림 1을 예로 들면 input인 1의 이미지가 conv층과 pooling층을 총 두번 거치게 됩니다.

이 4개의 층을 합성곱 층이라고 부릅니다. (합성곱 층은 conv층과 pooling층의 반복)

합성곱 층을 통과한 입력 이미지 '1'은 합성곱 층을 지나면서 '1'의 이미지를 특징 잘 나타내는 값들로 인코딩 될 것입니다.

이 값들을 평탄화 과정을 거치면 하나의 벡터 값으로 표현됩니다.

 

이렇게 만들어진 벡터화된 값들을 지난 포스팅에서 계속 다루던 완전 연결층(dense층)에 연결하는 것입니다.

이를 통해 입력된 이미지가 '1'이라고 예측할 수 있게 되는 것입니다.

 

결국 합성곱 층에서는 입력 이미지의 특징을 점점 세밀하게 파악하는 것이고,

완전 연결층에서는 세밀하게 파악된 이미지의 특징을 가지고 그 이미지를 분류해주는 것(분류 및 판단) 입니다.

 

합성곱 층에서 입력 이미지의 특징을 점점 세밀하게 파악한다는 게 무엇을 의미하는 지 좀 더 자세히 설명 드리겠습니다.

1. 컨브넷의 하나의 층을 지나면서 입력 이미지의 어떤 부분에서의 패턴을 학습하면 그 패턴은 다른 곳에서 나타나도 같은 패턴으로 인식하게 해줍니다. 가령 고양이 이미지를 받아 합성곱 층을 지나면 고양이의 왼쪽 눈의 패턴으로 오른쪽 눈을 인식하여 눈이라는 고양이 이미지의 특징을 알 수 있는 것입니다.

 

2. 또한 작은 지역적 패턴을 학습하면 다음 층에서는 이전 층에서 학습한 작은 지역적 패턴으로 구성된 더 큰 패턴을 학습하는 식입니다.

이렇게 두 가지 방식을 통해 복잡하고 추상적인 시각적 개념을 효과적으로 학습할 수 있게 되는 것입니다. 가령 위에서 언급한 고양이 이미지에서 고양이 얼굴에 대한 지역적 이미지를 학습하면 다음으로 고양이 얼굴의 색, 질감 등을 학습하는 식입니다.

 

그림 2) 고양이를 구성하는 시각적 요소들

그림 2)에서처럼 두가지 방식으로 생각을 해보면--> 우리가 세상을 보는 것 처럼 시각적 구성요소들의 공간적 계층 구조를 파악하고 각 이미지의 간단한 구성요소(ex. 눈, 귀)를 만들고 이들이 모여서 고수준(ex. 고양이, 강아지, 사람 얼굴)의 개념을 만드는 식입니다.

 


합성곱 신경망이 개념적으로 어떻게 이뤄지는 지 이해가 됐으면 이제는 기술적으로 알아볼 차례입니다.

 

합성곱 신경망에서는 합성곱 연산이 이뤄집니다. 합성곱 연산을 이해하기 위해서는 필터(filter), 커널(kernel), 특징 맵(feature map),

패딩(padding), 스트라이드(stride), 풀링(pooling)의 개념을 알 필요가 있습니다. 하나하나 천천히 살펴보겠습니다.

 

우선 합성곱 연산은 입력으로 랭크-3 텐서에 적용됩니다. 입력 데이터는 이미지 데이터로 높이 * 너비 * 깊이 축으로 이뤄집니다.

깊이 축은 RGB값으로 차원은 3개 입니다. 반면 grayscale인 이미지의 깊이 축은 1개의 차원을 갖습니다.

그림3) 합성곱 연산 예시

이미지는 하나의 픽셀 값으로 표현되어 그림3의 입력 데이터처럼 표현될 수 있습니다.

합성곱 연산은 이전에 공부했던 완전연결 신경망의 가중치 연산의 행렬 버전이라고 생각하면 됩니다. 필터가 도장이고 입력 데이터에 도장을 일정 간격만큼 찍는다고 생각하면 됩니다.

여기서 필터(커널)는 합성곱 연산의 수용 영역으로 필터의 매개변수가 가중치의 역할을 합니다.

입력데이터가 들어오면 필터의 크기만큼 일정 간격으로 합성곱 연산을 적용시키는 식입니다.

이때 일정 간격은 필터가 연속적으로 적용되는 거리를 의미하며 이를 스트라이드(stride)라고 부릅니다.

기본적으로 스트라이드는 1로 한 칸을 기준으로 필터가 적용되는 것을 의미합니다.

만약 스트라이드를 2로 적용하면 출력 값은 너비와 높이가 2의 배수로 다운샘플링 될 것입니다.

 

그림3의 예제로 합성곱 연산을 하면 맨 처음 입력 이미지의 왼쪽 모서리쪽에서 필터 크기만큼 연산이 이뤄집니다.

1 2 3
0 1 2
3 0 1

              *

2 0 1
0 1 2
1 0 2

             = 

1*2 2*0 3*1
0*0 1*1 2*2
3*1 0*0 1*2

이렇게 한칸씩 필터 크기만큼 일정 간격으로 도장찍듯이 연산이 이뤄집니다.

다음으로 필터가 적용 될 입력 데이터는

2 3 0
1 2 3
0 1 2

가 됩니다. 스트라이드가 1이 되는 것입니다.

필터가 도장찍듯이 연산이 이뤄지는 것의 순서는 우선 간격만큼 오른쪽 방향이며 오른쪽 끝까지 연산이 이뤄지면 

간격만큼 아래로 내려가 그 칸에서부터 오른쪽으로 이뤄지는 것의 반복입니다. 다음 그림을 보면 이해하기 쉽습니다.

결국 왼쪽 위에서 순서대로 오른쪽 아래 끝까지 도장을 다 찍으면 해당 필터의 연산은 끝이나게 됩니다.

 

그림3의 예시로 연산을 하면

15 16
6 15

가 나오는 것을 확인 할 수 있습니다. 이 값들에 편향을 하나씩 더하여 출력 데이터를 추출할 수 있습니다.

이를 특징 맵(feature map)이라고 합니다.

해당 연산은 이전에 완전 연결층에서 가중치와 편향을 곱하여 더하는 식과 결국 같은 개념입니다!

a * w1(가중치 1) + b * w2(가중치 2) + ... + b

 

하지만 이때 문제가 발생합니다. 그림3의 합성곱 연산에서 보이듯이 입력 데이터는 합성곱 연산이 이뤄질수록 특성 맵의 크기가 줄어듭니다. (4 * 4 크기에서 2 * 2로 크기가 줄어든다)

특성 맵이 층을 지날수록 크기가 줄어든다면 결국에는 너무나 작은 크기의 특성 맵이 만들어져 정확한 이미지 분류, 예측을 할 수 없을 것입니다.

이러한 현상을 해결하기 위해서는 padding 기법을 사용하는 것 입니다.

padding을 적용하면 입력과 동일한 높이와 너비를 가진 특성 맵을 얻을 수 있습니다.

그림 3을 예시로 들면, 연산이 이뤄진 특성 맵(출력 데이터)은

18 19
9 18

입니다. 이 특성 맵에 가장자리에 행과 열을 추가하여 다음 합성곱 연산을 적용시키는 것입니다.

위의 특성 맵에 zero padding을 적용하면,

0 0 0 0
0 18 19 0
0 9 18 0
0 0 0 0

가 됩니다. 특성 맵이 4 * 4 크기가 되었으니 2 * 2의 필터를 적용해도 다시 2 * 2의 특성 맵을 추출할 수 있게 되는 것입니다.

그림4) 패딩 예시

합성곱 연산에서 출력 크기에 영향을 미치는 요소는 stride와 padding이 됩니다.

따라서 conv층에서 이를 조정하여 적용하는 것이 중요합니다.

 

conv층과 연결된 pooling층에서는 pooling이 이뤄집니다.

해당 층에서는 학습되는 파라미터는 없습니다. 단순히 하드코딩된 값(최댓값, 평균값)들을 추출하는 것입니다.

스트라이드와 마찬가지로 강제적으로 특성 맵을 다운 샘플링하는 것이 풀링의 역할 입니다.

풀링은 윈도우 크기만큼 겹치지 않게(스트라이드 2) 값 추출 연산(최대, 평균)을 적용합니다.

그림 5)의 예시를 보면 2 * 2 크기의 풀링 윈도우를 적용하면 4 * 4크기의 특성 맵이 2 * 2 크기로 다운 샘플링됩니다.

위의 경우는 최대 풀링이고 아래의 경우는 평균 풀링을 적용한 것입니다.

 

그림5) 풀링 예시

그렇다면 패딩으로 입력 크기와 동일하게 유지했으면서 다운 샘플링하는 이유가 무엇일까요?

큰 특성 맵을 유지하지 않는 이유는 무엇일까요?

그 이유는 다음과 같습니다.

 

1. 합성곱 층을 지나면서 특성이 전체 입력에 대한 정보를 가지고 있어야 하기 때문입니다.

큰 특성 맵을 유지하면 특성의 공간적 계층 구조를 학습하는데 도움이 되지 않습니다. 다운 샘플링 되지 않는다면 초기 입력에 대한 정보가 매우 부족할 것입니다.

2. 합성곱 층을 다운 샘플링 없이 여러번 지나게 되면 출력되는 특성 맵은 너무나 많은 원소를 가질 것 입니다.

이를 평탄화 하여 완전 연결층에 연결하게 되면 학습해야 할 가중치 파라미터는 필요 이상으로 많아져 과대적합될 가능성이 높습니다.

 

즉, 처리할 특성 맵의 가중치 개수를 줄이기 위해 다운 샘플링을 사용하는 것입니다.

 

이번 포스팅에서는 합성곱 신경망에서 합성곱 층이 어떻게 이뤄져있으며, 각 층에서의 연산에 대한 기본 개념에 대해

알아보았습니다. 다음 포스팅에서는 이를 활용하여 고양이와 강아지를 구분하는 합성곱 신경망 모델을 구현하여 확인해보도록 하겠습니다.