[핸즈온 머신러닝] 10. 케라스를 사용한 인공신경망 (2)

박경민·2023년 5월 18일
0

[Hands-On Machine Learning]

목록 보기
15/23

신경망 하이퍼파라미터 튜닝하기

  • 층의 개수
  • 뉴런 개수
  • 활성화 함수
  • 가중치 초기화 전략 등 수정 가능

역시나 GridSearchCV나 RandomizedSearchCV 를 사용해 공간을 탐색할 수 있다.

먼저 모델을 만들고 컴파일하는 함수를 만들자.

def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):
    model = keras.models.Sequential()
    model.add(keras.layers.InputLayer(input_shape=input_shape))
    for layer in range(n_hidden):
        model.add(keras.layers.Dense(n_neurons, activation="relu"))
    model.add(keras.layers.Dense(1))
    optimizer = keras.optimizers.SGD(learning_rate=learning_rate)
    model.compile(loss="mse", optimizer=optimizer)
    return model
    
keras_reg = keras.wrappers.scikit_learn.KerasRegressor(build_model)

함수를 만들고 난 후 KerasRegressor 클래스의 객체를 만들게 된다. build_model() 함수로 만들어진 케라스 모델을 감싸는 래퍼이다! (따라서 함수가 저렇게 안에 들어간다.)

이제 keras_reg 객체를 자유롭게 사용하면 된다.

keras_reg.fit(X_train, y_train, epochs=100,
              validation_data=(X_valid, y_valid),
              callbacks=[keras.callbacks.EarlyStopping(patience=10)])
mse_test = keras_reg.score(X_test, y_test)
y_pred = keras_reg.predict(X_new)

이제 본격적으로 랜덤 탐색을 통해 하이퍼파라미터 탐색을 수행해보자.

from scipy.stats import reciprocal
from sklearn.model_selection import RandomizedSearchCV

param_distribs = {
    "n_hidden": [0, 1, 2, 3],
    "n_neurons": np.arange(1, 100).tolist(),
    "learning_rate": reciprocal(3e-4, 3e-2).rvs(1000).tolist(),
}

rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)
rnd_search_cv.fit(X_train, y_train, epochs=100,
                  validation_data=(X_valid, y_valid),
                  callbacks=[keras.callbacks.EarlyStopping(patience=10)])

각각

  • 은닉층 개수, 뉴런개수, 학습률 탐색을 수행한다.

이제 rndsearch_cv 에는 best_prams 라는 최상의 하이퍼파라미터가 들어있다.

rnd_search_cv.best_params_
rnd_search_cv.best_score_

후에 테스트 셋에서 평가하고 배포하면 된다.

랜덤 탐색 이외에 효율적으로 공간을 탐색하는 방법은 다음과 같다.

  • Hyperopt, Hyperas, Kopt, Talos, Keras Tuner, Scikit-Optimize, Spearmint, Hyperband, Sklearn-Deap

이제 하이퍼파라미터에서 좋은 값을 선택하는 가이드라인을 개념적으로 알아보자.

은닉층 개수

  • 복잡한 문제에서는 깊은 신경망이 shallow 신경망보다 파라미터 효율성이 좋다.
  • 동일한 데이터라면 모델링에 필요한 뉴런 수가 줄어들기 때문
  • 심층 신경망은 솔루션으로 수렴 속도가 빠를뿐 아니라 일반화 능력도 향상시켜준다 (왜?)
  • 하나의 훈련된 신경망을 다른 신경망 학습에 사용할 수 있기 때문 (전이학습)

은닉층의 뉴런 개수
뉴런개수는 작업에 필요한 입력과 출력의 형태에 따라 결정된다.
MNIST 의 경우 28X28 의 입력 뉴런과 10개의 출력 뉴런이 필요했었다.

  • 일반적으로 각 층의 뉴런을 줄여 깔떄기처럼 구성
  • 그러나 모든 은닉층에 같은 크기를 사용해도 나은 성능을 내는 경우 많음
  • 다른 은닉층보다 첫 은닉층을 크게 하는 것이 좋음
  • 많은 층과 뉴런을 일단 선택하고, 조기 종료나 규제 기법을 사용하는 게 실전에서 사용

학습률

  • 매우 낮은 학습률부터 큰 학습률까지 반복하여 훈련하는 방법이 있다.
  • 반복마다 일정 값을 학습률에 곱한다
  • 최적의 학습률은 학습률을 곱해가며 동시에 기록하는 손실이 줄어들었다가 다시 상승하는 지점(최적에 도달하면서 빠르게)

옵티마이저
후에 고급 옵티마이저에 대해 살펴보자.

배치크기

  • 모델 성능과 훈련 시간에 영향

활성화 함수

  • 일반적으로 ReLU, 출력층은 작업에 따라

반복 횟수

  • 튜닝 X

등이 조절 가능한 하이퍼파라미터이다!

profile
Mathematics, Algorithm, and IDEA for AI research🦖

0개의 댓글