ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 머신러닝: Training Neural Networks 공부하기1(Activation function, Data preprocessing, Weight Initialization, Batch Normalization, Transfer Learning)
    머신러닝 2020. 10. 20. 21:12

    이번 포스팅은 Neural Network의 Training을 위해 필요한 개념에 대해 알아본다.

     

    다음과 같은 순서로 알아보겠다. 

     

    - Activation Functions

    - Data preprocessing

    - Weight Initialization

    - Batch Normalization

    - Transfer learning

     

     

    1. Activation Functions 

     

    1) sigmoid

     

    0부터 1까지의 값을 갖으며 뉴런에서 firing하는 형태를 따서 만들었다

     

     

    한계

     

    - zero-centered가 아니다. 

    - exp이기 때문에 계산이 복잡

    - satureted 된 부분은 gradient가 나오지 않는다.

     

    예를 들어 x = -10이거나 10일 때 기울기 값이 0이므로 backpropagation을 통해 

    gradient를 구할 때 gradient는 0이다.

     

     

     

     

    2) tanh(x)

     

     

    - -1부터 1사이의 값을 갖는다. 

    - zero centered

     

     

    한계

     

    - satureted 된 부분은 gradient가 나오지 않는다. 

     

     

     

     

    3) ReLU(Rectified Linear Unit)

     

    - 가장 많이 사용되는 activation function

    - 0보다 큰 rigion에서는 saturate되지 않는다.

    - 계산이 간단하다.

     

     

    한계

     

    - zero-centered는 아니다. 

    - x가 0보다 작을 때 saturate된다. 

     

     

     

     

    4) Leaky ReLu

     

    - saturate되지 않는다.

    - 계산적으로 효율적이다.

    - will not die!

     

    예를 들어 x = -10일때 기울기는 0.01, 

    x = 10일 때 기울기는 1이므로 x가 어떤 값이든 gradient를 구할 수 있다. 

     

     

     

     

    5) ELU(Exponentioal Linear Unit)

     

    - zero mean output

    - leaky ReLu보다 negative region 면에서 더 noise가 적다 

     

     

    한계

     

    x<0일때 exponetential하기 때문에 computation이 많이 필요하다 

     

     

     

     

    6) SELU(Scaled Exponential Linear Units)

     

     

     

    - scaled 버전의 ELU로 deep network에 더 적합하다.

    - self-normalizing가 가능

     

     

     

     

    7) Maxout "Neuron"

     

    ReLU와 Leaky ReLU를 일반화한 것

     

     

    saturate 되지 않는 장점이 있지만, 파라미터 개수가 두배가 되므로

    계산이 복잡해진다. 

     

     

     

     

    8) Swish

     

    베타를 조정함에 따라 각도가 변경된다. 

     

     

     

     

     

     

    < Data Preprocessing >

     

    - zero center로 맞춘후, 

    - normalized 시킨다. 

     

    ★ normalization을 통해 image는 0-1의 value값을 갖고

    -1 ~ +1의 coordinate값을 갖게 한다. 

     

     

     

     

     

     

    PCA와 Whitening를 통해 Data Preprocessing을 할 수도 있다.

     

    PCA(Principal component Analysis): 2차원에서 해결할 문제를 1차원에서 해결할 수 있게 한다.

     

    whitening: 지금 갖고 있는 샘플이 대표할 수 없는 샘플일 수도 있다. 

     

     

     

     

     

     

     

    <Weight Initialization>

     

     

    최초의 W값은 어떻게 정할까?

     

    1) 작은 랜덤수를 이용해서 정하기

     

     

    작은 network에서는 괜찮지만, deeper network(layer가 많아진다면)에서는 문제가 생길 수 있다. 

     

    layer가 많아지면서 zero를 향해가고 트레이닝이 어려워진다.

     

     

     

     

     

    2) Xavier Initialization

     

    정해진 constant 말고 가변된 숫자를 이용하면 layer가 많아져도 

    문제가 생기지 않는다. 

     

    activation function이 tanh인 경우

     

    하지만 Xavier는 tanh을 사용했을 때 괜찮지만, ReLu 사용시 문제가 발생한다. 

     

     

    activation function으로 Relu를 이용한 경우

    그래서 다음 방법을 이용한다. 

     

     

     

     

     3) Kaiming/ MSRA Initialization을 이용

     

    np.sqrt(Din)를 나누는 대신 np.sqrt(2 / Din)을 곱한다. 

     

     

    activation function으로 Relu를 이용한 경우 

    Xavier를 이용해서 W를 초기화 했을 때는 Relu함수에 대해 트레이닝 불가능 했지만 

    Kaiming/ MSRA 초기화를 이용했을 때 가능함을 알 수 있다. 

     

     

     

     

     

    <Batch Normalization>

     

    위에서 데이터가 들어왔을 때 preprocessing해서 normalization 시켰다. 

     

    한 레이어를 통과하고 normalization 시킨후 다른 레이어를 통과하면

    전에 통과한 기록들이 사라지므로 이를 위해 기존의 것과 다른 normalization을 한다. 

     

    mini batch를 normaliziation 시킨다. 

     

    원래는 데이터 전체 채널에 대해서 normalization 시켰더라면

    batch normalization은 채널단위로 나누어서 각각의 채널에 대해 normalization한다. 

     

     

      

     

     

     

     

     

    <Transfer Learning>

     

     

    CNN을 이용하여 training하려면 많은 양의 데이터가 필요하다?

    -> 결론은 그렇지 않다. 

     

    적은 양의 데이터를 이용해서도 충분히 트레이닝할 수 있다.

     

    Imagenet에서 사용된 parameter를 사용하여 나의 application(데이터양이 적은)에

    적용하고 싶을 때 Transfer learning을 사용한다. 

     

    파라미터를 그대로 가져와서 클래스 몇개에 대해서만 트레이닝시킨다. 

     

     

    노란색 = feature를 추출하는 부분, 초록색 = classification하는 부분 

     

     

    1) Small dataset을 가지고 있는 경우

     

    클래스 C개에 대해서 새롭게 트레이닝 시키고 싶은 경우

    그 전까지의 과정을 이미 트레이닝 되어있는 것들(노란색)에서 가져온다. 

     

     

    2) Bigger dataset을 가지고 있는 경우

     

    만약 내가 더 많은 데이터셋이 있다면 가지고 있는 부분(초록색)까지 더 트레이닝 시켜준다.  

     

     

     

     

    결론적으로 비슷한 데이터셋을 가지고 있을 때는 몇개의 레이어만 통과시키면 되지만

     

    데이터셋이 아주 다른경우, 더 많은 레이어를 추가적으로 통과시켜서 training시켜야 한다. 

    (만들어 놓은 feature가 쓸모없어질 수 있기 때문에)

     

    그래서 transfer learning을 하기전에 나의 데이터가 얼마나 유사한지,

     

    어떤 목적인지 알아야 하며 유사한 모델을 찾아야 한다. 

    (잘 맞는 transfer learning을 사용해야 한다. 잘 맞지 않으면 training이 되기는 하지만 느리다)

     

     

     

    출처입니다!

     

     

     

    반응형

    댓글

Designed by Tistory.