본문 바로가기
코딩💻

[Deep Learning] Hyperparameters , Kfold Cross-Validation, Keras tuner

by 하암꿈 2022. 11. 23.
728x90

하이퍼파라미터, Kfold Cross-Validation, Keras Tuner Hyperband Tuner

 

 

하이퍼파라미터

 

  • 하이퍼파라미터 조정(Tuning)은 모델 성능에 엄청난 영향을 끼치는 요소이기 때문에 시간이 많이 소요되더라도 반드시 해주어야 한다.
  • 딥러닝에서는 하이퍼파라미터가 굉장히 많다.
  • 튜닝가능한 파라미터 
    • 배치 크기(batch_size)
    • 에포크(epochs)
    • 옵티마이저(optimizers)
    • 학습률(learning rate)
    • 활성화 함수(activation)
    • Regularization(weight decay, Dropout 등)
    • 은닉층(Hidden layer)의 노드(Node) 수

 

Kfold Cross-Validation

 

  • k-fold cross-validation(k-겹 교차 검증)은 가장 널리 사용되는 교차 검증 방법의 하나로, 데이터를 k개로 분할한 뒤, k-1개를 학습용 데이터 세트로, 1개를 평가용 데이터 세트로 사용하는데, 이 방법을 k번 반복하여 k개의 성능 지표를 얻어내는 방법이다.

  • Grid Search
    • 하이퍼파라미터마다 탐색할 지점을 정해주면 모든 지점에 해당하는 조합을 알아서 수행
    • 보다 직접적인 영향을 주는 하이퍼파라미터가 따로 있기 때문에 중요한 파라미터만 해도 좋은 성능을 낼수있어서 효율이 좋은 방법은 아닌것 같다.
  • Random Search
    • 상대적으로 중요한 하이퍼파라미터에 대해서는 탐색을 더 하고, 덜 중요한 하이퍼파라미터에 대해서는 실험을 덜 하도록 한다.
    • Grid Search에 비해서 걸리는 시간이 적다.
  • Bayesian Methods
    • 이전 탐색 결과 정보를 새로운 탐색에 활용하는 방법

 

 

 

Keras Tuner Hyperband Tuner

 

  • hypermodel: 노트에서 함수로 정의해 준 모델(model_builder)을 넣어준 파라미터
  • objective: 평가지표 (예- ‘val_accuracy’)
  • max_epochs: 튜닝하는 하이퍼파라미터별 최대 검증 epoch
  • factor, hyperband_iterations —> 하이퍼파라미터별 검증 epoch 수 결정
  • directory, project_name —> 이름대로 폴더 생성해서 trial별 검증값들을 파일로 저장

 


# 모델 만들기

def model_builder(hp):

  model = Sequential()

  # Dense layer에서 노드 수를 조정(32-512)
  hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)

  model.add(Dense(units = hp_units, activation='relu'))
  model.add(Dense(units = hp_units, activation='relu'))

  model.add(Dense(1, activation='sigmoid')) # 이진분류니까 노드수 1, 활성함수로는 시그모이드

  # Optimizer의 학습률(learning rate)을 조정[0.01, 0.001, 0.0001]합니다. 
  hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4])

  # 컴파일 단계, 옵티마이저와 손실함수, 측정지표를 연결해서 계산 그래프를 구성함
  model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate = hp_learning_rate), 
                loss=keras.losses.BinaryCrossentropy(from_logits = True), 
                metrics=['accuracy'])

  return model

 

# 튜너를 인스턴스화하고 하이퍼 튜닝을 수행

tuner = kt.Hyperband(model_builder,
                     objective = 'val_accuracy', 
                     max_epochs = 30, 
                     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_scaled, y_train, epochs = 30, batch_size=50, validation_data = (X_test_scaled,y_test), callbacks = [ClearTrainingOutput()])

best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]

print(f"""
최적화된 Dense 노드 수 : {best_hps.get('units')} 
최적화된 Learning Rate : {best_hps.get('learning_rate')} 
""")
# Keras 튜너를 활용하여 얻어낸 파라미터를 입력

from tensorflow.keras import regularizers

tf.random.set_seed(1442)
initializer = tf.keras.initializers.HeNormal()

model = Sequential()

model.add(Dense(best_hps.get('units'), 
                activation='relu', kernel_initializer=initializer,          
                kernel_regularizer=regularizers.l2(0.01),    # L2 norm regularization
                activity_regularizer=regularizers.l1(0.01))) # L1 norm regularization))
model.add(Dense(best_hps.get('units'),
                activation='relu', kernel_initializer=initializer,            
                kernel_regularizer=regularizers.l2(0.01),    # L2 norm regularization
                activity_regularizer=regularizers.l1(0.01)))
model.add(Dense(1, activation='sigmoid')) # 이진분류니까 노드수 1, 활성함수로는 시그모이드

model.compile(optimizer=keras.optimizers.Adam(learning_rate = best_hps.get('learning_rate')), 
              loss='binary_crossentropy', 
              metrics=['accuracy'])

results = model.fit(X_train_scaled, y_train, epochs=2, batch_size=50, validation_data=(X_test_scaled,y_test))

 

# 테스트셋 사용해서 결과 보기
model.evaluate(X_test_scaled,  y_test, verbose=2)
300x250