[Deep Learning] Hyperparameter Tuning

2022. 5. 2. 22:24AI/Codestates

728x90
반응형

 

하이퍼파라미터 튜닝 ( Hyperparmeter Tuning )

머신러닝 알고리즘을 다룰 때에 일반적인 모델의 성능을 평가하기 위해서 교차 검증 ( Cross - Validation ) 을 사용했던 것처럼 신경망도 교차 겅증을 사용하여 일반화 성능을 평가 할 수 있음

▶ Grid Search 

  • 하이퍼파라미터마다 탐색할 지점을 정해주면 모든 지점에 해당하는 조합을 알아서 수행해줌
  • 너무 많은 하이퍼파라미터 조합을 찾으려고는 X
  • 1개 혹은 최대 2개 정도의 파라미터 최적값을 찾는 용도로 적합함
def create_model():
    model = Sequential()
    model.add(Dense(100, input_dim=8, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model
    
# KerasClassifer 로 wrapping

model = KerasClassifier(build_fn=create_model, verbose=0)

# 탐색범위 지정 후 GridSearchCV 학습

batch_size = [8, 16, 32, 64, 128]
param_grid = dict(batch_size=batch_size)

grid = GridSearchCV(estimator=model, param_grid=param_grid, n_jobs=1)
grid_result = grid.fit(X, Y)

Random Search

  • Grid Search의 단점을 해결하기 위해 나온 방법으로 지정된 범위 내에서 무작위로 모델을 돌려본 후 최고 성능의 모델을 반환해줌
  • Grid Search 에서는 파라미터의 중요도가 모두 동등하다고 가정하지만 Random Search 는 상대적으로 중요한 하이퍼파라미터에 대해서는 탐색을 더 하고, 덜 중요한 하이퍼파라미터에 대해서는 실험을 덜 하도록 함
  • Random Search 는 절대적으로 완벽한 하이퍼파라미터를 찾아주지는 않는다는 단점

▶ Bayesian Methods

  • 이진 탐색 결과 정보를 새로운 탐색에 활용하는 방법
  • bayes_opt 나 hyperopt 와 같은 패키지를 사용하면 베이지안 방식을 적용할 수 있음

▶ Keras Tuner

  • Random Search, Bayesian Optimization, Hyperband 등의 최적화 방법을 수행할 수 있음
  • Hyperband 코드
def model_builder(hp):
  model = keras.Sequential()
  model.add(Flatten(input_shape=(28, 28)))
  
  hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)
  model.add(Dense(units = hp_units, activation = 'relu'))
  model.add(Dense(10, activation='softmax'))

  hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4]) 
  
  model.compile(optimizer = keras.optimizers.Adam(learning_rate = hp_learning_rate),
                loss = keras.losses.SparseCategoricalCrossentropy(from_logits = True), 
                metrics = ['accuracy'])
  
  return model
tuner = kt.Hyperband(model_builder,
                     objective = 'val_accuracy', 
                     max_epochs = 10,
                     factor = 3,
                     directory = 'my_dir',
                     project_name = 'intro_to_kt')
# Callback 함수 지정
class ClearTrainingOutput(tf.keras.callbacks.Callback):
  def on_train_end(*args, **kwargs):
    IPython.display.clear_output(wait = True)
tuner.search(X_train, y_train, epochs = 10, validation_data = (X_test, y_test), callbacks = [ClearTrainingOutput()])
best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]
# 최고 성능을 보이는 하이퍼파라미터 조합으로 다시 학습 진행
model = tuner.hypermodel.build(best_hps)
model.summary()

튜닝 가능한 파라미터 종류

■ 배치크기 ( batch_size )

■ 에포크 ( epochs )

■ 옵티마이저 ( optimizers )

■ 학습률 ( learning rate )

■ 활성화 함수 ( activation )

■ Regulaization ( weight decay, Dropout 등 )

■ 은닉층 ( Hidden layer )의 노드 (Node) 수

728x90
반응형