Data Analysis & ML/Deep Learning

[Deep Learning][딥러닝] DNN 성능개선

YSY^ 2020. 11. 9. 18:01

Deep Neural Networks 모델 성능 개선

과대적합과(Overfitting) 과소적합(underfitting)

  • 최적화(Optimization)와 일반화(generalization)
    • 최적화(Optimization): train data에서 최고의 성능을 얻으려고 모델을 조정하는 과정 (옵티마이저가 한다.)
    • 일반화(Generalization): 훈련된 모델이 처음 보는 데이터에서 얼마나 잘 수행되는지를 의미
  • 과소적합(Underfitting)의 발생
    • epoch가 진행될 수록 train loss와 test loss(validation loss)가 모두 안 좋음
      • 핵심 : train loss도 안좋고 test loss도 안 좋다.
      • 모델이 너무 단순하면 train loss가 줄어들 지 않는다. 그런 경우 좀더 복잡한 모델을 사용하거나 튜닝 필요
    • 모델의 성능이 발전될 여지가 있음 (optimization을 더 할 여지가 있음)
  • 과대적합(Overfitting)의 발생
    • epoch가 진행되면서 train loss는 계속 감소하지만(좋아짐) test loss(validation loss)가 증가(안 좋아짐)하기 시작함
      • 핵심 : test loss가 않좋다 (새로운 데이터에 대한 예측이 안 좋다.) 일반화(generalization)되지 않은 모델
      • 모델이 너무 복잡하면 발생한다. 좀더 단순한 모델을 사용하는 것을 생각해 봐야 한다.
    • 훈련 데이터에 특화된 패턴을 학습하기 시작하여 새로운 데이터에 대해 잘못된 판단 함

  • 딥러닝에서 사용하는 모델은 대부분 복잡한 모델이기 때문에 과대적합이 발생하는 경우가 많다.

 

과대적합(Overfitting)을 방지하기 위한 방법

  • 더 많은 data를 수집
    • 모델이 복잡해도 학습 시킬 데이터가 충분히 많으면 괜찮다.
    • 일반적으로 데이터를 늘리는데는 시간과 돈이 많이 든다. 단 이미지의 경우 크기를 줄인다거나 회전등을 이용해 데이터를 어느정도 늘릴 수 있다.
  • 모델의 간단하게 만든다.
    • 대부분 경우 데이터 수집이 쉽지가 않다. 그런 경우 모델을 간단하게 바꾼다.

과대적합을 방지하기 위한 규제 방식은 모두 모델을 간단하게 만드는 방법들이다.

 

DNN 모델 간단하게 만들기

Network size를 줄인다.

  • 모델의 크기를 줄여 학습 파라미터(가중치) 수를 줄임

  • Layer의 수, 각 layer의 unit 수를 조정

  • 적은 수의 layer, unit에서 시작해서 증가시켜 가면서 validation loss의 감소 추세를 관찰

  • Smaller model

    • training loss 감소 속도는 더 느림
    • overfitting이 발생할 여지가 적음
    • 충분히 train loss가 감소하지 않을 수 있음 (즉, optimization이 덜 됨)
    • validation loss가 최소화 될 때까지 걸리는 시간이 오래 걸림
  • Bigger model

    • validation loss가 초기부터 증가 추세: overfitting 발생
    • Bigger model의 train loss는 빠르게 감소
    • train data에 대해 optimization이 잘 되지만 validation set에 대해 성능이 좋지 않음
  • 어떻게 최적의 네트워크를 찾는가?

    • 작은 크기의 모형에서부터 시작
    • 네트워크 크기를 증가시키면서 (layer의 수, 각 layer의 unit의 수 증가) train loss가 충분히 감소하는지, validation loss가 증가하는지 체크
import numpy as np
import tensorflow as tf
import tensorflow.keras as keras

(X_train, y_train), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()
X_train.shape, y_train.shape # ((60000, 28, 28), (60000,))
# 기본 하이퍼파라미터 지정.
learning_rate = 0.001 #optimizer에 지정할 학습율.
N_EPOCHS = 20 #epoch수 - 전체 데이터셋을 몇번 반복해서 학습할 지.
N_BATCH = 32  #batch_size 지정. - 파라미터를 데이터 몇개당 할 것인지. (mini-batch size)
N_CLASS = 10
N_TRAIN = X_train.shape[0]
N_TEST = X_test.shape[0]

X_train = X_train/255
X_test = X_test/255

y_train = keras.utils.to_categorical(train_labels, N_CLASS)
y_test = keras.utils.to_categorical(test_labels, N_CLASS)

train_dataset = tf.data.Dataset.from_tensor_slices((X_train,y_train))\
                        .shuffle(100000).batch(N_BATCH, drop_remainder=True).repeat()
test_dataset = tf.data.Dataset.from_tensor_slices((X_test,y_test)).batch(N_BATCH)
def create_model():
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=(28,28)))
    model.add(keras.layers.Dense(32,activation='relu'))
    model.add(keras.layers.Dense(32,activation='relu'))
    #출력
    model.add(keras.layers.Dense(N_CLASS, activation='softmax'))
    return model

model = create_model()
model.compile(optimizer = keras.optimizers.Adam(learning_rate), loss="categorical_crossentropy")

model.summary()

 

steps_per_epoch = N_TRAIN // N_BATCH #한 에폭당 몇 step
validation_steps = int(np.ceil(N_TEST/N_BATCH)) #자투리가 나왔을때


# 학습
history = model.fit(train_dataset,    #학습 데이터셋
                    epochs=N_EPOCHS,
                    steps_per_epoch=steps_per_epoch,
                    validation_data = test_dataset, #검증 데이터셋
                    validation_steps=validation_steps)

 

Dropout Layer 추가를 통한 Overfitting 규제

  • Neural network를 위해 사용되는 regularization 기법 중에서 가장 효과적이고 널리 사용되는 방법 중 하나
    • Overfitting의 이유는 너무 복잡한 모델.
    • 데이터 양에 비해 Layer, Unit(노드)가 많으면 복잡한 모델(Network)이다.
  • Dropout Node: 학습시(fit) 일부 Unit(노드)를 빼고 진행한다.
  • 매 반복(epochs) 마다 Random하게 선택된 Unit(노드)를 training 진행
    • 앙상블의 효과도 있다.
  • 일반적으로 dropout rate=0.2~0.5 를 지정한다.
  • Test set에 대해서는 적용하지 않음

 

Batch Normalization (배치정규화)

  • 각 Layer 에서 출력된 값을 평균=0, 표준편차=1로 정규화 하여 각 Layer의 입력분포를 균일하게 만들어 준다.

  • 일반적으로 활성함수 이전에 먼저 해준다.

효과

  • 랜덤하게 생성되는 초기 가중치에 대한 영향력을 줄일 수있다.
  • 학습하는 동안 과대적합에 대한 규제의 효과를 준다.
  • Gradient Vanishing, Gradient exploding을 막아준다.
def create_model():
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=(28,28)))

    model.add(keras.layers.Dense(256))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Relu())

    model.add(keras.layers.Dense(128))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Relu())

    model.add(keras.layers.Dense(128))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Relu())

    #output
    model.add(keras.layers.Dense(N_CLASS))
    model.add(keras.layers.BatchNormalization())
    model.add(keras.layers.Softmax())

    return model

Learning Rate Decay (학습율 조절)을 통한 성능향상

  • Optimizer의 Learning rate이 너무 크면 수렴을 못할 가능성이 있고 너무 작으면 Local minima에서 못빠져 나와 수렴을 못할 수 있다.

  • 학습율을 처음에는 크게 움직이다가 일정 조건이 되면 learning rate을 낮춰서 점점 작게 움직이는 방법

    • 몇 에폭마다 일정량만큼 학습 속도를 줄인다. 전형적으로는 5 에폭마다 반으로 줄이거나 20 에폭마다 1/10씩 줄이기도 한다.(튜닝대상)
    • 보통 고정된 학습 속도로 검증오차(validation error)를 살펴보다가, 검증오차가 개선되지 않을 때마다 학습 속도를 감소시키는 방법을 택한다.
learning_rate_scheduler = keras.optimizers.schedules.ExponentialDecay(
                            initial_learning_rate = learning_rate,
                            decay_steps = steps_per_epochs*10)

Hyper parameter tuning

  • Parameters

    • 모델이 학습하여 업데이트할 대상
      • Weights W
      • Bias b
  • Hyper parameters

    • 모형의 구조를 결정하거나 optimization 방법을 결정하는 변수들
    • W, b를 최종적으로 결정
      • Optimizer의 종류
      • learning rate($\alpha$)
      • Hidden layer의 수
      • Hidden unit의 수
      • Iteration의 수
      • Activation function의 종류
      • Minibatch size
      • Regularization
        • drop out등
  • 다양한 조합의 hyper parameter를 시도해서 loss 함수가 빠르게 감소하는 hyper parameter를 찾아내는 시도가 필요

728x90
반응형