본문 바로가기

데이터/딥러닝

CS231n_Lecture6:Training Neural Networks

Activation Functions : Sigmoid

 

 

  • 입력 값이 크면 sigmoid의 출력은 1에 가깝다.

 

  • 값이 작으면 0에 가까움

 

  • firing rate를 Saturation 시키는 것으로 해석할 수 있음.

 

  • 문제점1 : Saturation은 gradient를 없앤다. 

local sigmoid function의 gradient

  • X가 -10이면(음의 큰 값이면) gradient는 0
  • X가 0이면 잘 동작
  • X가 10이면(양의큰 값이면) gradient를 죽여 잘 동작하지 않음

 

 

  • 문제점2 : sigmoid의 출력이 zero centered하지 않다는 것

 

  •  입력이 항상 양수이면 가중치랑 곱해지고 활성함수를 통과
  • 항상 양수이거나 항상 음수이므로 항상 입력된 gradient와 같은 부호 → W는 모두 같은 방향으로만 움직일 것
  • 그러면 gradient 업데이트가 효율적이지 않다.

 

  • 문제점3 : exp()로 인해 계산 비용이 크다.

 

Activation Functions : tanh

 

  • zero-centered 문제는 해결되었으나, saturation 문제는 여전히 해결되지 않았다.

 

Activation Functions : ReLU

 

 

  • x가 양수이면 saturation되지 않는다.

 

  • 계산 효율이 좋다. (약 6배)

 

  • 문제점1 : ReLU는 더이상 zero-centered가 아니다.
  • 문제점2 : x가 음수이면 gradient가 0이되어 gradient의 절반을 죽여 dead ReLU 현상을 겪을 수 있다.

 

  • leaky ReLU : negative regime에서 더이상 0이 아니고 dead ReLU 현상이 없다.

 

  • PReLU : negative space에서 기울기가 있는데, 이때 기울기는 alpha라는 파라미터로 결정되어 활성함수가 더 유연하다고 할 수 있다. 

 

 

Data Preprocessing

 

  • 대표적인 전처리 과정 : zero-mean → normalize

 

  • 전처리를 하는 이유 : 모든 차원이 동일한 범위 안에 있게 해주어 모든 동든한 contribute

 

  • 이미지의 경우 스케일이 어느정도 맞춰져 있어 zero-centering만 해준다.

 

  • 평균값은 전체 학습 데이터로 계산하고 test데이터에도 동일하게 적용

 

  • RGB별로 각각 평균내는 경우도 있다. 

Weight Initialization

  • 모든 파라미터를 0으로 설정한다면 모든 뉴런이 똑같은 일을 해서 출력과 gradient가 서로 같을 것이다. 따라서 모든 뉴런이 같은 방식으로 업데이트 된다.

 

 

 

  • 초기화 문제를 해결하는 방법 1 : 임의의 작은 값으로 초기화하는 것
    • 초기 W를 표준정규분포에서 샘플링한다.
    • 출력값이 점점 0에 가까워지고 결론적으로 입력값이 0에 수렴

 

 

 

  • 초기화 문제를 해결하는 방법 2 : 좀 더 큰 값으로 초기화하는 것(Xavier Initialization)
    • standard gaussian으로 뽑은 값을 입력값으로 스케일링 해준다.
    • 입력값이 작으면 더 작은 값으로 나눠 입력값보다는 조금 더 큰 값을 얻어 입출력의 분산을 맞춘다.
    • ReLU를 사용하면 뉴런 중 절반이 없어지므로 값이 너무 작아지므로 /2를 통해 절반이 없어졌다는 사실을 고려하도록 하여 작동시키면 쓸만하다.

 

 


Batch Normalization

 

  • 강제로 레이어의 출력을 unit gaussian으로 만든다.

 

  • Batch단위로 한 레이어에 입력으로 들어오는 모든 값을 계산한 평균과 분산을 이용해 정규화함으로써 구현

 

  • 평균과 분산을 상수로 가지고 있으면 언제든 미분이 가능하고 Backpropogation이 가능하다.

 

 

  • Batch당 N개의 학습 데이터가 있고, 각 데이터가 D차원이라 할 때, 각 차원별로 평균을 구해주고 한 Batch내에서 모두 계산해 Normalize하고 FC나 Conv Layer 직후에 넣어준다. Conv Layer는 같은 Activation Map의 같은 채널 요소들은 같이 정규화해준다.

 

  • 문제점 : normalization을 통해 입력이 tanh의 linear한 영역에만 존재하도록 강제하면 saturation은 일어나지 않는다.
    • 해결 : saturatiaon을 조절하자 scaling 연산을 추가한다.

 


Babysitting the Learning Process

  1. 데이터 전처리
  2. 아키텍쳐 선택
  3. 네트워크 초기화
  4. 초기 loss 체크
    • soft max라면 로그 체크, 이후 regularization term 추가후 loss 증가 체크
  5. 데이터 일부만 학습시켜보기
    • regularization 사용 x
    • epoch마다 loss 내려가는지 확인, train accuracy 증가 확인
  6. learning rate 정하기
    • regulaization 후 learning rate 찾기
    • learning rate가 작으면 gradient 업데이트가 충분히 일어나지 않아 loss가 잘 줄지 않는다.
    • 보통 e-3 e-5 사이 사용

 


Hyperparameter Optimization

  • cross-valindation은 training set으로 학습시키고 validation set으로 평가하는 방식

 

  • coarse stage: epoch 몇번으로 좋은지 아닌지 판단가능
    • 넓은 범위에서 값을 골라낸다.

 

  • fine stage: 범위는 더 좁게, 학습은 좀 더 길게
    • 학습하는 동안 cost 변화를 보고 이전 cost보다 더 커지면 잘못하는 중인 것이다.
    • Cost가 빠르게 오르면 loop를 멈추고 다른 Hyperparameter 선택

 

  • 하이퍼 파라미터 최적화시에는 learning rate가 gradient와 곱해지므로 log scale로 값을 주는 것이 좋다.

 

  • gird search : 하이퍼 파라미터를 고정도니 값과 간격으로 샘플링 ←이것보단 random search가 더 좋다.

 

  • loss curve : 어떤 learning rate가 좋은지 알 수 있다.
    • loss가 발산하면 learning rate가 높은 것이고, 너무 평평하면 낮은것
    • 가파르게 내려가다가 정체기가 생기는 것도 learning rate가 높다는 의미
    • 최적의 learning rate는 비교적 가파르게 내려가면서도 지속적이어야 한다.
    • 평평하다가 갑자기 가파르게 내려가면 초기화 문제
    • train_acc와 va_acc가 큰 차이를 보인다면 overfitting 가능성 있음 → regularization의 강도 높이기
    • gap이 없다면 아직 overfitting하지 않았고 capacity를 높일 여유있다.

가중치의 크기 대비 가중치 업데이트의 비율은 0.001이 좋다