Coursera의 Deep Learning Specialization - Week 4의 강의를 수강하면서 필기한 내용을 바탕으로 정리한 글입니다.
4주차는 Deep Learning의 핵심인 합성곱 신경망(CNN)과 CNN을 활용한 다양한 모델들에 대해 배웁니다.
CV(컴퓨터비전) 분야에서는 주로 입력으로 이미지가 들어오게 되는데, 이미지의 크기는 1024 * 1024의 경우 약 100만에다가 R,G,B 3개의 채널이 있으므로 약 300만의 크기를 가지게 됩니다. 해상도가 커지면 그 크기는 지수적으로 커지게 되죠.
이미지처럼 입력의 크기가 매우 큰 경우, 일반적인 신경망을 이용하기에는 연산이 매우 느려 사용이 힘듭니다. 이에 맞추어 Convolution Neural Network, 합성곱 신경망이 등장합니다.
Convolution
합성곱은 * 기호를 이용합니다. Input을 필터에 통과시키는 기능을 하는데, 이미지의 특성을 찾는 가장 성능이 좋은 필터 W를 찾기 위해 모델을 학습하게 됩니다.
필터를 Input에 슬라이싱하면서, 각 요소를 곱한 뒤 전체 합을 구하는 아다마르 곱(Hadamard Product)을 수행합니다. 그 결과로, 이미지의 크기가 작아지게 됩니다.
필터가 어떻게 구성되어 있냐에 따라 이미지의 다양한 특성을 찾을 수 있게 됩니다. [1, 0, -1]을 row로 broadcast하면 수직 모서리를 찾게 되고, column으로 broadcast하면 수평 모서리를 찾는 필터가 됩니다. 그 외에 다양한 필터가 있습니다.
Padding
합성곱을 진행할 때, 모서리에 있는 픽셀들은 필터를 단 한 번만 통과하게 되어, 모서리 부분 정보가 많이 전달되지 못하고 버려지게 됩니다. 이를 막기 위해 입력 테두리에 '0'값을 패딩(Padding)하게 됩니다. 패딩의 효과는 아래와 같습니다.
- 원본 Input의 정보와 크기가 과하게 축소되는 것을 방지하고, 크기를 보존합니다.
- 모서리 부분의 정보가 버려지는 것을 막아줍니다.
Input과 Output의 크기를 같게 하기 위한 Padding 크기 P는 아래와 같습니다.
N - F + 1 + 2 * P = N
=> P = (F - 1) / 2
Stride
입력 크기가 너무 크고 필터 크기는 너무 작아서 많은 필터링을 거쳐야 할 때, 필터를 한 pixel씩 이동시키지 않고 여러 pixel을 이동하게 합니다. Stride는 필터가 다음 단계로 이동하는 pixel 수를 의미합니다. 마지막 필터가 입력 이미지를 벗어날 때는 연산하지 않습니다.
3D Convolution
위에서 설명한 Convolution은 2D Input에 대한 예시였지만, 실제 이미지는 R, G, B 3개의 Channel을 가지고 있어 3차원의 크기를 가지고 있습니다.
3D Convolution의 경우, 입력 크기는 [ #Height, #Width, #Channels ] 의 3차원 배열이 됩니다. 이 때 3차원 필터는 너비와 높이는 마음대로 정의해도 되나, #Channels 값이 반드시 Input의 값과 같아야 합니다. 필터링에서 슬라이싱이 이루어질 때 모든 Channel에 대해 함께 수행되기 때문입니다.
합성곱 결과는 2차원 배열이 나오게 되고, 그 값은 기존의 신경망에서 입력 X에 가중치 W가 곱해진 값에 해당합니다. 필터가 가중치 역할을 수행하고 있는 것이죠. 이 값에 bias를 더하고, 활성 함수를 통과하여 하나의 활성값 a를 계산하게 됩니다.
하나의 Input에 대해 N개의 필터를 통과시키면, Output 또한 N개의 Channel을 가지게 됩니다.
합성곱 레이어 l에 대해 차원 크기는 아래와 같습니다.
입력의 Channel과 필터의 Channel이 같아야 하고, 출력의 Channel은 필터의 개수와 일치하다는 것이 중요합니다.
CNN에서 가장 중요한 핵심 Layer는 합성곱 Layer CONV, Pooling Layer POOL, Fully Connected Layer FC 총 3개입니다.
CONV와 POOL은 이미지를 분할, 분석하여 정보량을 줄이면서도 특징을 극대화하는 데 사용된다면, FC는 CONV & POOL의 출력으로부터 데이터를 단일 벡터로 평탄화하고, 이미지를 분류하고 설명하는 데 사용됩니다. 그 중 Pooling Layer에 대해서 자세히 알아보겠습니다.
Pooling Layer
CONV Layer를 통과하면 이미지의 특징은 극대화하고, 정보량은 줄게 됩니다. 너무 많은 정보가 버려지지 않게 하기 위해서 패딩을 이용하죠. POOL Layer는 데이터의 차원을 낮춰 신경망 연산을 빠르게 하고, 특징 극대화에 목적을 두어 이용됩니다.
대표적으로 Max Pooling, Average Pooling이 있습니다.
Max Pooling은 영역을 나누어, 해당 영역에서의 최댓값(max)만을 선택하고 나머지 값은 버립니다.
Average Pooling은 영역을 나누어, 해당 영역의 평균값을 계산합니다.
이 과정을 통해 데이터의 정보량이 감소하는 대신, 중요 특징은 더 강조되고 연산이 빨라지는 효과가 있습니다.
CNN Example
위에서 살펴본 바를 토대로, 하나의 합성곱 신경망을 예시로 살펴보면 아래와 같습니다.
기본적으로 CONV와 POOL은 함께 진행됩니다. 따라서 두 Layer를 합쳐서 하나의 Layer로 보곤 합니다.
CONV와 POOL을 통과함에 따라 너비와 높이는 감소하고, Channel 수는 증가하게 되어 z축으로 길어지게 됩니다.
따라서 CNN이 깊어질수록 #Channels는 증가하고, nH와 nW는 감소하게 됩니다.
합성곱 레이어 이후 값들을 하나의 Column Vector로 펼치고 FC Layer를 통과하여 이미지 분류를 진행하게 됩니다.
Why Convolutions?
합성곱을 이용하는 이유는 다음과 같습니다.
1. 하나의 필터는 하나의 특성을 극대화하는 역할을 하기에, 그 값이 고정되어 있습니다. 따라서 합성공 신경망은 한 필터의 파라미터를 모든 Input에 대해 공유하게 됩니다.
2. Output은 소수의 입력값에만 의존하기 때문에 연결되어 있지 않다는 장점이 있습니다.
'Deep Learning Specialization' 카테고리의 다른 글
Detection [Deep Learning Specialization #10] (0) | 2022.07.27 |
---|---|
CNN Case Studies [Deep Learning Specialization #10] (0) | 2022.07.26 |
Error Analysis [Deep Learning Specialization #8] (0) | 2022.07.20 |
ML Strategy [Deep Learning Specialization #7] (0) | 2022.07.19 |
Tuning Process [Deep Learning Specialization #6] (0) | 2022.07.18 |
댓글