다시 살펴보는 딥러닝 주요 개념 2편 – 합성곱 신경망(CNN)

주요 딥러닝 개념들을 요약·정리해뒀습니다. 딥러닝 이론을 기초부터 차근히 설명하려는 목적이 ‘아니므로’ 정독하실 필요는 없습니 다. 궁금한 개념이 있다면 가볍게 살펴본 후 바로 다음 장의 경진대회에 도전하시기 바랍니다. 경진대회 문제를 풀다가 언뜻 떠오르지 않는 개념이 있을 때 이 번 장을 참고해주세요.

 

학습 순서

 

합성곱 신경망(Convolutional Neural Network, CNN)은 컴퓨터 비전 분야에서 주로 쓰이는 신경망입니다. 합성곱 신경망은 다음과 같이 여러 구조가 모여 구성됩니다. 바로 이어서 하나씩 자세히 알아보겠습니다.

 

▼ 합성곱 신경망 전체 구조

 

1. 합성곱 계층

 

합성곱 계층(Convolutional Layer)은 합성곱으로 이루어진 신경망 계층을 일컫습니다. 합성곱(Convolution)은 2차원 데이터의 일정 영역 내 값들을 하나의 값으로 압축하는 연산을 말합니다. 전체 영역에서 중요한 특징만 추출하는 효과가 있습니다. 평소 우리도 눈으로 들어오는 시각 정보 모두에 주의를 기울이지는 않습니다. 중요한 특징 위주로 인지하죠. 합성곱 연산도 이와 비슷한 기능을 한다고 보면 됩니다.

합성곱 연산에는 필터가 필요합니다. 필터(Filter)는 입력 데이터에서 특정한 특성을 필터링하는 역할을 합니다. 사진 앱의 필터 기능과 비슷하게, 필터를 통과하는 과정에서 특정 특성을 부각시키거나 약화시키는 등의 변화를 줍니다. CNN으로 개와 고양이를 구분하는 경우를 생각해보죠. 눈, 코, 입, 몸통, 털, 색깔 등의 상태에 따라 개와 고양이를 구분할 수 있겠죠. 그러려면 눈의 특성을 추출하는 필터, 코의 특성을 추출하는 필터 등이 필요합니다. 이렇듯 필터는 요소별, 특징별 특성을 가져오는 역할을 합니다.

 

💡Note: 필터 기능을 쉽게 설명하려고 단순화해 이야기했습니다. 실제로 눈, 코, 입 필터가 딱 구분되진 않을 수 있습니다.

 

다음 그림은 크기가 4 x 4인 데이터와 3 x 3인 필터를 활용해 합성곱 연산하는 예입니다.

 

▼ 합성곱 연산 예시

 

필터가 입력 데이터의 왼쪽 위에서 오른쪽 아래까지 훑고 지나가면서 합성곱 결과를 구합니다. 합성곱 연산은 간단합니다. 입력 데이터와 필터의 행과 열을 맞춰 곱한 뒤 모두를 더하면 됩니다. 합성곱 연산으로 얻은 결과를 특성 맵(Feature Map) 또는 피처 맵이라고 합니다.

다음은 앞의 그림에 합성곱 연산을 수행하는 절차입니다.

 

▼ 합성곱 연산 절차

 

▼ 다중 필터 합성곱 연산

 

다중 필터를 사용하니 특성 맵이 3차원이 됐습니다.

 

2. 패딩과 스트라이드

앞서 합성곱 예시에서 4 x 4 크기의 입력 데이터에 3 x 3 크기의 필터를 적용해서 2 x 2 크기의 특성 맵을 만들었습니다. 이렇듯 합성곱 연산은 데이터의 크기를 줄이기 때문에 여러 번 반복하면 더 이상 합성곱 연산을 적용하지 못하게 됩니다. 이런 상황을 막으려면 출력되는 특성 맵과 입력 데이터의 크기를 동일하게 유지하면 될 것입니다. 그러려면 입력 데이터 크기를 좀 더 키우면 됩니다. 이를 위해 입력 데이터 주변을 특정 값으로 채우는 것을 패딩(Padding)이라고 합니다. 우리말로 ‘충전’, 즉 메워서 채운다는 뜻입니다. 보통 입력 데이터 주변을 0으로 채웁니다.

다음은 패딩을 적용해 합성곱 연산을 수행하는 예입니다.

 

▼ 패딩을 적용한 합성곱 연산

 

패딩 크기를 1로 설정해 합성곱 연산을 수행했습니다. 패딩을 적용하니 입력 데이터 크기와 특성맵의 크기가 모두 4 x 4로 같아졌습니다. 패딩 크기를 더 키우면 특성 맵도 더 커집니다.

합성곱 연산을 수행할 때, 필터는 입력 데이터의 왼쪽에서 오른쪽으로, 위에서 아래로 한 칸씩 이동하며 연산합니다. 이때 한 번에 이동하는 간격을 스트라이드(Stride)라고 합니다. 우리말로 보폭이라는 뜻이죠. 지금까지의 예에서는 모두 한 칸씩 이동했으니 스트라이드가 1이었습니다. 스트라이드를 크게 설정하면 그만큼 특성 맵 크기가 줄어듭니다. 다음은 스트라이드가 2일 때의 합성곱연산 예시입니다.

 

▼ 스트라이드가 2일 때의 합성곱 연산

 

스트라이드가 1이었다면 특성 맵 크기가 3 x 3이 되겠지만, 스트라이드를 2로 설정하니 특성 맵이 2 x 2로 줄었습니다.

이처럼 패딩과 스트라이드 크기에 따라서 출력되는 특성 맵의 크기가 달라집니다. 이 관계를 수식으로 알아보겠습니다.

입력 데이터 크기를 𝜨𝒾𝓃, 필터 크기를 𝜥, 패딩 크기를 𝜬, 스트라이드 크기를 𝑺 라고 할 때, 출력 데이터 크기 𝜨𝘰𝓊𝑡은 다음과 같이 계산합니다.

 

 

💡 warning: 데이터가 정사각형 형태일 때 성립하는 식입니다. 가로, 세로 크기가 다르다면 가로, 세로 각각에 수식을 적용해 계산해야 합니다.

 

⎣⎦ 기호는 내림을 의미합니다. 즉, 계산 결과가 정수가 아니면 계산 결과보다 작은 값 중에서 가장 큰 정수를 취합니다.

수식을 이용해서 지금까지 다룬 합성곱 예들에서 특성 맵 크기를 구해보겠습니다.

 

▼ 입력, 커널, 패딩, 스트라이드 크기에 따른 결과 특성 맵 크기

 

3. 풀링

 

풀링(Pooling)은 특성 맵 크기를 줄여 이미지의 요약 정보를 추출하는 기능을 합니다.

합성곱과 풀링은 어떤 차이가 있을까요? 합성곱은 필터와 관련이 있습니다. 필터의 패턴과 유사한 영역을 추출합니다. 반면 풀링은 필터가 필요 없습니다. 특정 영역에서 최댓값이나 평균값을 가져와 요약 정보를 구하기 때문입니다.

요약 정보를 구하는 까닭, 곧 풀링의 목적은 무엇일까요? 첫 번째는 특성 맵 크기를 줄여 연산 속도를 빠르게 하기 위함입니다. 두 번째는 이미지에서 물체의 위치가 바뀌어도 같은 물체로 인식하기 위해서입니다. 고양이 이미지를 떠올려봅시다. 이미지에서 고양이가 가운데 있든 왼쪽에 있든 똑같은 고양이입니다. 물체 위치가 달라져도 같은 물체죠. 합성곱 연산은 물체 위치가 바뀌면 같은 물체로 인식하지 못합니다. 이 문제를 해결하기 위해 풀링이 필요합니다. 풀링은 특정 영역의 요약 정보(대푯값)를 가져오므로 위치가 약간 변해도 같은 물체라고 판단합니다. 이런 성질을 위치 불변성(Location Invariance)이라고 합니다.

풀링에는 대표적으로 최대 풀링과 평균 풀링이 있습니다. 최대 풀링(Max Pooling)은 풀링 영역에서 가장 큰 값을 취하는 방법이고, 평균 풀링(Average Pooling)은 풀링 영역의 평균값을 구하는 방법입니다. 최대 풀링은 특정 영역에서 가장 뚜렷한(밝은) 부분을 추출하고, 평균 풀링은 특정 영역의 평균적인 특징을 추출합니다. 다음 그림은 풀링 크기를 2 x 2로 설정하여 최대 풀링을 하는 예입니다.

 

▼ 최대 풀링

 

💡 Tip: 풀링 계층에서 풀링과 스트라이드의 크기는 일반적으로 같은 값으로 설정합니다.

💡 Note: 풀링 연산을 적용한 계층을 풀링 계층이라고 합니다. 일반적으로 풀링 계층은 합성곱 계층 다음에 등장합니다.

 

풀링을 적용하면 특성 맵 크기는 다음 수식과 같이 바뀝니다.

 

 

일반적으로 풀링 커널 크기와 스트라이드 크기를 같게 설정한다고 했죠? 패딩 크기가 0(기본값)이라고 하면 앞 수식은 다음과 같이 바뀝니다.

 

 

입력 데이터 크기를 풀링 커널 크기로 나눈 뒤 내림 처리를 하면 됩니다. 간단하죠? 바로 앞 그림의 풀링 연산에 수식을 적용해 특성 맵 크기를 구해보시죠. 데이터 크기는 4 x 4, 풀링 크기는 2 x 2이니까, 4를 2로 나누면 2가 됩니다. 따라서 특성 맵 크기는 2 x 2인 것입니다.

 

4. 전결합

 

이전 계층의 모든 노드 각각이 다음 계층의 노드 전부와 연결된 결합을 전결합(Fully-Connected)이라고 합니다. 전결합으로 구성된 계층을 전결합 계층(Fully-Connected Layer) 또는 밀집 계층(Dense Layer)이라고 합니다. CNN에서는 전결합 계층을 보통 마지막 부분에서 구현합니다. 앞의 합성곱과 풀링 계층이 이미지에서 특성을 뽑아내면 전결합 계층은 이 특성을 활용해 특정한 레이블로 분류하는 역할을 합니다.

합성곱 계층과 풀링 계층을 거친 2차원 데이터는 1차원으로 바꾼 뒤 전결합을 적용할 수 있습니다. 이렇듯 다차원 데이터를 1차원 데이터로 바꾸는 작업을 평탄화라고 합니다. 개와 고양이를 구분하는 문제를 생각해보죠. 최종 출력값은 개와 고양이로 딱 2개입니다. 곧, 최종 출력값은 1차원입니다. 1차원인 최종 출력값을 구하기 위해 전결합 계층의 입력도 1차원으로 받습니다. 그러기위해 평탄화를 해줘야 합니다. 전결합 계층을 거치면 최종 출력값, 즉 우리가 원하는 타깃값이 도출됩니다.

 

▼ 전결합

 

그림에서는 먼저 3 x 3 크기의 데이터를 평탄화해서 크기가 9인 1차원 데이터를 만들었습니다(사실 3 x 3 x 1 크기인 3차원 데이터지만 편의상 3 x 3 크기인 2차원처럼 표현했습니다). 크기가 9인 1차원 데이터를 크기가 5인 1차원 데이터와 전결합했습니다. 모든 노드가 서로 완전히 연결되었죠. 마지막으로 크기가 5인 데이터와 크기가 2인 데이터(타깃값)를 전결합했습니다.

여기서 잠깐, 평탄화한 1차원 데이터를 바로 최종 출력값과 전결합하면 편할 텐데, 전결합 계층을 왜 여러 개 만들까요? 분류를 더 효율적으로 하기 위해서입니다. 예를 들어, 평탄화한 데이터가 100개라고 합시다. 100개의 특성을 바탕으로 바로 최종 출력값, 즉 타깃값을 구해도 됩니다. 하지만 그보단 100개의 특성을 토대로 10개의 특성으로 먼저 구분하고, 다시 10개 특성을 기반으로 최종 출력값을 구하는 게 더 좋을 수 있습니다. 마치 산더미처럼 쌓인 물건들을 정리할 때, 1차로 먼저 분류한 뒤, 분류한 것을 바탕으로 다시 정리하는 게 더 효율적인 것처럼요.

 

5. 합성곱 신경망 전체 구조

 

지금까지 합성곱, 패딩, 스트라이드, 풀링, 전결합 등 신경망을 구성하는 주요 요소에 관해 알아봤습니다. 모든 요소를 한 번에 표현하면 다음 그림과 같습니다.

 

▼ 합성곱 신경망 전체 구조

 

가장 먼저 4 x 4 크기의 입력 데이터에 3 x 3 필터, 패딩 1, 스트라이드 1을 적용해 합성곱 연산을 수행합니다. 그 결과 4 x 4 특성 맵이 출력됐습니다. 여기에 2 x 2 크기의 풀링을 적용하니 특성 맵 크기가 2 x 2로 줄었습니다. 이를 전결합 계층에 입력하기 위해 평탄화해 1차원 데이터로 만들었습니다. 전결합 계층의 최종 출력값은 두 개입니다. 예컨대 0이면 강아지, 1이면 고양이라고 합시다. 강아지나 고양이 사진을 최초 입력으로 전달받아 강아지인지 고양이인지 구분하는 CNN 모델을 만든 겁니다. 물론 아주 단순한 구조일 뿐이죠.

실제로는 입력 데이터가 2차원이 아니라 3차원 이상인 경우가 많습니다. 이미지의 경우 가로 세로 크기뿐 아니라 색상 등을 나타내는 채널 값도 필요합니다. 채널을 추가하면 가로 픽셀 수, 세로 픽셀 수, 채널 수로 3차원 데이터가 되는 거죠. 이 데이터를 미니배치 단위로 처리하면 배치 크기, 가로 픽셀 수, 세로 픽셀 수, 채널 수로 4차원이 됩니다. 보통 이미지 처리용 딥러닝 모델은 미니배치 단위로 훈련하므로 기본적으로 4차원 데이터를 다룬다고 생각하면 됩니다.

 

 

다시 살펴보는 딥러닝 주요 개념 3편에서는 성능 향상을 위한 딥러닝 알고리즘에 대해 알아봅시다.

신백균
KAIST 산업및시스템공학과 졸업 후 한국생산성본부에서 직무교육 기획 및 운영을 담당하는 전문위원입니다. 세계 랭킹 0.18%의 캐글 노트북 엑스퍼트(Expert)이며, 월 평균 6만여 명이 방문하는 데이터 분석/머신러닝 관련 기술 블로그를 운영하고 있습니다. 참여자 1,200명 이상인 머신러닝 관련 오픈 채팅방의 운영진이기도 합니다.

Leave a Reply

©2020 GoldenRabbit. All rights reserved.
상호명 : 골든래빗 주식회사
(04051) 서울특별시 마포구 양화로 186, 5층 512호, 514호 (동교동, LC타워)
TEL : 0505-398-0505 / FAX : 0505-537-0505
대표이사 : 최현우
사업자등록번호 : 475-87-01581
통신판매업신고 : 2023-서울마포-2391호
master@goldenrabbit.co.kr
개인정보처리방침
배송/반품/환불/교환 안내