심층신경망 훈련속도 높이기 (고속 옵티마이저)

6211 단어 AIAI

심층 신경망 훈련 속도 높이기
: 연결 가중치 초기화, 활성화 함수, 배치 정규화, 사전 훈련된 층 재사용 (전이학습, 비지도 사전훈련, 보조 작업에서 사전훈련), 고속옵티마이저

고속 옵티마이저

1) 모멘텀 최적화

  • 표준 경사하강법 : 경사면을 따라 일정한 크기의 스텝으로 조금씩 내려와 맨 아래에 도착하는데 시간이 더 오래 걸림

    • 가중치 <- 가중치 - 가중치에 대한 비용함수의 그레디언트 * 학습률
    • 이전 그레디언트 얼마였는지 고려 x
  • 모멘텀 최적화 : 처음에 느리게 출발해 아래 도달할 때 가속화

    • 가중치 <- 가중치 + 모멘텀 벡터
    • 모멘텀 벡터 <- 모멘텀 벡터 * 모멘텀 - 그레디언트 x 학습률
      • 모멘텀 (하이퍼파라미터) = 0.9 (default)
      • 0 (높은 마찰 저항) ~ 1 (마찰 저항 없음)
    • 이전 그레디언트 중요
      optimizer = keras.optimizers.SGD(lr, momentum = 0.9)

2) 네스테로프 가속 경사

  • 기본 모멘텀 최적화보다 항상 빠름
  • 그래디언트 계산 시, 현재 위치가 아닌 모멘텀의 방향으로 앞선 위치의 그래디언트 계산
optimizer = keras.optimizers.SGD(lr, momentum, nesterov = True)

3) AdaGrad

  • 최적점쪽으로 정확한 방향을 잡아 가장 가파를 차원을 따라 그래디언트 벡터 스케일 감소
  • 학습률 감소시키지만 경사가 완만한 차원보다 가파른 차원에 대해 더 빠르게 감소함 = 적응적 학습률
  • 신경망 훈련시 너무 일찍 멈추는 경우 있음. 따라서 간단한 선형회귀에서 효과적)

4) RMS Prop

  • AdaGrad가 너무 빨리 느려졋 최적점에 수렴하지 못하는 단점 보완
  • 가장 최근 반복에서 비롯된 그래디언트만 누적
  • 파라미터 rho => 감소율
optimizer = keras.optimizers.RMSprop(lr, rho = 0.9)
  • AdaGrad 보다 항상 성능 좋음

5) Adam

  • 모멘텀 최적화 + RMSProp
    • 모멘텀 최적화처럼 지난 그래디언트의 지수 감소 평균
    • RMSProp처럼 지난 그래디언트 제곱의 지수 감소된 평균
    • beta_1 : 모멘텀 감소 하이퍼파라미터
      beta_2 : 스케일 감소 하이퍼파라미터
      optimizer = keras.optimizers.Adam(lr, beta_1 = 0.9, beta_2 = 0.999)

6) 학습률 scheduling

  • 일정한 학습률이 아닌 큰 학습률로 시작하여 학습 속도가 느려질 때, 학습률 낮추어 좋은 솔루션 빨리 찾음

  • 지수 기반 스케줄링

    • 학습률 = 초기 학습률 * 0.1t/s
    • s스텝마다 10배씩 줄어듦
       #현재 에포크를 받아 학습률 반환
       def exponential_decay(lr, s):
       	def exponential_decay_fn(epoch):
       		return lr*0.1**(epoch/s)
           return exponential_decay_fn
       
       
       #스케줄링 함수 전달하여 LearningRateScheduler 콜백 만들어 fit()에 전달
       lr_sched = keras.callbacks.LearningRateScheduler(exponential_decay(lr, s))
       history = model.fit(x,y, .. , callbacks = [lr_sched])
  • 성능 기반 스케줄링

    • 매 스텝마다 검증 오차 측정하고 오차 줄어들지 않으면 x배 만큼 학습률 감소
  • 1사이클링 스케줄링

    • 훈련 절반동안 초기 학습률을 선형적으로 증가시키고 나머지 절반동안 선형적으로 다시 감소. n0 는 n1의 10배정도 차이나도록 선택
  • 거듭제곱 기반 스케줄링

    • 학습률을 반복 횟수에 대한 함수
      n(t) = n0/(1+t/s)c
      t : 반복횟수
      n0 : 초기 학습률
      c : 거듭제곱 수
      s : 스텝 횟수
    • s번의 스텝 후 학습률은 n0/2, 또 다른 s번의 스텝 후 n0/3, ...
      optimizer = keras.optimizers.SGD(lr, decay = 0.0001)
      # decay = s의 역수

좋은 웹페이지 즐겨찾기