[DL4CV] Convolutional Neural Networks

Stella Kim·2021년 7월 16일
0
post-thumbnail

Deep Learning에 대해 본격적으로 공부를 시작할 때 읽었던 책의 내용을 요약하였다.

<책 정보>

제목: Deep Learning for Computer Vision with Python
출간일자: 2018
저자: Dr.Adrian Rosebrock
출판사: pyimagesearch

Understanding Convolutions

CNN은 Convolutional Neural Networks의 약자다. 여기서의 Convolution은 2개의 매트릭스를 가지고 내적이 아닌 요소별 곱셈을 취한 뒤 이들을 모두 합산하는 방법을 취한다고 볼 수 있다.

Convolutions versus Cross-correlation


2차원의 input image I와 동일한 차원의 커널 K에 대한 컨볼루션은 위쪽 수식과 같이 정의된다. 수식에서 별표는 컨볼루션 연산을 의미한다. 하지만 거의 모든 머신러닝과 딥러닝 라이브러리는 아래쪽의 수식과 같은 cross-correlation 함수를 사용한다. 차이가 있다면 cross-correlation을 적용할 때는 input에 대해 커널을 플립할 필요가 없다는 것인데, 많은 라이브러리에서 이 cross-correlation을 사용하고 이를 convolution이라고 칭하기도 한다.

The “Big Matrix” AND “Tiny Matrix” Analogy

이미지는 너비(열 수), 높이(행 수), 깊이(채널 수)를 가진 다차원 매트릭스이다. 그래서 이미지는 big matrix로, kernel이나 convolutional matrix는 tiny matrix로 생각할 수 있다. 커널의 경우 이미지의 상단에 위치해서 좌에서 우로, 위에서 상에서 하로 미끄러지면서 원본 이미지의 각 (x, y)좌표에 convolution이라 부르는 수학적 연산을 적용하게 된다. 이러한 유형의 필터를 자동으로 학습할 수 있는 방법과 이를 이미지 분류와 object detection에 사용할 수 있지만, 이를 위해선 kernel과 convolution에 대해 더 이해하고 넘어가야 할 필요가 있다.

Kernels


좌측 그림에서 볼 수 있듯, 빨간색에 해당하는 커널을 이렇게 슬라이딩한다. 그래서 연산을 통해 출력값을 구해내고 이는 커널의 중심과 동일한 좌표로 출력 이미지에 저장된다. 커널의 크기를 MxN이라 가정한다면 M과 N은 홀수를 보통 사용하는데, 그 이유에 대해선 우측의 그림들을 보시면 이해하기 쉽다. 3x3 매트릭스에서는 행렬의 중심이 (1, 1)이라고 정확한 정수로 정의내릴 수 있지만, 2x2 매트릭스에서는 중심이 (0.5, 0.5)로 정수가 되지 않는다. 그렇기에 커널의 중앙에 항상 유효한 좌표 즉, 정수가 있도록 하기 위해서 홀수 크기의 커널을 사용한다.

A Hand Computation Example of Convolution

영상 처리에서 convolution은 입력 영상, 커널, 출력값을 저장할 출력 영상 이렇게 세 가지 요소를 필요로 한다. 컨볼루션을 위해서는 원본 영상에서 좌표를 선택해서 커널의 중앙을 이 좌표에 맞게 배치한 후, element-by-element 방식으로 두 매트릭스를 곱한 다음 이 값들을 모두 더하여 앞서 출력 영상의 원본 영상에서 선택한 좌표와 동일한 좌표에 값을 저장한다.

하나의 예로 들어 보면 이는 블러링을 위한 3x3 커널을 사용한 컨볼루션 연산이라고 보실 수 있다. 이렇듯 내적이 아닌 요소별 곱셈을 통해 최종적으로 132라는 결과값을 출력해냄을 확인할 수 있다.

Implementing Convolutions


실제로 컨볼루션을 구현하려고 하다 보면 화면과 같은 상황이 발생하게 된다. 즉, 커널의 모든 부분이 입력 영상과 겹쳐지지 않아 입력 영상의 가장자리 부분에 대해 어떻게 처리할 것인지를 두고 몇 가지 방법이 존재한다. 이럴 경우 유효한 위치 즉, 이 예시에서는 (1, 1)부터 연산을 수행하는 방법이 있지만 입력 영상과 출력 영상의 치수가 달라지게 된다. 이를 방지하고자 치수가 같아지도록 패딩을 적용할 수 있는데, 패딩 제로라고 0으로 가장자리 값을 채우거나 반대쪽 픽셀의 값을 가져와 복제하는 등 여러 방법이 존재한다.

CNN Building Blocks

Layer Types

  • Convolutional (CONV)
  • Activation (ACT or RELU)
  • Pooling (POOL)
  • Fully-connected (FC)
  • Batch normalization (BN)
  • Dropout (DO)

컨볼루션에 대한 이해도를 어느 정도 높였으니 이제 CNN에 대한 설명으로 넘어 가보도록 하겠다. CNN을 구축하는 데 사용되는 레이어 유형은 다양하다. 그중 가장 자주 발생하는 레이어는 위와 같다. 이러한 레이어들을 특정 방식으로 쌓으면 CNN이 생성된다. CONV와 FC는 트레인 과정동안 학습된 매개변수를 포함하는 유일한 레이어이다. ACT와 DO 레이어는 진정한 “레이어”로 간주되지는 않지만 구조를 명확히 하기 위해 다이어그램에 포함된다. 그래서 이 둘을 제외한 나머지 4개의 레이어들은 실제 네트워크 구조를 정의할 때 가장 중요하다고 볼 수 있다. 레이어마다 자세히 살펴보도록 하겠다.

Convolutional Layers


CONV 레이어는 CNN의 핵심 구성 블록이다. 파라미터는 커널 K로 구성되며, K 집합 내의 필터는 대부분 동일한 너비와 높이를 갖는 정사각형 구조를 가진다. 입력 레이어가 아닌 네트워크 상에서의 더 깊숙한 레이어에서의 볼륨의 경우 깊이는 이전 레이어에 적용된 필터 수라고 정의할 수 있다. 그림을 보면, 첫 단계로 CNN의 각 컨볼루션 레이어에 커널들이 입력 데이터에 적용되었고, 컨볼루션을 통해 최종적으로 각 커널들은 activation map이라 불리는 2차원 출력을 생성한다. 이 activation map을 쌓아서 최종 출력 볼륨을 형성한다.
이런 식으로 네트워크의 필터는 입력 볼륨의 지정된 공간 위치에서 특정한 유형의 형상을 볼 때 활성화되는 학습을 하게 된다. 네트워크의 하위 계층에서는 엣지나 코너같은 영역에 대해 활성화될 수 있겠고, 더 깊게 들어갈수록 얼굴의 일부와 같이 높은 수준의 특징에 작동할 수 있게 된다.
예를 들면, RGB영상에 대해 receptive field(변수 F)가 3x3이면, CONV 레이어의 각 뉴런은 3x3x3=27의 가중치로 이미지의 3x3 크기의 local region에 연결될 것이다. 간단히 말해서, F는 필터의 크기로서, 입력 볼륨과 연계된 FxF 커널을 산출한다.

출력 볼륨의 크기를 제어하는 세 가지 파라미터가 있는데, 첫 번째는 앞서 소개한 깊이이다. 두 번째는 stride로 사전적 의미로는 걸음걸이, 걸음이라는 뜻을 갖는다. CONV 레이어를 생성할 때 이 stride step size S는 보통 1이나 2의 값을 가진다. Stride 값이 작을수록 더 큰 출력 볼륨으로 이어지게 된다.
마지막 파라미터는 제로 패딩이다. 앞서 언급했듯, 컨볼루션을 수행할 때 원래 이미지 크기를 유지하기 위해선 이미지의 경계를 패딩해야 한다. 적용하려는 패딩의 양은 파라미터 P에 의해 조절된다. P에 1 값을 넣으면 0으로 패딩해서 데이터를 생성한 다음 이것을 컨볼루션을 하여 원래의 입력 크기와 일치하는 출력 결과를 만들어낼 수 있게 된다.

Activation Layers


CONV 레이어 이후 원래는 앞선 포스트에서 언급한 ReLU나 ELU같은 비선형 활성화 함수를 적용하게 된다. 이 레이어 내에서는 매개변수나 가중치가 학습되지 않아서 기술적으로 레이어는 아니지만 다이어그램 상에 표기하게 된다.

Pooling Layers


CONV 레이어와 유사하게 입력 볼륨의 공간 크기를 줄여 매개변수와 계산량을 줄여주고 오버피팅을 제어하는 데 도움을 준다. POOL 계층은 최대나 평균 함수를 사용해서 입력의 각 깊이 슬라이스에서 작동하게 되는데, max polling은 CNN 구조 중간에서 사용되는 반면, average pooling은 FC 계층을 사용하지 않고자 최종 계층에서 사용된다. 그림은 2x2 풀 크기와 s 값을 각각 1 또는 2를 가진 맥스 풀링을 적용한 예시이다. 2×2 블록마다 가장 큰 값만 유지하고 슬라이딩해서 출력 값을 도출한다. 이 풀링을 사용할 경우 너비와 높이를 2배로 줄일 수 있어서 이전 계층의 활성화 75%를 효과적으로 폐기할 수 있다고 한다.

Fully-connected Layers

FC 레이어의 뉴런은 피드포워드 신경망의 표준으로 이전 레이어의 모든 activation들과 연결되어 있다. 이 FC 레이어는 네트워크 끝에 배치된다. 소프트맥스 분류기를 적용하기 전에 FC 레이어를 하나 또는 두 개 사용하는 것이 보편적이다.

Batch Normalization


이름에서 알 수 있듯 배치 정규화(BN) 레이어는 다음 계층으로 입력 볼륨을 전달하기 전에 해당 입력 볼륨의 활성화를 정규화하는 데 사용된다. x를 활성화의 미니 배치로 간주하게 되면 상단의 식을 통해 정규화된 x햇을 계산할 수 있다. 트레인 중에 각 미니 배치 β(베타)에 대해 μ(뮤)와 σ(시그마)를 하단의 방정식을 이용해 계산한다. ε(엡실론)은 0으로 나누어지는 것을 막기 위해 작은 양의 값으로 설정한다. 결과적으로 0의 평균과 0을 중심으로 한 분산을 가지게 된다. 테스트 시에는 트레인 과정에서 계산한 뮤와 시그마의 평균으로 미니 배치 값을 교체해 수행하는데, 이를 통해 정확한 예측을 얻을 수 있게 된다. 이렇듯 BN 레이어를 통해 신경망을 훈련시키는데 필요한 epoch 수를 감소시켜 학습 속도를 빠르게 하고 정규화를 통해 낮은 loss를 구해낼 수 있다는 데 의미가 있다. BN 레이어는 RELU 레이어 다음에 위치한다.

Dropout


드롭아웃은 트레인 정확도를 낮추고 테스트 정확도를 높임으로써 오버피팅을 방지하는 것을 목표로 하는 정규화의 한 형태라고 보면 된다. 트레이닝 셋의 각 미니 배치에 대해 p의 확률로 드롭아웃 레이어들은 이전 계층에서 다음 계층으로의 입력을 무작위로 분리한다. 미니 배치에 대해 포워드와 백워드 패스가 수행되면 삭제된 연결을 다시 연결한 다음 드롭할 다른 연결 셋을 샘플링한다.

Common Architectures and Training Patterns

Layer Patterns


정리해서, 가장 일반적인 CNN 구조는 위와 같다. * 연산자는 한 번 이상의 작업을 의미하고 ?는 선택적 작업을 의미한다.

profile
취업 준비 용으로 사용했던 기술 블로그입니다. 이제는 업로드 거의 안 할지도..

0개의 댓글