Introduction
CNN은 이미지나 시계열 데이터를 처리하는데 특화된 신경망 구조이다.
한번 이미지 classification 문제를 일반적인 MLP로만 해결한다고 해보자.
그러면 먼저 이미지의 각 픽셀들을 모두 펴서 하나의 벡터로 만들게 되고, 이를 FC(fully connected layer)에 넣서 계산한다.
이러한 방식은 픽셀간의 위치 관계(예를 들면 이미지에서 가까운 두 픽셀은 서로 멀리 떨어진 픽셀보다 더 관련이 많다)등을 무시하고, 파라미터 양도 매우 많아서 이미지를 학습하기에는 비효율적이다.
반면, CNN은 이러한 픽셀들의 공간적 구조를 고려해 더 효율인 신경망이다.
CNN에서 각 레이어의 역할은 다음과 같다.
1. Convolutional Layer (Conv)
- 이 레이어 에서는 edge나 blob 등 이미지의 특징들을 검출한다.
2. Pooling Layer (Pooling)
- (이미지) 데이터의 크기를 줄여서 파라미터의 수를 줄인다.
3. Fully connected Layer (FC)
- 마지막에는 검출된 특징들을 가지고 FC에서 classification 같은 문제들을 해결한다.
대부분의 CNN 모델들은 다음과 같은 구조를 보인다.
Input - Conv - Pool - Conv - Pool - ... - FC - FC - ... - Output
Convolution Layer
Convolutions
convolution연산은 convolution layer의 핵심으로 edge같은 이미지의 특징을 검출할 수 있게 해준다.
convolution연산을 보기에 앞서, edge detection의 고전적인 방법을 보자.
고전적인 edge detection
이미지의 edge는 픽셀의 변화가 큰 부분에서 나타난다.
이미지를 함수로 볼 때, 미분값이 큰 부분들을 edge로 볼 수 있다.
이미지의 vertical edge에 대해서만 생각해보자.
p(x, y)를 (x, y)의 픽셀이라고 할 때,
$\lim_{a \to 0} \frac{p(x + a, y) - p(x - a, y)}{2a}$ 의 절댓값이 크면 edge로 볼수 있다.
이미지의 픽셀들은 이산적이므로 다음과 같이 고칠수 있다.
$\frac{p(x + 1, y) - p(x - 1, y)}{2}$
즉, 이 식으로 모든 픽셀에 대해 미분을 해주면 edge를 검출할 수 있고,
이는 아래의 mask를 모든 픽셀에 적용하는것 으로 생각할 수 있다.
(분모의 2는 모든 픽셀에 곱해줄 수 있으므로 중요하지 않다.)
아래의 필터들을 여러 edge detect filter들이다.
이 필터들을 각 픽셀에 대해서 적용해주면, edge를 검출할 수 있다.
convolution layer와 고전적인 edge detection의 차이는 filter의 파라미터를 사람이 직접 지정해 주지 않고 스스로 학습한다는 것 이다. 고전적인 edge detection을 예시로 convolution 레이어를 설명했는데, 오해하면 안되는 것이 convolution layer은 edge 뿐만 아니라 이미지의 다른 특징들도 학습한다는 것 이다.
convolution에 대해 이 영상이 매우 잘 설명해 주고 있으므로 참고해도 좋다.
Padding
padding은 convolution으로 이미지가 작아지고, 가장자리 픽셀들에서 정보가 손실되는 문제를 해결하기 위해,
이미지 테두리 부분에 픽셀들을 포함시켜 convolution을 하는 방법이다.
이때 새롭게 포함시키는 픽셀들은 대부분 0의 값을 가진다.
흔히 Padding을 하는 두가지 방법
1. Valid convolution : 패딩을 사용하지 않음.
2. Same convolution : input size와 output size가 같도록 padding을 사용.
Stride
stride란 convolution을 할때 filter가 한 스텝에서 움직이는 거리이다. (filter의 보폭으로 이해해도 된다.)
Image 차원 계산
$(f_h, f_w)$ filter, $(p_h, p_w)$의 padding, $(s_h, s_w)$의 stride에 대해 $(n_h, n_w)$ image의 결과는 다음과 같다.
$(\lfloor \frac{n_h + 2p_h - f_h}{s_h} + 1 \rfloor, \lfloor \frac{n_w + 2p_w - f_w}{s_w} + 1 \rfloor)$
수식에서 floor 함수를 볼 수 있듯이, 실제 구현할때도 image의 영역(padding 포함)을 조금이라도 넘어간 filter에 대해서는 계산하지 않는다.
Convolutions on RGB images
실제 이미지는 RGB 세가지 색갈을 가질수 있기에, 2차원이 아니라 3차원 data로 볼 수 있다.
이때 세번째 차원(R, G, B에 해당)을 channel 또는 depth 라고 부른다.
convolution 연산은 각 channel에 대해 2D image에서 해줬던 연산을 똑같이 해주면 된다.
Multiple filters
한 입력에 대해 하나의 필터만 사용하면 2차원의 output이 나온다.
그런데, 하나의 필터만 사용하면 하나의 특징밖에 검출하지 못하므로 실용적이지 못한다.
그래서 보통 여러 필터를 사용하는데, 이때 어떤 필터들은 서로 다른 특징들을 검출한다.
ex) vertical edge detect, horizontal edge detect ...
Pooling Layer
pooling layer는 데이터의 특징들을 유지하면터 크기를 줄여서, 계산 속도 또한 높여주는 층이다.
pooling의 종류에는 max pooling과 average pooling이 있으며, 주로 max pooling을 사용한다.
pooling layer는 그 목적상 padding을 사용하지 않는다.
pooling layer의 output size는 다음과 같이 계산할 수 있다.
input size : $(n_h, n_w)$, filter size : $(f_h, f_w)$, stride : $(s_h, s_w)$
$(n_h, n_w) \to (\lfloor \frac{n_h - f_h}{s_h} + 1 \rfloor, \lfloor \frac{n_w - f_w}{s_w} + 1 \rfloor)$
'인공지능' 카테고리의 다른 글
Cross Entropy Derivation (0) | 2024.03.11 |
---|---|
CS234 Notes - Lecture 2 번역본 (0) | 2023.11.17 |
RNN - Recurrent neural network (0) | 2023.09.11 |
머신러닝에 쓰이는 정보이론 (0) | 2023.09.04 |
Optimizer 정리 (2) | 2023.08.24 |