딥러닝 기초 (4) Hyperparameter Tuning

딥러닝 기초 (4) Hyperparameter Tuning

하이퍼 파라미터 튜닝

다른 인공지능 머신러닝들 보다 신경망에서 초매개변수 조정이 필수적이고 중요해진다.

>> 매개변수 종류도 많고, 하나하나를 어떻게 하냐에 따라 전혀 다른 결과를 내기 때문이다.

그렇다면 어떤 파라미터 튜닝을 하는 정석이나 정답이 있을까?

>> 그럴 가능성이 현저히 적다. 그 이유는 데이터마다 다른 패턴을 보이기 때문이다.

그래서 하이퍼 파라미터 튜닝을 ‘노가다’라고 부르기도 한다.

실험들을 교차 검증(Cross Validation)한다면 최종적으로 계산되는 정확도들의 분산(variance)을 줄일 수 있어서 이러한 문제점들을 최소화가 가능하다.

자주 사용하는 하이퍼 파라미터

Batch Size

모델의 가중치를 업데이트할 때 한 번에 몇 개의 관측치를 보게 되는지를 결정하는 파라미터

너무 큰 배치 크기를 고르게 되면 한번에 모든 데이터에 대한 Loss를 계산해야 하는 문제점이 생긴다.

(다시 말하면, 큰 데이터로 학습을 시키는 게 무거운 작업이고, iteration이 작아지면서 학습을 많이 할 수 없다는 단점이 생긴다는 뜻이다.)

너무 작은 사이즈를 고른다면 학습에 오랜 시간이 걸리고, 추정 값에 노이즈가 많이 생길 수 있기 때문에 피해야 한다..

적절한 양은 32에서 512에서 멈추는 2의 제곱수로 하는 게 보통이다.

(Keras Default = 32)

Optimization Algorithms

최적화 도구라고 불리며, 어떤 방식으로 가중치를 갱신할지 결정한다.

Adam, SGD, AdaGrad, RMSProp 등등 종류가 많다.

분류/회귀, 데이터의 종류, 경사 하강 속도 등을 고려해서 선택하길 바란다.

Training Epochs

전체 학습 반복 횟수

Learning Rate

경사 하강법 기반의 optimizer 선택을 위한 하이퍼 파라미터 (default = 0.01)

학습률이 너무 높은 경우에는 발산

학습률이 너무 낮은 경우에는 모델이 수렴하는데 실패

local minima에 빠질 수도 있다.

0.5보다 높게 설정하는 것은 추천하지 않음

Momentum

SGD와 연관되어 있으며, SGD 안에 있는 초매개변수이다.

관성의 법칙처럼, 최적점을 향해 많이 나아갔다면 learning rate를 크게 해서 더 멀리 나아갈 수 있게 한다. 반대로 global minimum에 가까워질수록 진행 속도를 늦추게 한다.

Activation Functions

은닉층에는 ReLU를 사용하고 출력층에는 Sigmoid (이진 분류)나 Softmax (다중 분류)를 사용

Sigmoid ⇒ Xavier 가중치 초기화 방법을 사용하는 것이 유리

ReLU ⇒ He 가중치 초기화 방법을 사용하는 것이 유리

Dropout Regularization

학습 중에 무작위로 비활성화하고 싶은 뉴런들의 비율

드롭아웃을 어느 layer (visible vs. hidden)에 적용하는지에 따라 다른 효과를 불러올 수 있다

사용하고 있는 모델이 과적합이나 일반화 문제가 있지 않다면 굳이 쓸 필요는 없다

Hidden Layer의 Neuron(Node) 개수

많은 노드와 레이어는 학습 시간을 늘리게 되고 모델이 과적합 될 확률을 높인다

>>신경망이 커질수록 드롭아웃 규제나 다른 규제 방법으로 이러한 가능성에 대비해야 한다.

Keras Tuner

하이퍼 파라미터는 머신러닝의 성능을 좌우하는 아주 중요한 변수이다.

Keras Tuner 라이브러리는 최적의 파라미터를 찾는데 도움을 준다.

하이퍼 파라미터는 두가지 유형이 있다.

1. 모델 선택 및 생성 시 정해주는 은닉층과 은닉층의 노드 수와 같은 입력 값

2. 확률적 경사 하강법(SGD) 학습률 및 kNN(가장 가까운 이웃) 분류자의 가장 가까운 이웃 수 등

>> 학습 알고리즘의 속도와 품질에 영향을 미치는 파라미터

# keras tuner setting import tensorflow as tf from tensorflow import keras from tensorflow.keras.layers import Dense, Flatten import IPython !pip install -U keras-tuner import kerastuner as kt # 데이터 불러오기 (img_train, label_train), (img_test, label_test) = keras.datasets.fashion_mnist.load_data() #정규화 # Normalize pixel values between 0 and 1 img_train = img_train.astype('float32') / 255.0 img_test = img_test.astype('float32') / 255.0

튜너를 인스턴스화하고 하이퍼 튜닝을 수행한다.

def model_builder(hp): model = keras.Sequential() model.add(Flatten(input_shape=(28, 28))) # 첫 번째 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(10)) # 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 = keras.optimizers.Adam(learning_rate = hp_learning_rate), loss = keras.losses.SparseCategoricalCrossentropy(from_logits = True), metrics = ['accuracy']) return model

Callback 정의

튜닝을 할때마다 콜백 함수를 정의해줘서 아래와 같이 디스플레이를 초기화해주는 클래스를 만들고 콜백 함수에 넣어준다.

class ClearTrainingOutput(tf.keras.callbacks.Callback): def on_train_end(*args, **kwargs): IPython.display.clear_output(wait = True)

tuner.search(img_train, label_train, epochs = 10, validation_data = (img_test, label_test), callbacks = [ClearTrainingOutput()]) # Get the optimal hyperparameters best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0] print(f""" 하이퍼 파라미터 검색이 완료되었습니다. 최적화된 첫 번째 Dense 노드 수는 {best_hps.get('units')} 입니다. 최적의 학습 속도는 {best_hps.get('learning_rate')} 입니다. """)

새로운 하이퍼 파라미터로 모델을 그 자리에서 다시 만들고 재학습하면 원하는 모델을 얻을 수 있다.

# 최적의 하이퍼 파라미터를 사용하여 모델을 구축하고 데이터에 대해 교육 model = tuner.hypermodel.build(best_hps) model.summary() model.fit(img_train, label_train, epochs = 10, validation_data = (img_test, label_test)) # 우리가 원하는 모델이 나온다.

ETF(Experiment Tracking Framework) - 실험 기록 프레임워크

튜너로 많이 학습하다보면 버전을 하나하나 기억하기가 어려워진다.

WandB와 같이 실험 기록을 저장할 수 있는 프레임 워크를 참고해보고 사용하면 더욱 원활한 코딩을 할 수 있다.

https://wandb.ai/site

from http://chal.tistory.com/22 by ccl(A) rewrite - 2021-08-16 23:26:20