원래는 Unsupervised Learning 강의 전까지는 강의 2개를 한 번에 정리하려고 했으나, Lecture 6와 7이 Training NN으로 같은 Topic이라 Lecture 5는 따로 하는게 좋아보여서 이렇게 따로.

Lecture 5 - Convolutional Neural Networks

우선, Convolutional Neural Networks (CNN)의 역사에 대해 짧게 설명해주고 있다. LeCun 씨가 1998년 처음 제안한 CNN 구조를 담은 LeNet과, 2012년 ImageNet Large Scale Visual Recognition Challenge (ILSVRC)에서 상당한 에러 감소율로 빵 떴던 AlexNet까지. 그러면서 ConvNet은 거의 모든 task에 활용된다고 설명하고 있다.

VGG와 GoogleNet도 층을 계속 깊게 쌓은 건데, 후에 ResNet 설명하면서 얘기하려는갑다.

Convolution Layer

Convolution Layer는 image에 filter를 sliding 하면서 dot product를 수행하는 과정이다. 앞서 배웠던 $Wx$ 같은 Fully-Connected (FC) Layer와 다른 점은, image 전체를 보지 않고 local한 일부 만을 보는 점이다. (local function) 그리고 image의 local한 어디 부분을 보던지 같은 filter를 사용하기에 같은 weight를 사용하게 된다. (weight sharing)

이름이 Convolution인 이유는 우리 signal processing 할 때 많이 쓰는 convolution operation과 매우 유사해서 그러하다. 부호 관련된 이슈 빼면 그냥 같은 operation이다.

Filter Parameter

Convolution 시 filter와 관한 parameter들이 있는데, 이는 pytorch 공식 문서에 더 잘 나와 있다. (pytorch Conv2d) image와 같은 2d data 외에도 sound 같은 1d나 video 같은 3d data를 위한 Conv1d, Conv3d, 혹은 LazyConv, ConvTranspose 등 torch에서 다양한 Convolution layer가 제공되고 있다.

torch.nn.Conv2d에서의 파라미터로는, in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias, padding_mode 등이 있다. Lecture에서는 kernel_size, stride, padding에 대해서 값이 바뀌면 output shape이 어떻게 되는지 예시를 통해 알려주고 있다.

일반적으로는 (F=3, s=1, p=1), (F=5, s=1, p=2), (F=1, s=1, p=0)(1x1 conv) 많이 쓰는 것 같다. 1x1 Conv도 처음에는 이 짓 왜하지 싶었는데, GoogLeNet, Xception, Squeeze 등 여러 군데서 쓰고 생각보다 연산량 감소도 많이 되면서 nonlinearity가 증가되는 구나를 깨달았다.

무튼 식으로 나타내보면, input.shape가 $C_{in} \times H \times W$라면, $C_{out}$ 개의 filter가 kernel_size=F, stride=S, padding=P일 때, output.shape는 $C_{out} \times (1+\frac{H-F+2P}{S}) \times (1+\frac{W-F+2P}{S})$가 된다. (물론 divisible한, nice한 s 값이라 하자.)

Conv-ReLU를 계속해서 쌓아갈 때, 처음에는 image에서 edge 유무와 같은 low-level feature를 extract 한다고 볼 수 있고, 그 이후에는 imgae에서 corner나 좀 더 high-level feature를 extract 한다고 볼 수 있다. 우리 그 쥐 뇌에다가 전기 꽂고 뇌파 측정한 그 실험이랑 isomorphic한 얘기.

Pooling Layer

CNN에서 만약에 Pooling Layer 없이 Conv-ReLU만 무한 반복하여 Layer를 쌓게 된다면, input의 shape가 channel만 많아지게 될 것이다. (물론 filter parameter를 조정하면서 channel 수를 증가시킴과 동시에 size를 줄일 수 있겠지만, 별로 좋지 않은 행동이니까.) 그래서 우리는 layer를 거치면서 downsampling을 하기 위해 pooling layer를 추가하게 된다. Conv-ReLU-Conv-ReLU-Pooling 이런식으로. Pooling도 마찬가지로 filter가 움직이면서 값을 하나 뽑아낸다고 생각하면 되지만, Conv.시 filter와는 다른 점은 파라미터로 학습하는 filter가 아니라는 점. 다른 수업에서 생각보다 이거 TF 문제 틀리는 사람들이 많던데 마찬가지로 pytorch 공식 문서에 더 잘 나와 있다. (pytorch MaxPool2d) MaxPool 말고도 AvgPool, LPPool, AdaptiveMaxPool 등 torch에서 다양한 pooling layer가 제공되고 있다.

Pooling Layer의 한 가지 장점은 spatial invariance를 얻게 된다는 건데, 예를 들어 max pooling을 한다고 했을 때 filter로 보는 image의 일부분에서 edge가 있어서 max 값이 나온 경우를 생각해본다면. filter를 stride 시켰을 때 (small transition을 생각) 여전히 edge가 있기 때문에 동일한 max 값이 pooling 결과가 된다. 그래서 일종의 stability을 얻게 되는 것.

무튼 일반적으로 (F=2, s=2) 많이 쓰는 것 같다.

FC Layer & Softmax

이렇게 (Conv-ReLU-Conv-ReLU-Pooling)*N 해서 Low-level Feature로 부터 High-level Feature 까지 뽑았다면, 이제 image classification task의 최종 목표를 위해 FC layer를 거친 후 Softmax를 계산하여 class로의 probability를 구하게 된다.

Example - LeNet-5

끝으로 처음 CNN을 배울 때, Conv시 filter size가 $5 \times 5$ 뭐 이런 식으로 적어 놓긴 하지만, 사실 이 표현 속에 $5 \times 5 \times C_{in}$이 내포되어 있는 것이 헷갈렸었다. 그래서 막 Conv-layer에서 학습하는 파라미터 개수는? 이런 거를 할 때 마다 틀렸었는데.. LeNet-5 구조를 보면서 한 번 싹 정리하니까 뭔가 이해가 한 번에 쏙 됬었다. 그래서 정리 차 내 노트를.

5_1

Reference

강의 및 그림 출처 1 (http://cs231n.stanford.edu)

태그:

카테고리:

업데이트:

댓글남기기