이번 시간에는 대표적인 딥러닝 모델 CNN에 대하여 설명해 볼 것이다.
0. CNN:Convolution Neural Network
우선 CNN이 도입되게 된 이유는 기존의 MLP 등에서 사용되던 Fully connected layer: 완전연결계층에서는 이미지 데이터등의 데이터를 를 입력으로 넣었을 때, 이를 학습시키기 위하여 1차원으로 평탄화(Flatten)를 시켰다.
그러나 이렇게 평탄화하는 과정에서 이미지 데이터의 경우 "형상정보" 가 사라진다. 형상정보라 함은 공간적 구조를 의미한다.
이러한 형상정보를 유지하기 위해 합성곱 신경망이 등장하였다.
합성곱 신경망은 모델의 첫부분에 합성곱과 관련된 연산, 합성곱연산을 진행하여 주요 특징들을 추출한 뒤 이후에 flatten을 시키는 방식이다.
1. 합성곱 연산
`합성곱(Convolution)`연산은 입력 데이터에 `필터(Filter)` 혹은 `커널(Kernel)`을 적용하여 `윈도우(Window)`를 일정 간격으로 이동해 가며 수행한다.
합성곱 연산의 순서는 왼쪽 위에서 오른쪽으로 스캔하는 방식으로 이뤄지며, 입력과 필터에서 동일한 위치에 대응되는 원소끼리 곱하여 진행한다.
왼쪽의 input이 들어오면, 가운데의 필터를 곱하는 합성곱 연산을 진행한다. 동일한 위치에 있는 숫자들끼리 곱하여 특성을 추출하고 필터를 옆으로 한 칸 옮기면서 반복하는 것이다. 최종적으로 input과 filter을 통해 추출된 것을 `Feature map` 이라고 부른다.
1-1. Stride(스트라이드)
다음으로 위에서 합성곱연산을 진행할 때는 필터를 한칸씩 옆으로 움직이면서 계산을 했다. 이때 `Stride` 파라미터를 조절하면 한 번에 여러 칸씩 움직이면서 합성곱연산을 진행할 수 있다.
오른쪽 그림의 경우에는 stride를 1로 지정한 합성곱 연산이다.
1) (0*1)+(1*0)+(5*1)+(5*2) = 15
2) (1*1)+(7*0)+(5*1)+(6*2) = 18
다음으로 왼쪽 그림의 경우에는 stride를 2로 지정한 합성곱 연산이다.
1) (0*1)+(1*0)+(5*1)+(5*2) = 15
2) (7*1)+(5*0)+(6*1)+(6*2) = 25
위의 결과에서 한눈에 볼 수 있듯이 stride를 어떻게 지정하냐에 따라 피쳐맵의 크기가 줄어든다. 이 stride는 사용자가 지정해줘야 하는 값이다.
stride를 1보다 크게 지정하면 장점들이 있을 수 있다.
1) 출력 크기가 감소하기 때문에 전체 컨볼루션 연산에 필요한 연산량을 줄일 수 있다.
2) 특징 맵에서 특정 패턴등을 건너뛰어 작은 디테일들을 무시하고 중요한 특징에 집중할 수 있다. + 과적합 방지
또한 만약 stride를 1보다 작게 설정하면, 입력이미지를 훑을 때 겹치는 부분이 발생하는데 이는 특정 위치의 특징을 여러 번 포착하게 되어 일종의 앙상블 효과를 가져올 수도 있지만, 거의 사용하지 않는다.
특정 이미지의 가로를 N, 세로를 F라고 하고 stride를 S라고 할 때 특정 이미지가 커널을 거쳤을 때의 output size는 다음과 같다.
$$ \text{Output size} = \frac{N-F}{S} +1 $$
1-2. Padding(패딩)
다음으로 패딩이다. 합성곱 연산을 진행하게 되면 입력 shape보다 feature map의 shape이 작아진다.
합성곱 연산을 계속 반복하다보면 피쳐맵 크기가 점점 줄어들고 너무 작은 피쳐맵은 학습을 원활하게 진행시키지 못한다. 따라서 가상의 테두리를 만들어주는 작업을 padding이라고 할 수 있는데 보통 CNN에서는 가장자리를 0으로 채운다.
위 그림에서 볼 수 있듯이 패딩을 지정해 줌에 따라 피쳐맵과 입력이미지의 크기가 같게 되었다.
stride와 padding을 적용한 feature map의 output size는 다음과 같다. P는 패딩 사이즈를 의미한다.
$$ \text{Output size} = \frac{N-F+2P}{S} +1 $$
1-3. Pooling(풀링)
다음으로 pooling이 있는데, 위와 같이 피쳐맵의 크기가 작아지는 것을 방지하기 위하여 패딩을 추가하기도 하지만, 이미지의 크기를 계속 유지하게 된 채 Fully connected layer로 넘어가게 되면 연산량이 많아지고 필요 없는 정보들이 포함될 수도 있어서, 합성곱 레이어의 출력을 다운샘플링하여서 피쳐맵의 크기를 줄이는 풀링 연산을 한다.
풀링연산을 통해서 모델의 파라미터 수를 줄이고, 과적합도 방지하며 계산 효율성을 증가시킨다. 이때 중요한 피쳐맵의 정보를 뽑기 위해서 `max-pooling` 혹은 `average pooling`을 적용한다. 주로, 2x2나 3x3의 크기를 사용한다.
두 방식중 무조건적으로 좋은 것은 없으며, 해결하고자 하는 문제에 따라서 적합한 방식을 선택하면 된다.
정리하자면, 풀링연산의 특징은 학습의 효율성, 노이즈에 robust로 정리할 수 있다.
1-3-1. Max pooling
최대풀링은 말 그대로 최댓값을 남기는 것이다.
아래와 같이 pooling 사이즈에 해당하는 칸에서의 최댓값만을 남겨 피쳐맵의 크기를 줄인다.
주로 많이 사용되며, 피쳐맵에서 가장 두드러지는 특징을 가져오는 특성 때문에 많은 정보중 중요한 정보만 선별해 내는 기능을 수행한다. 또한 일부 노이즈에 대하여 덜 민감하다. 그러나 평균적인 정보나 배경정보등을 손실할 수도 있다.
1-3-2. Average pooling
평균풀링도 말그대로, 풀링사이즈 내에서 칸들의 평균값을 남기는 방식으로 이미지의 전체적인 내용과 구조를 보존하는 것이 중요하다고 판단될 때 주로 사용하는 방식이다. 특징 맵의 극단적인 값에 덜 민감하지만, 도드라지는 특징이 덜 강조될 수도 있다는 단점이 있다.
1-4. 합성곱연산 정리
mnist 같은 흑백이미지도 있지만, 컬러 이미지를 입력데이터로 쓴다고 가정해 보자.
흑백이미지는 채널이 1개이지만, 컬러 이미지는 R/G/B를 나타내는 3개의 채널을 가지고 있다.
그럼 필터 또한 채널 각각에 적용해야하기 때문에 3개가 필요하다.
이렇게 되면 아래와 같이 최종적으로 1개의 채널에 대한 결괏값이 나오게 된다.
그런데 만약 출력채널 또한 여러채널이 나오는 것을 원한다면, 출력채널의 개수만큼 곱한 필터개수를 적용하면 된다.
즉 컨볼루션 연산 자체는 4차원이 되는 것이다. 이때 필터의 크기 (출력채널수, 입력채널수, 높이, 너비 )로 shape이 구성된다.
이러한 과정을 거쳐 feature map을 추출하게 되고 이 feature map을 flatten 시킨 다음 분류를 진행하게 된다.
1-5. 레이어 별 특징
컨볼루션 레이어에서 연산결과를 만들 떄 사용하는 영역의 크기를 receptive field라고 한다. 즉 얼마나 반영하냐를 의미하는데, 이미지의 전체적인 것을 보기위해서는 receptive field가 커야하며 그러기 위해서는 레이어를 여러개 쌓아야한다.
이렇게 뒷 레이어로 갈 수록 receptive field가 커지는 특성 떄문에 convolution layer은 초반 layer에서는 edge와 같은 국소적인 특징들을 주로 학습하게 되고 후반에서는 모양과 같은 넓은 특징들을 포착할 수 있게된다.
2. cnn 동작 과정
아래 사이트에서 CNN을 사용했을 때의 중간과정을 직관적으로 확인해 보자.
Mnist 데이터셋을 이용한 cnn 데모 페이지인데, 각종 파라미터들을 설정할 수 있으며 중간과정을 확인할 수 있다.
초기값이 위와 같이 설정되어있는데, 확인해 보면, 우선모델의 구조는 conv레이어, relu 활성화함수, pooling레이어로 구성된 블록을 두 번 반복하고 마지막은 softmax를 이용한다.
확인해 보면, 우선 필터의 크기를 5로 설정하였고, 출력채널의 개수를 8개로 설정하였으며, stride=1, pad=2로 정하였다.
다음과 같이 8개의 출력채널에 대한 결괏값이 나오게 된다.
다음으로 relu를 적용하고 pooling을 통해 피쳐맵의 사이즈를 줄여준다.
이 과정을 한번더 반복하고, fully connected layer로 펼쳐준다음 softmax를 통해 분류를 한다.
'ML & DL > 개념정리' 카테고리의 다른 글
성능 고도화 기법 (0) | 2023.12.23 |
---|---|
RNN, LSTM, GRU (1) | 2023.12.22 |
PyTorch 시작 (0) | 2023.12.21 |
손실 함수(Loss function) (1) | 2023.12.21 |
역전파(Backpropagation) 기초 (1) | 2023.12.21 |