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을 더 할 여지가 있음)
- epoch가 진행될 수록 train loss와 test loss(validation loss)가 모두 안 좋음
- 과대적합(Overfitting)의 발생
- epoch가 진행되면서 train loss는 계속 감소하지만(좋아짐) test loss(validation loss)가 증가(안 좋아짐)하기 시작함
- 핵심 : test loss가 않좋다 (새로운 데이터에 대한 예측이 안 좋다.) 일반화(generalization)되지 않은 모델
- 모델이 너무 복잡하면 발생한다. 좀더 단순한 모델을 사용하는 것을 생각해 봐야 한다.
- 훈련 데이터에 특화된 패턴을 학습하기 시작하여 새로운 데이터에 대해 잘못된 판단 함
- epoch가 진행되면서 train loss는 계속 감소하지만(좋아짐) test loss(validation loss)가 증가(안 좋아짐)하기 시작함
- 딥러닝에서 사용하는 모델은 대부분 복잡한 모델이기 때문에 과대적합이 발생하는 경우가 많다.
과대적합(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
반응형
'Data Analysis & ML > Deep Learning' 카테고리의 다른 글
[Deep Learning][딥러닝] CNN_MNIST분류 / 모델저장/ FunctionalAPI (0) | 2020.11.09 |
---|---|
[Deep Learning][딥러닝] CNN 개요 (0) | 2020.11.09 |
[Deep Learning] DNN 분류 (DNN Classification) (0) | 2020.09.23 |
[Deep Learning] DNN 회귀분석 (Tensorflow Dataset) (0) | 2020.09.23 |
[Deep Learning] DNN (Deep Neural Network) (0) | 2020.09.22 |