3 분 소요

적절한 하이퍼파라미터를 어떻게 찾지?

  • 신경망에는 하이퍼파라미터가 다수 등장한다.
  • 여기서 말하는 하이퍼파라미터는, 예를 들어 각 층의 뉴런 수, 배치크기, 매개변수 갱신 시의 학습률과 가중치 감소등이 있다.
  • 이러한 하이퍼 파라미터의 값을 적절히 설정하지 않으면 모델의 성능이 크게 떨어진다.
  • 하이퍼 파라미터의 값은 매우 중요하지만 그 값을 결정하기 까지는 일반적으로 많은 시행착오를 겪는다.

검증 데이터

  • 하이퍼 파라미터를 검증할 때 주의할 점은 시험 데이터를 사용해서는 안된다.
  • 왜냐하면 시험 데이터를 사용하여 하이퍼파라미터를 조정하면 하이퍼파라미터 값이 시험 데이터에 오버피팅되기 때문이다.
  • 하이퍼파라미터 값의 ‘좋음’을 시험 데이터로 확인하게 되므로 하이퍼파라미터의 값이 시험 데이터에만 적합하도록 조정되어버린다.
  • 그렇게 되면 다른 데이터에는 적응되지 못하니 범용 성능이 떨어지는 모델이 된다.
  • 이러한 이유로 하이퍼파라미터를 조정할 때는 하이퍼파라미터 전용 확인 데이터가 필요하다.
  • 하이퍼 파라미터 조정용 데이터를 일반적으로 검증 데이터라고 부른다.
  • 훈련 데이터는 매개변수(가중치와 편향)의 학습에 이용하고, 검증 데이터는 하이퍼파라미터의 성능을 평가하는 데 이용한다.
  • 시험 데이터는 범용 성능을 확인하기 위해서 마지막에 (이상적으로는 한 번만 )이용한다.
    • 훈련 데이터 : 매개변수 학습
    • 검증 데이터 : 하이퍼파라미터 성능 평가
    • 시험 데이터 : 신경망의 범용 성능 평가

데이터셋에 따라서 훈련 데이터, 검증 데이터, 시험 데이터를 미리 분리해둔 것도 있다.
MNIST 데이터셋은 훈련 데이터와 시험 데이터로만 분리되었다.
이런 겨우엔(필요하면) 사용자가 직접 데이터를 분리해야한다.
MNIST 데이터셋에서 검증 데이터를 얻는 가장 간단한 방법은 훈련 데이터 중 20% 정도를 검증 데이터로 먼저 분리하는 것이다.

(x_train, t_train), (x_test, t_test) = load_mnist() 
# 훈련 데이터를 뒤섞는다. 
x_train, t_train = shuffle_dataset(x_train, t_train) 
# 20%를 검증 데이터로 분할

validation_rate = 0.20 
validation_num = int(x_train.shape[0] * validation_rate) 

x_val = x_train[ :validation_num] 
t_val = t_train[ :validation_num] 
x_train = x_train[validation_n니m: ] 
t_train = t_train[validation_num: ]

해당 코드는 훈련 데이터를 분리하기 전에 입력 데이터와 정답 레이블을 뒤섞는다.
데이터 셋 안의 데이터가 치우쳐 있을지도 모르기 때문이다.
(예컨대 숫자 ‘0’ 에서 ‘9’ 까지 순서대로 정렬되어 있을 수 있다.)
참고로 여기에서 사용한 shuffle_dataset 함수는 np.random.shuffle 을 이용했다.

하이퍼파라미터 최적화

하이퍼파라미터를 최적화할 때의 핵심은 하이퍼파라미터의 ‘최적 값’이 존재하는 범위를 조금 씩 줄여간다는 것이다.

우선 대략적인 범위를 설정하고 그 범위에서 무작위로 하이퍼파라미터 값을 골라낸(샘플링) 후, 그 값으로 정확도를 평가한다.
정확도를 잘 살피면서 이 작업을 여러 번 반복하며 하이퍼파라미터의 ‘최적 값’의 범위를 좁혀간다.

신경망의 하이퍼파라미터 최적화에서는 그리드 서치 같은 규칙적인 탐색보다는 무작위로 샘플링해 탐색하는 편이 좋은 결과를 낸다고 알려져 있다. 이는 최종 정확도에 미치는 영향력이 하이퍼 파라미터마다 다르기 때문이다.

하이퍼파라미터의 범위는 ‘대략적으로’ 지정하는 것이 효과적이다.
실제로도 0.001 에서 1,000 사이 (10-3~105)와 같이 ‘10의 거듭제곱’ 단위로 범위를 지정한다.
이를 ‘로그 스케일 10gseale로 지정’이라고 한다.
하이퍼파라미터를 최적화할 때는 딥 러닝 학습에는 오랜 시간(예컨대 며칠이나 몇 주 이상) 이 걸린다.
따라서 나쁠 듯한 값은 일찍 포기하는 게 좋다.
그래서 학습을 위한 에폭을 작게 하여, 1 회 평가에 걸리는 시간을 단축하는 것이 효과적이다.

• 0 단계 하이퍼파라미터 값의 범위를 설정 • 1 단계 설정된 범위에서 하이퍼파라미터의 값을 무작위로 추출 • 2단계 1 단계에서 샘플링한 하이퍼파라미터 값을 사용하여 학습하고, 검증 데이터로 정확도를 평가(단, 에폭 은 작게 설정) •3단계 1 단계와 2단계를 특정 횟수(100회 등) 반복하며, 그 정확도의 결과를 보고 하이퍼파라미터의 범위를 좁힌다.

이상을 반복하여 하이퍼파라미터의 범위를 좁혀가고, 어느 정도 좁아지면 그 압축한 범위에서 값을 하나 골라낸다.

이것이 하이퍼파라미터를 최적화하는 하나의 방법이다

더더욱 효율적으로 하기를 원한다면 베이즈 정리를 중심으로 한 수학 이록을 구사한 베이즈 최적화 를 사용하여 더 엄밀하고 효율적으로 최적화를 수행한다.

하이퍼파라미터 최적화 구현

  • MNIST 데이터셋을 사용해 하이퍼파라미터를 최적화해보자.
  • 학습률과 가중치 감소의 세기를 조절하는 계수( 가중치 감소 계수)를 탐색하는 문제를 풀고자 한다.
  • 하이퍼파라미터의 검증은 그 값을 0.001 ~ 1,000 (1e-3 ~ 10^3) 같은 로그 스케일 범위에서 무작위로 추출해 수행한다.
  • 이를 파이썬 코드로는 10 ** np.random.uniform(-3,3) 처럼 작성할 수 있다.
  • 이 예에서는 가중치 감소 계수를 1e-8 ~ 1e-4, 학습률을 1e-6 ~ 1e-2 범위부터 시작한다.
weight_decay = 10 ** np.random.uniform(8, 4)
lr = 10 ** np.random.uniform(-6, -2)

검증 데이터의 학습 추이를 정확도가 높은 순서로 나열했다.
이를 보면 Best-5 정도까지는 학습이 순조롭게 진행되고 있다.
이를 바탕으로 Best-5 까지의 하이퍼파라밑어의 값(학습률과 가중치 감소 계수)는 아래와 같다.

Best-1 (val acc:0.83) | lr:0.0092, weight decay:3.86e-07
Best-2 (val acc:0.78) | lr:0.00956, weight decay:6.04e-07
Best-3 (val acc:0.77) | lr:0.00571, weight decay:1.27e-06
Best-4 (val acc:0.74) | lr:0.00626, weight decay:1.43e-05
Best-5 (val acc:0.73) | lr:0.0052, weight decay:8.97e-06

결과를 보면 학습이 잘 진행될 때의 학습률은 0.001~ 0.01
가중치 감소 계수는 1e-8 ~ 1e-6 정도라는 것을 알 수 있다.
이처럼 잘될 것 같은 값의 범위를 관찰하고 범위를 좁혀간다.
그런 다음 그 축소된 범위로 똑같은 작업을 반복한다.
적절한 값이 위치한 범위를 좁혀가다가 특정 단계에서 최종 하이퍼 파라미터 값을 하나 선택한다.

• 매개변수 갱신 방법에는 확률적 경사 하강법 (SGD) 외에도 모멘텀, AdaGrad, Adam 등이 있다. • 가중치 초깃값을 정하는 방법은 올바른 학습을 하는 데 매우 중요하다. • 가중치의 초깃값으로는 ‘Xavier 초깃값’과 ‘He 초깃값’이 효과적이다. • 배치 정규화를 이용하면 학습을 빠르게 진행할 수 있으며, 초깃값에 영향을 덜 받게 된다. • 오버피팅을 억제하는 정규화 기술로는 가중치 감소와 드롭아웃이 있다. • 하이퍼파라미터 값 탐색은 최적 값이 존재할 법한 범위를 점차 좁히면서 하는 것이 효과적이다.

댓글남기기