딥러닝(Deep Learning)/딥러닝 기타 지식

Hyper Paramater Tuning(Feat. 모델 최적화)

JIN_YOUNG _KIM 2024. 2. 19. 15:32

Parameter(매개변수) vs Hyper Parameter(하이퍼 매개변수)

Parameter (파라미터, 매개변수)

  • Parameter는 모델 내부에서 결정되는 변수, 데이터를 통해서 산출이 가능한 값이며 학습 시 얻어지는 값이다.
  • 모델 내부에서 데이터를 통해 구해진다.
  • 예측을 수행할 때, 모델에 의해 요구되어지는 값
  • 측정되거나 데이터로부터 학습되어진다.
  • 학습된 모델의 일부로 저장되어진다.
  • ex. 인공신경망에서의 가중치 계수(weight coefficient), SVM(서포트 벡터 머신)에서의 서포트 벡터, 선형회귀나 로지스틱회귀분석에서의 결정계수, 편향(bias)

Hyperparameter (하이퍼파라미터, 초매개변수)

  • Hyperparameter는 주로 알고리즘 사용자가 경험에 의해 직접 세팅하는 값. 
  • 여러 번 수행하면서 최적의 값을 찾는다.
  • 정해진 최적의 값이 없다.
  • Hyperparameter는 모델에서 외적인 요소, 데이터 분석을 통해 얻어지는 값이 아님
  • 모델의 parameter값을 측정하기 위해 알고리즘 구현 과정에서 사용
  • 예측 알고리즘 모델링의 문제점을 위해 조절된다.
  • ex. 신경망 학습에서 learing rate(학습률), SVM에서의 코스트 값, KNN에서의 K의 개수, epoch

Hyperparameter

하이퍼 파라미터 튜닝 : 상단에 하이퍼 파라미터의 특징을 적어두었듯, 이는 사용자의 입력값이고 정해진 최적의 값이 없다. 모델이나 데이터에 따라 달라지곤 하는데 이를 여러 번 시도해보면서 데이터와 모델에 맞는 하이퍼 파라미터를 찾아 나가는 과정을 하이퍼 파라미터 튜닝(Hyper Parameter Tuning)이라고 한다.

  • 튜닝 방법은 여러가지가 있다.
    • ex. Manual Search, Grid Search, Random Search, Bayesian Optimization, Non-Probabilistic, Evolutionary Optimization, Gradient-based Optimization, Early Stopping

다음은 네트워크 구조와 관련된 하이퍼 파라미터들이다.

  • 은닉층의 뉴런 개수 (Hidden Unit)
    • 훈련 데이터에 대한 학습 최적화 결정 변수
    • 첫 Hidden Layer의 뉴런 수가 Input Layer 보다 큰 것이 효과적
  • Dropout
    • 과적합을 피하기 위한 정규화 기법
    • 학습데이터에 과적합하게 학습된 model을 실제로 사용하기 위해 범용성을 위한 기법으로 Hidden Layer의 Neuron들을 일정 비율로 배제하고 학습을 한다.
  • 가중치 초기화 (Weight Initialization)
    • 학습 성능에 대한 결정 변수

다음은 학습에 사용되는 하이퍼 파라미터들이다.

  • 학습률 (learning rate)
    • gradient의 방향으로 얼마나 빠르게 이동할 것인지 결정하는 변수
    • 너무 작으면 학습의 속도가 늦고, 너무 크면 학습이 불가하다.
  • 모멘텀 (momentum)
    • 학습 방향을 유지하려는 성질
    • 모멘텀을 사용하면 학습 방향이 바로 바뀌지 않고, 일정한 방향을 유지하며 움직인다. (운동량)
    • 같은 방향의 학습이 진행된다면 가속을 가지며 더 빠른 학습을 기대할 수 있다.
    • 자세한 설명
  • 에포크 (epoch, training epochs)
    • 전체 트레이닝 셋이 신경망을 통과한 횟수를 의미한다.
    • ex. 1-epoch는 전체 트레이닝 셋이 하나의 신경망에 적용되어 순전파와 역전파를 통해 신경망을 한 번 통과했다는 것을 의미
  • 배치 사이즈 (batch size)
    • 미니 배치 크기(Mini-batch Size)
    • 배치셋 수행을 위해 전체 학습 데이터를 등분하는 크기 (전체 트레이닝 셋을 작게 나누는 이유는 트레이닝 데이터를 통째로 신경망에 넣으면 비효율적인 리소스 사용으로 학습 시간이 오래 걸리기 때문이다.)
    • 가용 메모리 크기와 epoch 수행 성능을 고려
    • 최소 사이즈는 32이고 GPU의 물리적인 구조로 인해 항상 2의 제곱으로 설정한다.
  • 반복 (iteration)
    • 1-epoch를 마치는데 필요한 미니배치 갯수를 의미한다. 즉, 1-epoch를 마치는데 필요한 파라미터 업데이터 횟수이다. 각 미니 배치 마다 파라미터 업데이터가 한번씩 진행되므로 iteration은 파라미터 업데이트 횟수이자 미니배치 개수이다.
    • ex. 700개의 데이터를 100개씩 7개의 미니배치로 나누었을때, 1-epoch를 위해서는 7-iteration이 필요하며 7번의 파라미터 업데이트가 진행된다.
  • 손실함수 (Cost Function)
    • 입력에 따른 기대 값과 실제 값의 차이를 계산하는 함수
    • 평균 제곱 오차
    • 교차 엔트로피 오차
  • 정규화 파라미터 (Regularization parameter)

(아래의 코드는 우리가 Hyper Parameter Tuning 시, 최적의 매개변수를 찾기 위해서 for문으로 여러 모델을 생성하는 코드의 예시이다)

(컴퓨터 비전과 딥러닝 p296에 Hidden Layer와 units 개수의 최적화에 대한 나만의 insight를 적어 놓았다. 꼭 참조하자)

 

def build_model(optimizer):
    model = Sequential()
    layers = [
        Dense(units=512, activation='tanh', input_shape=(784,)),
        Dense(units=10, activation='softmax')
    ]
    for layer in layers:
        model.add(layer)
    model.compile(loss='mse', optimizer=optimizer, metrics=['accuracy'])
    return model

optimizers = [SGD(learning_rate=0.01), Adam(learning_rate=0.001)]
histories = []

for optimizer in optimizers:
    model = build_model(optimizer)
    history = model.fit(x_train, y_train, batch_size=128, epochs=50, validation_data=(x_test, y_test), verbose=2)
    histories.append(history)

for history in histories:
    res = model.evaluate(x_test, y_test, verbose=0)
    print("정확률=", res[1] * 100)

import matplotlib.pyplot as plt

colors = ['r', 'b']
linestyles = ['--', '-']
labels = ['SGD', 'Adam']

for i, history in enumerate(histories):
    plt.plot(history.history['accuracy'], color=colors[i], linestyle=linestyles[i])
    plt.plot(history.history['val_accuracy'], color=colors[i])
plt.title('sgd vs adam')
plt.ylim((0.7, 1.0))
plt.xlabel('epochs')
plt.ylabel('accuracy')
plt.legend(['train_sgd', 'val_sgd', 'train_adam', 'val_adam'])
plt.grid()
plt.show()

(위 게시물은 해당 사이트를 참조하여 만들어 졌다. https://velog.io/@jihyeon9975/%EB%94%A5%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D%EC%97%90-%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94-%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0)

[컴퓨터 비전과 딥러닝]에서 발췌한 모델 최적화 관련된 정보들을 아래와 같이 모아 보았다. 

하이퍼 매개변수 튜닝 튜토리얼 : p 290 참조 

CNN 신경망 구성 튜토리얼 : [Dumoulin 2016] - p310

컴퓨터 비전과 딥러닝 p338 중...
- 컨볼루션 층 48개, Image Dateset은 120만장을 기준으로 했을 때, 가중치의 개수는 2,500만개라고 한다. 
그런데 가중치 개수 250만 개 입장에서 Image Dataset 120만장은 부족한 개수라고 하며, Over Fitting을 일으킨다고 함
(나도 이것의 비율을 기준으로 삼아서 Image 데이터가 충분한지 안한지 판단을 해 보자)

그럼에도 책에서는 딥러닝 신경망 모델의 용량을 크게 유지하면서 
1. Data Augementation
2. Drop out
3. Early Stopping
등의 규제(최적화) 방법으로 Over Fitting을 방지하면서 훈련을 시킬 것을 권장하고 있다. 

훈련 데이터 이미지가 예를 들어 180GB(ImageNet 120만장) 정도로 너무 많으면 이 이미지들을 학습시킬 때 전체 데이터를 메인 메모리에 올려서 학습을 시키는 것을 불가능하다. 
그래서 [컴퓨터 비전과 딥러닝] P343에 적혀 있길, "폴더에 저장해두고 필요한 만큼씩 메인 메모리에 적재해 사용하는 방식으로 학습한다"라고 적혀져 있다.
그러나 메모리 문제가 해결이 되더라도 예를 들어 5만장씩 학습을 시킨다고 하더라도 ImageNet의 이미지의 크기는 224x224x3이며 한 장당 이미지가 매우 크므로 [연산 시간]이 너무 오래 
걸린다. (MNINST, CIFAR의 이미지는 32X32 이하의 크기였기에 연산이 빨리 되었고, 메모리 문제도 크게 문제가 되지 않았다)
-> 이러한 문제를 쉽게 해결하는 방법이 바로 Transfer Learning(전이 학습)이다. 
(컴퓨터 비전과 딥러닝 p344를 보면 tensorflow에서 제공하는 pre-trained-model의 표가 있다)