data partitioning, hyper-parameter tuning

2021. 8. 16. 17:30AI/Deep learning

    목차
반응형

데이터를 training과 testing으로 분할

보통 8:2 혹은 9:1

 

파라미터를 추정하는데는 많은 데이터가 필요하므로, training을 크게

testing은 모형들의 성능을 구별할 정도만 되면 충분하므로 작게

 

training에 과적합되면 testing에서 성능이 낮아짐

training과 testing의 data가 섞이지 않도록 주의

 

섞일 시, testing 결과의 성능이 좋게 됨

다른 data를 가지고 test하게 되면 성능이 높지 않게 나옴

즉, 객관적인 성능 수치를 파악하기 어려움

 

 

Validation / Development set

딥러닝에서는 다양한 hyperparameter의 결정이 필요

 

hyperparameter

은닉층 개수, filter size 등

 

테스트셋 데이터를 이용해서 결정하면 hyperparameter가 test set에 과적합될 우려

별도의 validation 혹은 development set을 이용해서 hyper parameter 결정

 

training data로 

hyperparameter tuning 후,

cross validation data로 결정

 

training data와 cross validation data는 교체해 가면서 사용

 

model.fit(x_train, y_train, epochs=1, validation_split=0.1)

0.1 즉, 10%의 data를 학습시키지 않고 keep

val_accuracy

별도 10%의 data로 정확도를 평가함

 

 

과적합의 진단/해결

training set에서는 성능이 높으나, validation set에서는 성능이 낮을 경우,

overfitting 되었을 가능성이 높음 

 

-> 모형의 복잡도(은닉층 개수, filter 수 등)/용량을 낮추는 방향으로 구조/hyperparameter를 조절

 

training set에서도 성능이 낮을 경우 

-> underfitting이 되었을 가능성이 높음 

-> 모형의 복잡도/용량을 높이는 방향으로 구조/하이퍼파라미터를 조정

 

Bayes Error

오차 0% 다양한 이유로 실현 불가능

ex. 테스트 이미지의 label의 오류 등

 

데이터로부터 도달할 수 있는 이론적 최소 오차

Bayes error를 실제로 추정하기는 불가능

보통 사람의 오차를 베이즈 오차 대용으로 사용

 

 

Hyperparameter types

    신경망의 구조
        . 은닉층의 수
        . 각 층의 폭
        . 활성화 함수 

 

    학습 및 최적화
        . 학습률 
        . 배치의 크기
        . 최적화 알고리즘
        . 에포크 수
        . 학습 중단 방식

 

    정규화
        드롭아웃 

 

 

Hyperparameter tuning

Hyperparameter: 모형의 성격이나 학습 방법과 관련된 설정

 

학습률, 은닉층의 수, 은닉층의 크기 등

데이터로부터 학습될 수 없고 시행착오를 통해 튜닝

 

보통 1, 2,3, .. 으로 증가하지 않고, 

1, 10, 100, ...등으로 크게 증가

 

 

격자 탐색 (grid search)

Hyperparameter가 여러 종류일 경우

각 parametrer의 설정값을 정하고, 이들을 조합하여 하나씩 시도

          |
    학습률 | *   *   * 
          |
          | *   *   * 
          |
          +-------------- 은닉층 크기

위와 같은 조합은 충분히 다양한 학습 시도가 힘듦

래서 사실은 무작위로 조합하여 하나씩 시도

          |          *
    학습률 |  *    
          |      *
          |   *    * 
          | *         
          +-------------- 은닉층 크기

두 개의 param의 값이 다르기에 더 많은 경우를 cover할 수 있음

 

무작위 탐색이 더 나은 이유

모형의 성능은 특정한 hyperparameter에 좌우

무작위 탐색이 각각의 hyperparametr를 더 다양하고 촘촘하게 탐색

 

              |
        학습률 > *   *   * 
              |
              | *   *   * 
              | ^   ^   ^
              +-|---|---|---- 은닉층 크기

              >          *
        학습률 >  *    
              >      *
              >   *    * 
              > *         
              +-^^^--^-^-^--- 은닉층 크기

 

Sequential Model-based Optimization

hyperparameter와 성능의 관계를 모형화

-> 즉, 실제로 hyperparam 변경하여 돌려보지 않아도 예측치를 알 수 있음

 

모델이 2개

실제 학습 시킬 모델

모델에 설정값 (HP)과 모델의 성능에 대한 모델

 

문제

본 모델은 많은 데이터를 가지고 학습

델 검증 모델은 본 모델의 결과를 가지고 학습하기에 학습이 낮음

그래서 모델 검증 모델은 보통 DNN을 사용하지 않음

 

모형을 바탕으로 최적의 hyperparameter를 선택하여 학습

학습 결과를 바탕으로 모형을 수정의 과정을 반복

 

설정값 ----> 본모형(model) 

학습 결과를 가지고 별도의 '모델'을 학습 

이는 data량이 많지 않기에, DNN을 사용하지 않음

 

 

MAB 방식

Multi Armed Band

카지노의 slot machine들

잘 되는지 안 되는지 확인하려면, 실제로 카지노 암을 땡겨 봐야 알 수 있음

 

여러 모델이 있을 시,

어느 모델을 학습 시킬 것이냐 (다 돌릴 돈이 없을 시)

 

잘 될거 같은 모델을 선택해서 학습을 몰빵하겠다는 것

 

 

Hyper parameter tuning

 

Keras-tuner

여러 학습 방식을 알아서 적용하고 학습하는 tool

 

pip install -U keras-tuner

-q: 화면에 출력되는 것 제거

-U: 기존 설치된 경우 upgrade

 

import kerastuner as kt

import kerastuner as kt
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten
from tensorflow.keras.layers import Dropout


mnist = tf.keras.datasets.mnist  # Keras Handwriting image
(x_train, y_train), (x_test, y_test) = mnist.load_data()


model = tf.keras.Sequential()
model.add(Flatten(input_shape=(28, 28)))  # to use 'Dense' Layer
model.add(Dense(16, activation='relu'))
model.add(Dense(10, activation='softmax'))


model.summary()

    Model: "sequential_2"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    flatten (Flatten)            (None, 784)               0         
    _________________________________________________________________
    dense (Dense)                (None, 16)                12560     
    _________________________________________________________________
    dense_1 (Dense)              (None, 10)                170       
    =================================================================
    Total params: 12,730
    Trainable params: 12,730
    Non-trainable params: 0


loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

model.compile(optimizer='adam',
    loss=loss_fn,
    metrics=['accuracy'])

model.fit(x_train, y_train, epochs=1)


tf.nn.softmax(model(x_test[0:1]))
model.weights
model.weights[0].shape
def build_model(hp):
    units la= hp.Int('units', min_value=32, max_value=512, step=32)
    model = tf.keras.Sequential()
    model.add(Flatten(input_shape=(28, 28)))  # to use 'Dense' Layer
    model.add(Dense(units=units, activation='relu'))
    model.add(Dense(10, activation='softmax'))

    # learning rate
    learning_raet = hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])
    optim_fn = tf.keras.optimizers.Adam(learning_rate=learning_rate)

    model.compile(optimizer=optim_fn, 
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy'])

    return model
반응형

'AI > Deep learning' 카테고리의 다른 글

텐서(Tensor)  (0) 2021.08.16
data partitioning, hyper-parameter tuning  (0) 2021.08.16
Back-propagation (역전파)  (0) 2021.08.16
딥러닝 성능 향상  (0) 2021.08.16
Activation functions  (0) 2021.08.16