티스토리 뷰

* 참고 번역 사이트(부족한 번역 실력이니 주의 부탁드립니다.)

https://adeshpande3.github.io/adeshpande3.github.io/A-Beginner's-Guide-To-Understanding-Convolutional-Neural-Networks-Part-2/

 

* 초보자에게 콘볼루션 뉴럴 네트워크 소개하기(2)



소개

 

  이번 포스트에서는 ConvNet에 대해 구체적으로 더 많이 알아볼 것이다. Disclaimer: 지금, 이러한 주제들 몇몇이 다소 복잡하고 스스로 만들어질 수 있다는 걸 알았다. 정확하지만 포괄적임을 유지하려는 노력으로 필자는 이번 주제(ConvNet)를 자세히 설명하는 연구 논문을 알아볼 것이다.

 


Stride and Padding

 

  우리의 좋고 오래된 conv layer에 대해 되돌아보자. 필터, 수용적 분야, convolving을 기억하는가? 좋다. 이제 각 층의 행동을 바꿀 수 있는 2개의 주요 파라미터가 있다. 필터 크기를 선택한 이후, 우리는 stride(걸음?)padding(채우기)을 선택해야 한다.

 

  Stride는 필터가 어떻게 입력이미지 주변을 convolve하는 지를 조절한다. part 1에서 봤던 예시에서 필터는 입력이미지 주변을 한 번에 한 단위씩 변화하면서 convolve한다. 필터가 변화하는 양이 stride이다. 이번 사례에서 stride는 암암리에 1로 설정되었다. Stride는 보통 한 가지 방식으로 설정되는데, 그래야 산출물 양이 정수이고 분수(fraction)가 아니게 된다. 예시를 보자. 입력이미지가 7x7, 필터가 3x3(3차원은 단순함을 위해 무시하자) 그리고 stride1로 보자. 이것이 우리에게 익숙한 사례이다.


  변함없고 늘 똑같지 않은가? stride2로 늘려서 산출물 양에 어떻게 발생하는지 추축할 수 있다.


  그래서 보시다시피, 수용적 분야(the receptive field)2단위씩 변화하고 있고 산출물 양이 줄어들고 있다. 만약 stride3으로 늘리려 하면, 우리는 수용적 분야를 입력이미지에 간격을 두고 확실히 맞추는 데 문제가 있다. 보통, 프로그래머들은 수용적 분야가 덜 겹치고 더 작은 공간 차원을 원한다면 stride를 증가시킬 것이다.

 

  지금, padding(채우기)을 살펴보자. 그걸 알기 전에, 시나리오를 생각해보자. 당신이 5 x 5 x 3 필터를 32 x 32 x 3 입력이미지에 적용시킬 때 무슨 일이 일어날까? 산출물 양은 28 x 28 x 3일 것이다. 공간 차원이 감소하는 것도 눈여겨봐라. conv 층에 계속 적용시키면서, 양의 크기는 우리가 바라는 것보다 더 빠르게 감소할 것이다. 네트워크 초기 층에서 우리는 기존의 입력이미지에 대해 더 많은 정보를 보존하고 싶다. 그래야 낮은 수준의 속성을 추출할 수 있다. 같은 conv 층을 적용하길 원하지만, 산출물 양이 32 x 32 x 3을 유지하고 싶다면, 크기 20 채우기(zero padding)을 그 층에 적용할 수 있다. 0 채우기(zero padding)는 경계 주변에 0으로 입력이미지에 댄다. 만약 2개의 0 채우기에 대해 생각한다면, 이는 36 x 36 x 3 입력이미지을 야기할 것이다.



  만약 1stride를 가지고 다음 같은 0 채우기(zero padding)의 크기를 설정한다면,

  K는 필터 크기라 했을 때, 그러면 투입물, 산출물 양이 항상 같은 공간 차원을 가질 것이다. 주어진 conv 층에 대한 산출물 양을 계산하는 식은 다음과 같다.

  O는 산출물의 높이/길이고, W는 투입물의 높이/길이, K는 필터 크기, Ppadding 그리고 Sstride이다.


 

Hyperparameter 선택하기

 

  얼마나 많은 층을 사용할지, 얼마나 많은 conv 층을 사용할지, 필터 크기가 얼마일지, 또는 stride, padding(채우기)에 대한 값이 어떨지 어떻게 알까? 이는 사소한 문제가 아니고 모든 연구자들이 사용하는 기준치가 없다. 왜냐하면 네트워크가 당신이 가진 데이터 형식에 따라 크게 다를 것이기 때문이다. 데이터는 크기(size), 이미지의 복잡성, 이미지 처리 형식 그리고 그보다 많은 것에 따라 다양할 수 있다. 당신의 데이터 셋을 볼 때 hyperparameter를 어떻게 정하는 지에 대해 생각하는 한 가지 방법은 적절한 규모로 이미지의 관념(추상적 개념)을 생성하는 적절한 조합을 찾는 것이다.

 


ReLU(Rectified Linear Units) Layers

 

  각 conv 층 이후에 비선형 층(또는 활성화(activation) )을 즉시 그 후에 적용하는 관례가 있다. 이번 층의 목적은 비선형성을 시스템에 도입하는 것이다. 기본적으로 시스템은 conv (단지 요소 방식(element wise) 곱셈과 요약) 동안에 선형 작업을 계산하는 시스템이다. 과거에는 tanh와 시그모이드(sigmoid)같은 비선형 함수가 사용되었지만, 연구자들은 네트워크가 (계산 효율성 덕분에) 정확도와 상당한 차이 없이 더 빨리 훈련할 수 때문에 ReLU 이 훨씬 더 좋다는 것을 알아냈다. 이는 vanishing gradient 문제를 완화시켜주는 데 도움을 준다. vanishing gradient 문제는 더 낮은 층의 네트워크가 훨씬 더 천천히 학습하는 문제를 말하는데, 이는 경사가 층을 통해 기하급수적으로 감소하기 때문이다(이와 관련된 설명은 이번 포스트 범위 밖이지만 여기(밑에 사이트 참고)에 좋은 설명이 나와 있다.) ReLU 층은 함수 f(x) = max(0, x)을 입력이미지에 모든 값에 적용한다. 기본적인 형태로 이번 층에서는 모든 활성화를 0으로 바꾼다. 그리고 이번 층은 conv 층의 수용적 분야에 영향을 미치는 모델과 전체 네트워크의 비선형적 속성을 증가시킨다.

https://en.wikipedia.org/wiki/Vanishing_gradient_problem

https://www.quora.com/What-is-the-vanishing-gradient-problem

* Geoffrey Hinton(딥러닝의 아버지로 불림)의 논문

http://www.cs.toronto.edu/~fritz/absps/reluICML.pdf



Pooling Layers

 

  몇몇 ReLU 층 이후에, 프로그래머들은 pooling layer를 선택해 적용한다. 이는 downsampling 층이라 불린다. 이번 카테고리에서는 가장 인기 있는 maxpooling와 함께 여러 층 옵션이 있다. 이번에는 기본적으로 (보통 2 x 2 크기의) 필터와 같은 길이의 stride를 가지고 한다. 그리고 나서 이걸 투입물에 적용시키고 필터가 주변을 convolve하는 모든 하위 지역에서 최대 숫자를 산출해낸다.


  * 2x2 필터와 2stride에서 Maxpool의 예시


  pooling layer의 다른 옵션은 평균 poolingL2-norm pooling이다. 이번 층 뒤에 직관적 판단은 특정 속성이 기존 입력이미지(높은 활성화 값이 있을 것이다)에 있다고 알고 있을 때, 다른 속성들에 대해 정확한 위치는 상대적 위치만큼 중요하지 않다. 당신이 상상하다시피, 이번 층은 입력이미지의 공간차원(길이 그리고 너비가 변화하지만 깊이는 아님)이 급속도로 감소한다. 여기서 2가지 주요 목적을 제공한다. 첫 번째로는 파라미터 혹은 가중치 양이 75% 가량 감소하는데, 그러면서 계산비용도 줄어든다. 두 번째는 과적합화(overfitting)를 규제할 것이다. 과적합화는 모델이 훈련 예시에 맞춰 너무 조정이 되어 검증 세트(validation set)와 시험 세트(test set)에 일반화시킬 수 없음을 말한다. 과적합화의 증상은 훈련 세트(training set)에는 100% 혹은 99%에 맞는 모델을 가진 반면 테스트 데이터에는 고작 50%의 결과를 얻는다.



Dropout Layers

 

  이제 dropout 층이 신경망에서 매우 특별한 기능을 가진다. 마지막 단락에서 우리는 훈련 이후에 망의 가중치가 훈련 예시에 매우 조정되어 새로운 예시가 주어졌을 때 망(network)이 수행되지 않는 과적합화의 문제를 다뤘다. dropout의 아이디어는 현실적으로 지나치게 단순화하였다. 이번 층은 그 층 안에 있는 무작위 세트의 활성화를 “drop out”시키는데, 이를 forward pass에서 0으로 그것들을 맞춤으로서 한다. 그처럼 간단하다. 이제 그렇게 단순하고 겉보기에 불필요하고 반()직관적인 프로세스의 이익이 무엇일까? 어떤 면에서는 네트워크를 불필요하도록 한다. 그만큼 심지어 몇몇 활성화가 drop out 된다면, 네트워크가 특정 예시에 대해 올바른 분류 혹은 산출을 제공해야 할 수 있음을 의미한다. 네트워크가 너무 훈련 데이터에 맞추지 못해서과적합 문제를 줄이는 데 도움이 된다. 중요한 건 이번 층이 훈련 동안에만 활용되고 테스트시간에서는 활용되지 않음을 알아두자.

* Geoffrey Hinton의 논문 : 

https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf



Network in Network Layers

 

  네트워크 층에서 네트워크는 conv layer를 의미한다. conv layer1 x 1 크기의 필터가 활용된다. 지금, 처음 봤을 때, 당신은 수용적 분야가 보통 수용적 분야가 그리는 공간보다 크기 때문에 왜 이런 형식의 층이 도움이 되는지 궁금할 것이다. 그러나 이러한 1x1 convolution들이 특정 깊이에 걸쳐 이어지고 그래서 1 x 1 x N convolution(N은 층에서 적용된 필터의 수)으로 생각할 수 있다. 효과적으로 이번 층은 N-D 요소 방식의 곱을 수행하는데 여기서 N은 층으로의 입력이미지 깊이를 말한다.

* Min Lin의 논문 : https://arxiv.org/pdf/1312.4400v3.pdf

 

Classification(분류), Localization(지역화), Detection(감지), Segmentation(분리)

 

  Part 1에서 사용된 예시에서, 우리는 이미지 분류(image classification)를 살펴보았다. 이는 투입물 이미지를 취해서 일련의 카테고리에서 계급(class) 숫자를 내놓는 프로세스다. 그러나 우리가 object localization 같은 일을 할 때, 우리의 할 일은 계급 라벨 뿐만 아니라 사진에 물체가 어디있는 지를 나타내는 bounding box를 제공하는 것이다.

     * 물체 분류는 사진이 개라는 걸 인식하는 업무이다.

     * 물체 분류는 계급 라벨 뿐만 아니라 물체가 위치한 위치를 보여주는 bounding box를 포함한다.


  우리는 또한 object detection의 일을 하는데 지역화를 이미지에서 모든 물체에 할 필요가 있다. 그러므로 단신은 여러 bounding box와 계급 라벨을 가질 것이다.

 

  마침내 우리는 object segmentation을 하게 되었는데, 이 업무는 투입물 이미지에서 계급 라벨과 모든 물체의 윤곽(outline)을 내놓는 것이다.

 * Object Detection은 여러 물체의 지역화를 포함한다(같은 계급을 가져서는 안된다).

 * Object Segmentation은 계급 라벨과 물체의 윤곽을 포함한다.


  어떻게 이런 게 실행되는 지는 Part 3에 자세하게 쓰여있으나, 기다릴 수 없는 사람들을 위해서 훨씬 많은 자료들이 다음과 같이 있다.


* Detection/Localization

: RCNN, Fast RCNN, Faster RCNN, MultiBox, Bayesian Optimization, Multi-region, RCNN Minus R, Image Windows(홈페이지를 통해 참고사이트 참고)

* Segmentation

: Semantic Seg, Unconstrained Video, Shape Guided, Object Regions, Shape Sharing(홈페이지를 통해 참고사이트 참고)


 

Transfer Learning

 

  현재 DL 커뮤니티에서 공통된 오해는 구글의(Google-esque) 데이터 양 없이는 효과적인 딥러닝 모델을 만들거라는 기대를 할 수 없다는 것이다. 데이터가 네트워크를 생성하는 필수적인 분야인 반면에, Transfer learning(전이 학습)에 대한 아이디어는 데이터 요구를 줄이는 데 도움을 주어왔다. Transfer learning(전이 학습)은 모델을 미리 훈련된 모델(누군가에 의해 대량의 데이터 세트에서 훈련된 네트워크의 가중치와 파라미터)미세 조정(fine-tuning)”된 모델을 당신이 소유한 데이터 세트에 취하는 프로세스이다. 이 같은 아이디어는 미리 훈련된 모델이 속성 추출기(feature extractor)로서 역할을 할 것이다. 당신은 네트워크의 마지막 층을 제거하고 그걸 당신 소유의 분류기(classifier)(당신의 문제 공간이 무엇이냐에 달렸다)로 대체할 것이다. 그리고 나서 당신은 모든 다른 층들의 가중치들을 동결하고 네트워크를 일반적으로 훈련시킨다. 층을 동결(freezing)한다는 것은 경사 하강(gradient descent), 최적화 동안 가중치가 변하지 않는 걸 의미한다.

 

  왜 이렇게 작동하는지 알아보자. 우리가 말하는 미리 훈련시킨 모델이 ImageNet(친숙하지 않은 사람들을 위해 ImageNet1,000개 이상의 계급을 가진 14,000,000개의 이미지를 포함한 데이터세트이다)에서 훈련되었다고 해보자. 네트워크의 더 낮은 층에 대해 생각할 때, 우리는 그것들이 edge(모서리)curve(곡선)같은 특성을 감지할 것임을 안다. 만약 매우 독특한 공간과 데이터세트를 가지지 못한다면, 당신의 네트워크는 curveedge 또한 감지할 필요가 있을 것이다. 가중치의 무작위 초기화를 통한 전체 네트워크를 훈련시키는 것보다, 미리 훈련된 모델의 가중치를 활용하고, (그것들을 동결시키고) 그리고 훈련을 위해 더 중요한 층(더 높은)에 초점을 맞출 수 있다. 만약 데이터세트가 ImageNet과 같은 것과 꽤 다르다면, 더 많은 층을 훈련시키고, 여러 개의 낮은 층에만 동결시키고 싶을 것이다.

 * Yoshua(또 다른 딥러닝 개척자)의 논문 : https://arxiv.org/pdf/1411.1792v1.pdf

 * Ali Sharif Razavian의 논문 : http://arxiv.org/pdf/1403.6382.pdf

 * Jeff Donahue의 논문 : https://arxiv.org/pdf/1310.1531.pdf



데이터 증강 기술(Data Augmentation Techniques)

 

  이제까지 우리 모두 ConvNets에서 데이터의 중요성에 대해 몰랐을 것이다. 그래서 당신이 가지고 있는 데이터세트를 여러 개의 쉬운 변환과 함께 훨씬 더 크게 만들 수 있는 방법에 대해 얘기해보자. 전에 언급했던 것처럼, 컴퓨터가 이미지를 투입물로 취할 때, 픽셀 값 배열로 받아들일 것이다. 그러면 전체 이미지가 1 픽셀로 남겨진 채(left by) 변화된다고 하자. 당신과 필자에게는 이러한 변화를 감지할 수 없다. 그러나 컴퓨터에게는 이러한 변화가 이미지의 분류만큼이나 꽤 중요하다. 또한 이미지의 라벨은 변하지 않는 반면, 배열은 변한다. 배열 표현을 변화하는 반면 라벨은 기존의 것과 똑같이 유지하는 방식으로 훈련 데이터를 대체하려는 접근은 데이터 증강 기술(data augmentation techniques)로 알려져 있다. 그런 기술은 인위적으로 당신의 데이터세트를 확장시키는 방법이다. 사람들이 사용하는 인기 있는 증강(augmentation)grayscales, horizontal flips, vertical flips, random crops, color jitters, translations, rotations 그리고 훨씬 더 많이 존재한다. 이러한 여러 변화들을 훈련 데이터에 적용함으로써 훈련 예시의 숫자를 2배 혹은 3배로 쉽게 늘릴 수 있다.


댓글