본문 바로가기

DEEP LEARNING/Fundamental Concept

Training Neural Networks

Activation Functions

Sigmoid

$f(x) = \frac{1}{1+e^{-x}}$

 

 

 

  • S 모형 곡선
  • 인간의 뉴런에서 firing 하는 거랑 비슷하다고 여겨짐 (과거, 현재는 relu)
  • 모든 입력을 0에서 1사이의(squashing) 양수로 출력 (학습속도에 영향(느리게 함))
  • exp계산이 많이 들어가서 속도 느려짐
  • saturation kill the gradients (가장 큰 문제)
    • 결과가 0 중심으로 분포하지 않음 (0~1)
      • w가 모두 양수거나 모두 음수가 됨
      • 우상향 방향으로만 움직여야 하므로 지그재그로 움직이고 따라서 학습이 느려짐
      • 배치단위기 때문에 큰 영향은 없음
    • exp() compute expensive (결정적인 문제는 아님)

 

Tanh

$f(x) = tanh x = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$

 

 

 

  • 넓은 의미에서 sigmoid 함수
  • 0에서 기울기 1
  • sigmoid와 달리 zero-centered 
  • 여전히 saturation 문제 존재

 

ReLU(Rectified Linear Unit)

$\text{Computes} f(x) = max(0,x)$

 

 

 

  • saturation 영역 없음
  • 실제 생물학적 뉴런이랑 비슷
  • computationally efficient
  • 학습도 빠름 (sigmoid, Tanh보다 6배 정도 빠르다고 알려짐)
  • 문제점
    • zero-centered가 아님
    • dead ReLU
      • 전부 0이 되어 입력이 안돼서 발생할 경우 학습이 안됨
      • 어떤 방법을 써도 본래 경로로 돌아오지 못함
      • 아주 심각한 문제 (neural net에서 일부는 충분히 발생 가능)
      • random값에 따라 걸릴 수 있음 -> bias 를 키움(실제로는 사용하지 않는 편)

 

Leaky ReLU, PReLU(Parametric-) (ReLu의 친구들)

$f(x) = max(0.01x,x)$

$f(x) = max(\alpha x,x)$

 

 

  • dead ReLU 문제 해결 (음수 부분 살림)
  • GAN 등에서 Leaky ReLU 많이 사용
  • PReLU: alpha라 놓고 로스를 줄이는 방향으로  알파를 학습 

 

ELU(Exponential Linear Units)

$f(x) = \matrix{x & \text{if} \quad x > 0 \cr \alpha (e^x -1) & \text{if} \quad x \leq 0}$

 

 

  • Leaky ReLU는 아웃라이어에 영향을 많이 받으므로 음수쪽을 saturation 시킴
  • 문제점: exp() 계산이 필요


Maxout

  • ReLU Leaky ReLU의 일반화 형태
  • $max(w_1^Tx+b_1, w_2^Tx+b_2) 에서 ReLU w_1=0, w_2=1
  • 파라미터를 더 추가할 수있으나 학습에 부담
  • 성능은 좋다고 알려져 있음
  • doubles the number of parameters/neuron

 

Other

  • Sofhplus 시그모이드를 적분
  • Swish: ELU같이 생김
  • 이것저것 많이 생기나 여전히 relu가 인기 많음

 

 

Data Preprocessing

Data Preprocessing 방법

  • zero-center로 맞추는 것
  • normalizing: variance 1로 만드는 것

Images

무엇에 대한 평균을 0으로 만들지가 문제 (100x100x3이미지가 있을 경우 이미지 한 장별, 전체, 채널별 중에 어떻게?)

  • training set 전체의 평균이 0이 되게 만드는 방법을 많이 씀
  • RGB 채널별로 평균을 0으로 만드는 방법이 가장 많이 사용 (VGG)
  • 보통은 255로 나누는 방법을 쓰는게 제일 쉽고 많이 쓰이는 방법
  • various normalizing  잘 안하는 편 (어차피 데이터의 range가 일정, 0~255사이 정수값 이미 스케일이 맞춰줘 있으므로 평균정도만 보정)
  • training 사용 평균을 저장해놓고 새로 test 적용할 한 장에 대해 다시 사용



Weight Initialization

random 값을 잘 주는 방법

  • 일단, random 값을 줘야함
    • 중요한 분야는 아니지만 고려대상
    • 같은 값을 주는 경우  모든 데이터가 동시 동일하게 업데이트되므로 비효율적이고 학습이 되지 않음
  • 보통 small random numbers 사용
    • 평균은 0이므로 표준편차의 영향을 받음
    • 너무 작거나 크면 안됨
  • 레이어에 달린 개수(몇 개의 입력에 대해 sum하는지)에 따라 다름
    • 평균은 0이므로 표준편차의 영향을 받음
    • 너무 작거나 크면 안됨
  • 실제로는 initialization이 그렇게 중요한 문제는 아님


Learning Rate

가장 중요한  parameter

  • Learning rate에 따라 최종 결과가 달라짐
  • Learning Rate Decay: 처음에는 크게 움직이다가 일정 조건이 되면 learning rate을 낮춰서 점점 작게 움직이는 방법
  • Cyclic Learning Rate: 주기적으로 변경해서 saddle point local minimum을 탈출할수 있도록 함
  • Linear Warmup:  초반 몇 에폭때 러닝레잇을 키움, 배치 크기를 N씩 늘리면서 초기 학습 속도 N으로 조정
  • 딥러닝에선 정답이 없고 해보는 수밖에 없음

 

Underfitting vs Overfitting

  • test error = training error + generalization gap
  • 보통 딥러닝 모델은 capacity가 크기 때문에 오버피팅에 취약
  • 풀려는 문제를 풀 수 있는 가장 작은 모델을 찾는 것이 best
  • 딥러닝의 철학은 네트워크를 일단 크게 만들고 generalization gap을 줄여보자는 것

 

Overfitting 방지 방법

  • Early stopping: 앞의 일을 알 수없으므로 중간에 저장하면서 감
  • Regularization Method: 전통적으로 머신러닝에서부터 많이 사용하던 방법
  • 로스를 평균내서 패널티를 추가(lambda 조정, L1, L2, elastic) : weight의 크기를 반영

     

    $\text{L2 regularization :} \quad R(W) = \sum_k \sum_l W_{k,l}^2 \text{(weight decay)}$

    $\text{L1 regularization :} \quad R(W) = \sum_k \sum_l |W_{k,l}|$

    $\text{Elastic net (L1 + L2) :} \quad R(W) = \sum_k \sum_l \beta W_{k,l}^2 + |W_{k,l}|$

    • L2 : 다같이 0을 향해 감 dense 형태 유지
    • L1 : 하나가 먼저 0이 되고 나머지들이 점차 0이 됨, sparse
    • weight의 크기가 커지는 것을 막아줌
  • Dropout
    • 딥러닝에서만 사용
    • 배치별로 weight를 날려버리고 나머지 네트워크로 학습
    • 속도가 늦어짐
  • Batch Normalization
    • batch 단위로 평균, 분산 계산해서 normalization
    • regularization 효과가 있음
    • test time
      • batch size가 동일하지 않을 수 있음
      • train에서 나온 평균/분산을 사용해서 강제 normalization
      • 최근 데이터일수록 가중치 높음
  • Data Augmentation
    • overfitting 발생원인은 데이터의 부족
    • 데이터의 양을 늘림으로써 해결 가능
    • test augmentation 사용

 

Optimization

Gradient Descent 

  • Gradient의 수치적인 방법을 통해 최적값을 구하는 알고리즘

$$\theta_t = \theta_{t-1} - \eta \dot \triangledown_\theta \jmath (\theta)$$

  • 문제점
    • Zero Gradient : local minima saddle point에 빠질 확률이 높다.
    • Poor Condition : 현재 위치 gradient의 값만 가지고, 판단하기 때문에 최적의 루트로 학습되지 못하는 경우 발생
    • Slow : 최적점에 다가 갈수록, gradient 0에 가까워짐
  • 두가지 방법으로 발전
    • 스텝방향을 어떻게 설정할 것인가?
    • 스텝사이즈를 어떻게 설정할 것인가?

 

Momentum

$$v_t = \gamma v_{t-1} + \eta \nabla_{\theta}J(\theta)$$

$$\theta = \theta - v_t$$

  • 이전에 이동했던 방향으로 영향을 받아 weight update
  • 현재 gradient와 이전에 momentum의 합 방향으로 이동
  • Gradient oscillation 현상 해결 가능 (자주 가는 방향에 관성)
  • Local minimum을 빠져 나갈 수 있음
  • 관성을 가지기 때문에 중앙에서 멈추는 것이 불가능
  • momentum값을 저장해야 되기 때문에, 메모리가 2배로 필요

 

NAG(Nesterov Accelerated Gradient)

$$v_t = \gamma v_{t-1}+ \eta\nabla_{\theta}J(\theta-\gamma v_{t-1})$$

$$\theta = \theta - v_t$$

Momentum 방향으로 이동 후, 해당 위치에서 gradient을 계산 후 이동

 

Adagrad (Adaptive Gradient) 

$$G_{t} = G_{t-1} + (\nabla_{\theta}J(\theta_t))^2$$

$$\theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \cdot \nabla_{\theta}J(\theta_t)$$

  • 서로 다른 weight마다 step size을 다르게 설정
  • 기존에 많이 update weight은 적게 update, 적게 update weight은 많이 update
  • G : 지금까지 g가 이동한 거리 (sum of square)로 학습
  • weight : G root에 반비례하여 설정
  • 시간이 날수록 G의 값이 커져서 학습이 되지 않음

 

RMSprop 

$$G = \gamma G + (1-\gamma)(\nabla_{\theta}J(\theta_t))^2$$

$$\theta = \theta - \frac{\eta}{\sqrt{G + \epsilon}} \cdot \nabla_{\theta}J(\theta_t)$$

G sum of square 대신에 Exponential Moving Average을 사용하여, G가 무한정으로 커지는 것을 방지 

 

Adam

$$m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla_\theta J(\theta)$$

$$v_t = \beta_2 v_{t-1} + (1-\beta_2)(\nabla_\theta J(\theta))^2$$

  • RMSProp + Momentum을 합친 알고리즘
  • m(momentum)인 모멘텀에 해당되는 부분
  • v(RMSProp) RMSProp에 해당되는 부분
  • 모든 알고리즘에서 잘 동작

'DEEP LEARNING > Fundamental Concept' 카테고리의 다른 글

Object Detection  (0) 2020.03.25
Modern CNN  (0) 2020.03.10
Convolutional Neural Network  (0) 2020.03.03
Linear Regression & Logistic Regression  (0) 2020.02.12
What is AI?  (0) 2020.02.02