네이버 부스트캠프/LEVEL-1

[부스트캠프][WK-02 / Day8] Convolutional Neural Networks

1. 강의 내용

Convolution은 무엇인가? (최성준 교수님)

1) Convolution

Convolution의 채널의 개수는 필터의 개수에 따라 달라집니다. 따라서 인풋 채널 숫자와 아웃풋 채널 숫자를 보면 필터의 채널 숫자를 알 수 있습니다. 파라미터의 개수는 커널의 크기*인풋 채널*아웃풋 채널 입니다.

일반적인 CNN은 Convolution layer, pooling layer, fully conneted layer로 구성되어 있는데 Convolution Layer와 pooling layer는 이미지에서 유용한 정보를 뽑아내는 역할(feature extraction)을 하고 fully conneted layer는 원하는 출력값을 얻도록 해줍니다. 하지만 최근에는 Fully connected layer를 줄여가는 추세인데, 파라미터의 수가 늘어나면 학습과 일반화가 어려워지기 때문입니다.

  • Stride: 커널을 얼마나 dense를 찍을지 정해줌. 즉, 커널이 이미지를 convolution할 때 몇 칸씩 움직일지 지정.
  • Padding: 입력 이미지의 크기를 유지해주고 가장자리의 정보를 잃지 않도록 해줌.

파라미터 개수를 계산하는 예시를 봤을 때 첫번째는 커널이 11x11x3이고 인풋 채널이 3, 아웃풋 채널이 48*2 이므로 첫 파라미터 개수는 11x11x3x48x2 = 35k 입니다. 이와 같은 과정을 거처 나머지 파라미터의 개수도 계산하게 됩니다.

 

fully conneted layer를 계산할 때 예시를 보면 앞선 채널의 값, 채널의 숫자에 출력값 2048*2를 곱해주어 177M이 나옵니다. 이 경우 파라미터의 개수가 아주 많이 늘어나게 됩니다. 이렇게 되면 문제가 발생해 깊이는 늘리고 파라미터의 개수는 줄이기 위해 1x1 Convolution이라는 방식을 사용합니다.


1x1 convolution의 중요성 (최성준 교수님)

  • ILSVRC(ImageNet Large-Scale Visual Recognition Challenge): Classification, Detection, Localization, Segmentation 대회가 진행되며 Classification은 1000개의 카테고리를 가지고 있고 100만개의 이미지가 있으며 그 중 45만개를 training set으로 가집니다.

1) AlexNet

11x11 필터를 사용했는데 이는 파라미터의 관점에서 보면 볼 수 있는 영역의 크기는 넓어지지만 그만큼 파라미터의 수가 증가하기 때문에 좋은 선택이 아닙니다. AlexNet은 5개의 Conv layer와 3개의 Dense layer로 구성했습니다.

Key ideas

  • ReLU activation 사용: 선형 함수가 가지는 좋은 성질들을 포함하고 있기 때문에 경사 하강법을 최적화하기 쉬움. 일반화에 좋으며 vanishing gradient 문제를 해결.
  • 2개의 GPU사용
  • 입력 공간에서 응답이 많이 나오는 것을 죽이는 방법인 Local response normalization을 사용(현재는 잘 안씀)
  • Data augmentation
  • Dropout

위 아이디어들은 지금은 흔하지만 당시에는 잘 쓰이지 않던 것에 대해 잘되는 기준을 잡아준 것입니다.

2) VGGNet

3x3 필터를 활용했고 fully connected layer에서 1*1 convolution을 사용했으며(파라미터 줄이려는 의도는 x) dropout도 적용했습니다. 여기서 주의 깊게 봐야 할 점은 3x3 filter를 사용했다는 점입니다.

 

필터가 커지는 이점은 하나의 필터가 찍었을 때 고려되는 인풋의 크기가 커진다는 것입니다. 이를 하나의 convolution feature map의 값을 얻기 위해서 고려할 수 있는 입력의 special dimension인 Receptive field라고 부릅니다. 3x3을 2개의 층으로 쌓았을 때, 마지막 레이어의 하나의 값은 인풋 레이어의 5x5의 픽셀값을 합친 값이 됩니다. 따라서 3x3이 두번 이루어지면 Receptive field는 5x5가 됩니다. 3x3 두 번과 5x5 한 번은 Receptive field가 같지만 두 경우의 파라미터 개수는 3x3을 두 번 활용하는 경우 더 적게 됩니다. 그래서 최근의 필터들은 거의 7x7을 넘지 않습니다.

3) GoogLeNet

1x1 convolution을 잘 활용하게 되면 파라미터의 수를 효과적으로 줄일 수 있다는 것을 알게 됩니다. Network 속에 Network를 가지는 NiN 구조를 가지고 있습니다. Inception block라는 것을 사용했는데, 이는 Conv을 하기 전에 1x1 Conv을 적용하는 것입니다. 이로 인해 전체적인 네트워크의 파라미터 숫자가 줄어듭니다. 1x1 conv는 채널 방향으로 차원을 줄이는 효과가 있습니다. 아래의 그림을 보면 파라미터 개수의 차이가 큰 것을 알 수 있습니다.

 

4) ResNet

딥러닝은 네트워크가 깊어짐에 따라 학습이 어려워졌습니다. 이에 ResNet은 인풋으로 들어온 $x$를 네트워크 혹은 conv layer의 출력값에 더해주는 방식인 identity map(skip connection)을 추가하였습니다. 여기서 conv layer가 학습하고자 하는 것은 $f(x) = f(x) + x$ 이므로 residual, 즉 차이입니다.

 

Bottleneck architecture는 3x3 conv하기 앞뒤에 1x1 conv layer를 넣어서 파라미터를 줄이는 방식으로 이를 적용해 성능은 늘어나고 파라미터 크기는 줄었습니다.

5) DenseNet

ResNet에서 skip connection을 통해 더하던 것을 Concatenation을 해보자는 아이디어입니다. 다만 채널이 커지면 그만큼 계속 concat해 거기서 가해지는 conv feature map의 크기도 기하급수적으로 커집니다. 이를 막기 위해 Dense Block으로 feature map을 키운 다음 Transition Block을 사용해 batchnorm, 1x1 conv을 통해 채널을 줄이는 방식을 반복해 늘였다 줄였다 합니다.


Computer Vision Applications (최성준 교수님)

1) Semantic Segmentation

Semantic Segmentation은 이미지를 픽셀마다 어떤 라벨에 포함되는지 분류하는 것입니다. 자율주행 등에 많이 활용됩니다.

  • Fully Convolutional Network
    dense layer를 convolutional network로 변경해주는 과정을 convolutionalization이라 합니다. 이 과정에서 파라미터의 개수는 똑같습니다. 단지 fully connected layer가 하던 일을 convolution이 하도록 하는 것입니다. 이렇게 하는 이유는 분류만 해주는 것이 아니라 heat map 형태로 대략적인 위치를 확인할 수 있기 때문입니다. 어떠한 사이즈의 인풋이 들어와도 돌아가지만 아웃풋의 차원이 줄어들기는 합니다. 이를 원래의 dense feature로 바꾸어 주어야 합니다. 예를 들어 10x10 -> 5x5 -> 10x10 으로 돌리는 방법이 필요하다는 것입니다.
  • Deconvolution (conv transpose)
    Deconvolution은 위에서 줄어든 special dimension을 다시 늘려주는 역할을 합니다. 하지만, 엄밀히 말하면 convolution 연산의 역은 있을 수 없고 따라서 온전히 복원하는 것은 힘듭니다.

2) Detection

Detection은 픽셀로 위치를 구분하는 것이 아니라 바운딩 박스를 통해서 개체를 분류하는 것입니다.

  • R-CNN
    이미지 안에서 2000개의 임의의 영역을 추출한 뒤 똑같은 크기로 맞춰서 AlexNet을 통해 feature를 뽑고 linear SVM으로 분류를 합니다. 단점은 2000개의 이미지가 모두 CNN을 통과해야 하므로, 시간이 너무 오래 걸립니다.
  • SPPNet
    SPPNet은 R-CNN과 매우 유사하지만 이미지 안에서 CNN을 한 번만 돌리는 방법입니다. 이미지 전체에 대해 conv feature map을 만든 후, 뽑힌 bounding box에 해당하는 feature만 뽑아오는 것만 영역별로 처리합니다. R-CNN보다 훨씬 빠릅니다.
  • Fast R-CNN
  1. 인풋을 받아 bounding box를 해줍니다.
  2. conv feature map을 만들어줍니다.
  3. 각 영역에 대해 ROI pooling을 통해 fixed length feature map을 뽑아냅니다. (SPPNet과 유사)
  4. NN을 통해 bounding box에 대한 라벨을 찾아냅니다.

Faster R-CNN = Region Proposal Network + Fast R-CNN 입니다. bounding box를 뽑는 것도 네트워크로 학습하자고 해서 만든 것이 Region Proposal Network입니다. Region Proposal Network는 이미지에서 특정 영역이 bounding box로써의 의미가 있는 지를 확인하는 것입니다. 미리 정해놓은 bounding box 크기인 anchor box로 구하게 됩니다.

  • YOLO
    YOLOv1는 Region Proposal Network가 없어 빠른 속도를 낼 수 있기 때문에 faster R-CNN보다 훨씬 빠른 속도를 가지고 있습니다.

이미지가 들어오면 SxS 그리드로 나누어 줍니다. 해당 이미지 안에 찾고 싶은 물체의 중앙이 그리드 안에 들어가면 해당 그리드 셀이 해당 물체에 대한 바운딩 박스와 해당 물체가 무엇인지를 같이 찾아줍니다. 각 셀은 B개의 바운딩 박스를 예측하고 쓸모 있는지 찾아주면서 해당 그리드가 어떤 클래스인지를 예측하는 것을 동시에 진행합니다. 원래는 바운딩 박스를 찾고 그 안의 물체의 클래스를 찾았다면 여기서는 두 개의 정보를 취합해서 결과를 냅니다.


2. 과제 수행 과정 / 결과물 정리

  • CNN 과제 MNIST data를 활용한 실습, generalization이 잘된 모습을 보임

3. 피어세션 정리

https://hackmd.io/vCEJruXxRTmNqkJv5q25aw?view


4. 학습 회고

금일 특강으로 진행된 git 강의가 git을 제대로 배우지 않고 사용해오던 저에게 큰 도움이 되었습니다. 또한 CNN강의를 통해 평소 관심없던 CNN의 대략적인 개념을 잡고 갈 수 있었습니다.