해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
오태현 교수님 - Image classification 2
1) Problems with deeper layers
지난 시간에는 Alexnet과 VGGNet에 대해 알아봤습니다. Alexnet에서는 처음으로 dropout과 ReLU가 적용되었고, VGGNet에서는 비교적 깊게 층을 쌓아서 학습을 시켜서 좋은 결과를 얻어냈습니다. 그렇다면 neural network는 깊고 넓게 쌓으면 어떻게 좋은 결과를 얻어낼 수 있을까요? 그렇지는 않았습니다. 더 깊고, 넓게 쌓아도 잘 안되는 경우가 많았는데, 그랬던 이유는 Gradient vanishing/exploding, 계산 복잡도, Degradation problem 등이 있습니다. 여기서 Degradation problem은 모델이 깊어짐에 따라 accuracy가 포화되어 degrade가 빨라지는 현상(training error가 증가하는 현상)을 말합니다.
2) CNN architectures for image classification
오늘은 GoogLeNet, ResNet, DenseNet, SENet, EfficientNet에 대해 알아보겠습니다.
가장 먼저 GoogLeNet의 가장 큰 특징으로는 Inception module을 사용했다는 점입니다. 다양한 convolution filter들을 사용해서 여러 측면에서 데이터를 관찰하는 방법으로, 3개의 convolution과 1개의 max pooling으로 구성했습니다. 이렇게 나온 결과값들을 concat하는 방식을 사용했습니다. 하지만, inception module을 사용하게 되면, 계산 복잡도는 증가하고, 용량이 증가하는 현상을 볼 수 있었습니다. 그래서 이 문제를 해결하기 위해서 1*1 convolution layer를 추가하는 것으로 채널을 줄여주는 효과를 얻었습니다. 병렬적으로 구성하면서 gradient vanishing현상을 막기 위해 중간에 gradient를 잘 흘러가게 해주는 Auxiliary classifiers를 추가로 넣었습니다. 이 부분은 training에서만 사용하고 test할 때에는 제거해줘야 합니다.
다음은 ResNet으로 처음 사람을 뛰어넘었던 모델로 알려져 있습니다. 무엇보다 이전의 네트워크들에 비해 엄청 깊은 네트워크를 구성해도 gradient vanishing 현상을 막을 수 있다는 것을 보여준 모델입니다. 이전에도 이야기 했듯이 Layer가 깊어져도 어느 순간 더 이상 학습이 되지 않는 degradation problem을 해결했습니다. 기존의 모델들과 다르게 skip connection을 추가해서 이 문제를 해결했습니다. gradient가 내려올 때에도 identity map 쪽으로도 내려올 수 있도록 구성되었습니다. residual connection은 굉장히 복잡한 mapping을 학습할 수 있다는 면에서 좋은 결과를 얻을 수 있었습니다. ResNet은 일반적인 initialization이 아닌 He initialization을 사용했는 데, 그 이유는 skip connection의 더하기가 일반적인 initialization을 했을 때에는 엄청 큰 값으로 반영될 수 있기 때문입니다. 크게 여러개의 블락에 동일한 conv을 사용했고, 블락과 블락 사이에는 공간해상도는 절반으로 줄이고, 채널 수는 2배로 증가하는 방식으로 학습이 진행됩니다.
DenseNet은 모든 레이어들을 concatenation을 통해서 모든 레이어의 정보를 재활용한다는 장점이 있습니다. 하지만, 그만큼 모델의 규모는 커지게 됩니다.
SENet은 채널 간의 관계를 모델링하고 중요도를 파악해서 중요한 요소를 attention하는 방법으로 구성되었습니다. 이 방법에는 Squeeze와 Excitation이 사용되었는 데, Squeeze는 공간정보를 없애서 채널별로 1개의 값을 얻어냅니다. 이렇게 얻어낸 정보들을 통해 다른 채널과의 관계를 파악하는 Excitation을 지나는 방식을 사용합니다.
EfficientNet은 앞에서 GoogLeNet의 장점인 width scaling과 Resnet의 장점인 depth scaling, input 해상도를 크게 넣어주는 것을 모두 사용한 모델입니다. 굉장히 효과적인 모델로 현재에도 유용하게 사용되고 있습니다.
Deformable convolution은 사람이나 동물의 팔, 다리등의 형태가 움직임에 따라 형태가 바뀌는 것을 고려할 필요가 있어서 만들어진 방법입니다.
오태현 교수님 - Semantic segmentation
1) Semantic segmentation
Semantic Segmentation은 이미지의 픽셀마다 어떤 라벨에 포함되는지를 분류하는 것입니다. 하지만, 이 방법은 instance를 고려하지 않습니다. 예를 들어, 사람이 어깨동무를 하고 있다면, 두 사람은 사람이라는 카테고리로 묶어주는 것처럼 각각의 instance를 고려하지 않습니다. 이 방법은 주로 Medical image, 자율주행, 사진 편집 등에 주로 활용됩니다.
2) Semantic segmentation architectures
Fully Convolutional Networks는 처음으로 semantic segmentation 문제를 end-to-end 구조로 풀어낸 모델입니다. 기존의 image classification의 경우에는 마지막에 fully connected layer를 통해서 공간정보를 버리는 layer가 필요하지만, Semantic segmentation은 공간 정보가 유지되어야 하기 때문에 1*1 짜리 kernel을 적용한 Fully convolutional layer를 사용합니다. 하지만 이렇게 했을 때에는 해상도가 좋은 화면을 보기는 어렵습니다. 그렇기 때문에 이를 키워주는 upsampling방법이 필요합니다. upsampling 방법에는 Transposed convolution과 upsample and convolution 두 가지가 대표적인 방법입니다.
Transposed convolution과 upsample and convolution에 대한 설명은 추후에 보강하도록 하겠습니다.
다시 Fully Convolutional Networks로 돌아와서 낮은 layer의 결과는 비교적 국소적인 부분과 디테일한 부분을 잘 나타내고, 학습이 많이 쌓인 layer의 결과는 넓은 범위를 파악하는 데 도움을 줍니다. 그래서 중간 중간의 layer들의 값을 upsampling해서 얻어낸 값이 더 좋은 성능을 얻는다는 것을 알 수 있었습니다.
Semantic segmentation에서 가장 큰 breakthrough를 이뤄낸 것은 U-Net입니다. U-Net은 U자 형태를 가지고 있으며, FCN의 skip connection도 포함된 방법입니다.
마지막으로 DeepLab은 후처리 툴인 Conditional Random Fields를 통해서 배경과 사물의 경계를 잘 찾도록 도와줍니다.
위의 그림처럼 DCNN을 거쳐서 나온 것은 생각보다 Semantic segmentation이 잘 되지 않았습니다. 이 경계 모호한 것을 CRF라는 후처리 툴을 활용해서 모호한 부분을 줄여나가는 방식입니다.
Atrous convolution이라고 해서 인접한 픽셀을 보는 것이 아니라 일정 rate 간격을 줘서 살펴보는 방식으로, 더 넓은 영역을 고려할 수 있고, 파라미터는 증가하지 않는 장점이 있습니다.
DeepLab에서는 Depthwise separable convolution이라는 방법을 통해서 계산 양을 줄이는 효과를 얻었습니다. 좌측의 그림은 Standard convolution이고, 우측의 그림은 2개로 쪼개서 계산한 Depthwise separable convolution입니다.