머신러닝/Vision

Convolutional Neural Networks ? [2]

망나 2018. 9. 6. 10:04

해당 글은 Adit Deshpande의 블로그에 게제되어 있는 "A Beginner's Guide To Understanding Convolutional Neural Networks Part 2"를 개인 공부 목적으로 한글로 재작성한 것 입니다. 원문을 읽으시는게 문맥상이나 모든면에서 훨씬 이해가 쉬울 수 있습니다.



Introduction


이번 포스트에서는 이전에 대략적으로 개념만 이해한 ConvNets에 대해서 조금 더 자세히 알아보겠습니다. 모든 개념이 깊게 들어갈수록 복잡하기 때문에 모든 내용을 이번 포스트에 담지는 못 합니다. 따라서, 다양한 참고 자료의 링크들을 추가로 작성할테니 참고하시면서 읽으시면 도움이 될 것 같습니다.





Stride and Padding


자, 이전 포스트에서 알아봤던 filters, receptive fields 그리고 convolving 개념 기억하시죠? 그렇다면, ConvNets의 각 층을 우리가 원하는 모습으로 수정하기 위해서 우리가 바꿀 수 있는 핵심 파라메터 2가지가 있습니다. 제일 먼저 filter size를 정하고 나면, 우리는 stridepadding이라는 변수를 결정해야합니다.


Stride는 filter가 어떻게 convolves 할지를 정하는 변수입니다. 쉽게 말하면, 이전 포스트의 예제에서 filter는 한번에 1칸씩 이동하였습니다. 여기서 얼만큼씩 이동할지를 정하는 변수가 stride입니다. 따라서 이전 포스트의 예제에서 stride는 1이겠죠? 1칸씩 이동했으니까요. 쉽게 이해하기 위해서 아래 예제를 한번 보겠습니다. 7x7 volume 입력, 3x3 filter 그리고 stride는 1인 예제입니다.


7x7 input volume, 3x3 filter and stride 1


위 예제에서 보이듯이 7x7 입력 volume에 3x3 filter를 stride 1 조건으로 적용하게 되면, 예제의 오른쪽에서 보이는 것과 같이 5x5 volume 출력값을 얻게 됩니다. 그렇다면, 만약 stride 값을 2로 적용시키면 어떻게 될까요?


7x7 input volume, 3x3 filter and stride 2


위 예제 그림에서 보이는 것과 같이 filter가 2칸씩 이동을 하게 되고, 결과적으로 3x3 volumedm로 줄어든 출력값을 얻게 됩니다. 만약 stride 값을 3으로 증가시키면 어떻게 될까요?? 3칸씩 이동하는 모습을 상상해보세요. 한번 이동이 일어난 뒤에는 더 이상 3칸을 이동할 공간이 부족하게 되고 즉, 입력 크기와 receptive field의 크기가 맞지 않게 되는 문제가 발생합니다.


이제 padding에 대해서 알아보겠습니다. 먼저, 하나의 시나리오를 생각해 보겠습니다. 32x32x3 volume의 입력에 5x5x3의 filter를 적용하면? 우리는 28x28x3 volume의 출력값을 얻게 됩니다. 공간 차원이 줄어든 것을 확인할 수 있습니다. 그렇다면 이렇식으로 계속해서 conv layer들을 거치게 되면 volume의 크기는 지속적으로 줄어들 것 입니다. 하지만 우리는 원활한 학습을 위해서 네트워크의 앞쪽 conv 층에서 원본 입력 volume을 최대한 보존해서 low level feature 정보들을 뽑아내야 합니다. 그렇다면 어떻게 같은 conv 층을 거치더라도 32x32x3 volume의 출력값을 얻을 수 있을까요? 여기서 padding이라는 개념을 사용하는데, 크기 2의 zero padding을 각 층에 적용한다고 해봅시다. 이 말은 즉, 입력 volume 주변으로 0값의 테두리를 2번 두른다는 말입니다. 입력 volume은 36x36x3의 모습을 갖게 되겠죠? 설명이 많이 부족하지만, 아래 예제 그림을 보시면 더 쉽게 이해하실 것 같습니다.



만약 stride가 1이라면,


위의 zero padding을 적용시킬때, 입력과 출력의 volume은 항상 같은 공간 차원을 갖게 됩니다. 이때, K값은 filter 크기입니다. 

주어진 conv layer의 출력 크기는 다음의 수식으로 계산할 수 있습니다.



수식에서 O는 출력의 height/length이고, W는 입력의 height/length, K는 filter 크기, P는 padding 그리고 S는 stride입니다.




ReLU (Rectified Linear Units) Layers

각 conv layer를 모두 거치고 나면, nonlinear layer(또는 activation layer)를 거치게 됩니다. 이 layer의 목적은 conv layer에서 선형 연산이 수행된 모델에 비선형성을 부여하는 것 입니다. 비선형 함수로는 대표적으로 tanh, sigmoid 그리고 ReLU가 있고 이외에도 다양한 비선형 함수가 존재합니다. 특정 비선형 함수가 뛰어나다라고 단정지을 수 없습니다. 하지만 최근 ReLU가 많이 사용되는데 그 이유로는 대표적으로 vanishing gradient problem을 해결 할 수 있다는 점 때문입니다(vanishing gradient problem에 대해선 여기여기를 참고해 주세요). 이 ReLU layer는 모든 입력값에 대해서 f(x) = max(0, x) 함수를 적용시킵니다. 



(출처 : 김성훈 교수님의 모두를 위한 딥러닝)


위 그림을 보면 sigmoid와 ReLU의 차이점을 확실히 볼 수 있습니다. sigmoid는 값을 0~1사이 값으로 수렴시키지만, ReLU는 모든 음수값을 0으로 그리고 양수값을 그대로 가져갑니다. 그래서! 직관적으로 vanishing gradient problem을 생각해볼때, sigmoid를 사용하면 층이 깊어질수록 gradient값이 작아지다가 결국 소멸하기 때문에 후반부 층에서 학습이 잘 이루어지지 않지만, ReLU의 경우는 gradient값을 최대한 끝까지 가져갈 수 있기 때문에 깊은 층의 학습에 더 유용할 수 있다~라고 생각할 수 있습니다. Geoffrey Hinton님의 논문도 한번 참고하세요.




Pooling Layers


ReLU를 거치고 나면, 다음 단계로 pooling layer를 거치게 됩니다. pooling layer는 downsampling layer라고도 부릅니다. 다양한 종류(옵션?)의 layer가 존재하지만 가장 많이 사용되는 maxpooling에 대해서 소개하겠습니다. 기본적으로 conv와 동일하게 filter와 stride 개념이 있는데 보통 2x2 크기의 filter를 사용하고 stride는 filter와 같은 길이(여기선 2)를 사용합니다. 아래 예제 그림에서 볼 수 있듯이, input volume에 적용되어서 filter안의 값 중 가장 큰 값을 출력값으로 얻습니다.



maxpooling 이외에는 average pooling과 L2-norm pooling이 있습니다. 이 pooling layer을 적용하는 이유를 직관적으로 생각해보면, 원본 입력에서 특정 특징(high activation value)을 뽑아낸다면, 그 정확한 위치는 다른 특징과의 상대적 위치만큼 중요하지 않습니다. 그러니까 쉽게 말했을때, 위의 예제 그림에서 주황색 필터안의 특징(high activation value) 6이 주황색 필터 안에서 (2,2) 위치라는 것을 딱히 중요하지 않고, 주황색 필터내의 대표되는 특징은 6이고, 초록색 필터 좌측에 그리고 파랑색 필터 위에 존재한다는 상대적인 위치만 있어도 충분하다는 것 입니다(설명이 너무 지저분해서 죄송하...). 그리고, pooling을 적용하고 나면, input volume의 공간 차원을 상당히 축소시킬 수 있습니다. 이로 인해서 또 pooling을 적용시켜야 하는 목적 2가지를 생각할 수 있습니다. 첫번째로, parameter들과 weight들의 수를 엄청나게 줄여주면서 계산 비용을 줄여줍니다. 두번째로는 overfitting을 어느정도 방지할 수 있다는 것 입니다. 여기서 말하는 overfitting이란, 말 그대로 모델이 train 데이터에 너무 특화되어서 test나 validation 데이터에 대해서는 잘 동작하지 못하는 것을 말 합니다. (training set에는 99~100% 정확도를 보이는데 test or validation set에 대해서는 50%의 정확도를 보이는 경우)




Dropout Layers


이제, dropout layers에 대해서 알아보겠습니다. Dropout은 위에서 설명드린 overfitting 문제를 해결하기 위한 방법인데요, 굉장히 간단한 아이디어 입니다. 말 그대로 layer를 거치면 무작위로 activation들을 0으로 설정해서 "drops out" 합니다. 간단하고 쓸모없어 보이는 dropout을 사용함으로써 얻을 수 있는 이점은, 모델(네트워크)가 특정 activation들이 drop되더라도 정확한 분류 또는 출력값을 제공할 수 있도록 만듭니다. 이로 인해서 모델(네트워크)가 training 데이터에 너무 "fitted" 되는 것을 방지할 수 있습니다. 즉 overfitting 문제를 방지할 수 있습니다. dropout layer는 오직 학습과정에서만 사용되며 모델을 테스트하거나 평가할 때는 사용하지 않습니다.


(출처 : srivastava, Nitish, et al. "Dropout: a simple way to prevent neural networks from overfitting")





Classificatoin, Localization, Detection, Segmentation


Image classification의 전체 프로세스는 특정 이미지를 입력으로 주면, 입력 이미지에 해당하는 class label를 출력으로 받는다. 하지만 Classification 이외에도 다양한 task들이 존재한다. Object localization은 해당 class lable뿐 아니라 이미지 안에 object가 어디에 존재하는지 알 수 있게 bounding box까지 제공한다. 


또한 Object detection은 이미지 안에 모든 object에 대해서 object localization을 한다. 따라서 여러개의 bounding box와 class label를 얻는다. 마지막으로, object segmentation의 출력값은 object detection과 다르게 이미지 안에 모든 object의 outline와 class label이 된다.


각 기술에 대해서 좀 더 자세히 공부하고 싶으신 분들을 위해 정말 좋은 자료의 링크 소개해 드릴께요, 다 같이 갑시당 (저도 아직 설명할 수 있는 수준으로 공부하지 않아서... 같이 공부해여ㅎㅎ).



R-CNN, Fast R-CNN, Faster R-CNN, You Only Look Once(YOLO), Deep Residual Network, SSD (논문 링크)


Deep Learning for Object Detection: A Comprehensive 


Splash of Color: Instance Segmentation with Mask R-CNN and TensorFlow


awesome-deep-vision


'머신러닝 > Vision' 카테고리의 다른 글

ResNet 이해하기  (0) 2019.06.04
Generative Adversarial Networks (GANs)  (0) 2019.02.27
Batch Normalization?  (0) 2018.10.23
Recurrent Neural Networks ?  (0) 2018.09.30
Convolutional Neural Networks ?  (0) 2018.09.05