개인적으로 읽고 쓰는 공부용 리뷰입니다.

틀린 점이 있을 수도 있으니 감안하고 읽어주세요. 피드백은 댓글로 부탁드립니다.

 

paper overview

 

cf) 딥러닝 특성상 기술의 발전이 매우 빠르기때문에 8년전에 나온 이 논문은 사실 굉장히 올드하다. 그러므로 디테일하게 살펴보기보다는 중요한 키포인트만 짚고 넘어가는 것이 좋다.

 

 

main contributions

이 논문에서 주장하는 contribution은 다음과 같이 볼 수 있다.

  • ReLU
  • LRN
  • multi-gpu
  • overlapping pooling
  • reduce overfitting
    • data augmentation
    • dropout

 

 

ReLU

alexnet에서는 activation function으로  relu를 사용한다. relu는 지금까지도 많이 사용되는 activation function으로 기존에 비해 어떠한 장점이 있는지 파악하는 것이 중요하다. 

 

일반적으로 사용되던 sigmoid나 tanh함수는 고질적으로 gradient vanishing의 문제가 있다. 두 함수다 비슷한 모양으로 양쪽 끝으로 기울기가 0에 수렴하는 (논문에서는 saturating 하다 라고 표현 함) 형태를 띄고 있기때문에, layer가 많이 누적 될수록 즉 모델의 뒷단으로 갈수록 기울기가 0으로 수렴해 backpropagation시 기울기가 충분히 전달이 되기 힘들다. 모델의 학습에 있어서 gradient vanishing은 학습의 가능 여부가 달려있기때문에 매우 중요하다.  

alexnet에서는 이를 해결하기위해 non-saturating한 ReLU를 활성화함수로 사용한다. 또한 relu의 사용은 보다 더 빠른 학습이 가능하다.

 

 

 

그렇다면 왜? relu를 사용했는데, gradient vanishing이 완화 될까? 일단 그래프 개형에서도 볼 수 있듯이 sigmoid나 tanh와 달리 relu는 수렴하지않는 개형을 띄고있다. 그러니까 x>0 일 때, 기울기가 0에 가까워지는 일은 있을 수 없다. 그렇기때문에 이 문제점을 완화 시킬 수 있고, 역전파시 충분한 기울기의 전달이 가능하기 때문에 당연히 동일 epoch대비 더 빠르게 수렴하는 것은 당연하다. 또한 relu는 미분 또한 매우 간단하다.

 

cf) 왜 0보다 작은 값은 무시할까?

맨 처음에 이 논문을 읽고 relu는 왜 양수만 고려할까? 라고 의문이 들었다. 아래 링크에서 굉장히 만족할만한 답변을 얻을 수 있었다. "무의미한 연결을 끊어(pruning의 개념) 모델의 sparse한 연결을 위하는것이 relu의 key point다." "negative value를 예측하는 것은 무의미하다." 등의 다양한 답변이 있는데 다 맞는말이다. 사실 근데 쉽게 생각하면 convolution filter는 어떠한 특징을 잘 찾아내도록 학습이 되어야한다. 그럼 filter가 특징점이 위치한 영역에서 convolution이 됐을 때, sobel이나 laplacian이 고주파영역에서 높은 값을 출력하듯이 당연히 high activation이 일어나도록 학습되어야 하는거 아닌가?  

https://stackoverflow.com/questions/60436685/why-does-almost-every-activation-function-saturate-at-negative-input-values-in-a

 

 

LRN 

local response normalization의 약어로 쉽게 생각하면 neuron의 output을 주변값과 평균 내는 것이다. 논문에서는 이 normalization이 generalization에 도움이 된다고 주장한다. 특정 노드의 출력이 주변에 비해 굉장히 크다면 학습시 이 노드에 편향될 수 도있는데, LRN은 이러한 효과를 억제 시킬 수 있다. 어차피 지금은 batch normalization, group normalization등 더나은 성능을 보여주는 normalization 기법들이 있기때문에 사용하지 않는다. 심지어 VGG논문에서는 LRN이 효과가 없었다고 적혀있다. 

 

 

Overlapping pooling

엄청 간단한 개념이다. pooling layer에서 stride보다 더 큰 필터를 사용하여, receptive field가 겹치게끔 하겠다는건데, 논문에서는 이 overlapping pooling의 효과로 다음과 같이 주장하고 있다. "We generally observe during training that models with overlapping pooling find it slightly more difficult to overfit." 사실 실험적인 결과라 나는 잘 모르겠다. 

 

 

Multi-gpu

지금이야 gpu들이 memory가 12기가는 우스울 정도로 고성능이지만 이 논문에서는 GTX 580(3GB)을 사용했다. ㄷㄷ 심지어 alexnet은 고용량의 모델이다. 당연히 이 gpu로는 학습이 힘들었기때문에 두대의 gpu를 사용했다. channel을 기준으로 반반씩 나누어서 사용했는데, 예를들어, feturemap의 channel이 96이라면 앞의 48 채널은 0번 gpu 뒤의 48 채널은 1번 gpu에서 연산하는 식으로 했다. 사실 이것은 지금 우리가 사용하는 grouped convolution(with G=2)와 같은 방식이다. resnext 논문을 보면 좀더 자세히 설명되어있다. 

 

 

Reduce overfitting

오버피팅을 방지하는 방법으로는 regularization, data augmentation 등등 다양한 방법이 있지만 이 논문에서는 특히 엄청난 data augmentationdrop-out을 적용했다. data-augmentation은 resizing, cropping 등을 이용하여 데이터셋을 늘리는 방법이다. 데이터의 양을 늘리는 것은 모델의 학습이 더 잘되는 것과 직결되기때문에 근본적인 해결 방법이고 제일 효과적이다.

drop out은 학습 시 노드간의 연결을 확률 p에 근거하여 연산에 포함시키지 않는다.  당연히 매 학습마다 다양한 연결이 생성이 될것이고 이는 앙상블 효과를 낳기때문에 오버피팅방지에 도움이 된다. 그리고 inference시에는 학습 때사용한 p의 보상효과로 dropout이 적용된 레이어의 모든 연결에 p를 곱한다. 아래의 설명이 매우 명확하다.! 

 

Dropout is a regularization method that approximates training a large number of neural networks with different architectures in parallel. During training, some number of layer outputs are randomly ignored or “dropped out.” This has the effect of making the layer look-like and be treated-like a layer with a different number of nodes and connectivity to the prior layer. In effect, each update to a layer during training is performed with a different “view” of the configured layer.

 


cf) 과연 dropout은 진짜 regularization에 도움이 될까?

왜 이생각이 들었냐면, 실제로 모델을 설계하고 학습을 하다보면  gpu메모리를 상당히 많이 잡아먹고 학습에 큰 영향이 없는 것 처럼 보인다. 그래서 찾아봤다. 


>>> First, dropout is generally less effective at regularizing convolutional layers.
The reason? Since convolutional layers have few parameters, they need less regularization to begin with. Furthermore, because of the spatial relationships encoded in feature maps, activations can become highly correlated. This renders dropout ineffective.

>>> Second, what dropout is good at regularizing is becoming outdated.
Large models like VGG16 included fully connected layers at the end of the network. For models like this, overfitting was combatted by including dropout between fully connected layers. Unfortunately, recent architectures move away from this fully-connected block. By replacing dense layers with global average pooling, modern convnets have reduced model size while improving performance. I will write another post in the future detailing how to implement global average pooling in a convolutional network. Until then, I recommend reading the ResNet paper to get an idea of GAPs benefits.

ref)www.kdnuggets.com/2018/09/dropout-convolutional-networks.html

 

 

 

+ Recent posts