Colab으로 하루에 하나씩 딥러닝

성능 최적화_3.조기 종료를 통한 최적화 본문

딥러닝_개념

성능 최적화_3.조기 종료를 통한 최적화

Elleik 2023. 1. 26. 23:10
728x90

조기 종료(Early Stopping)

  • 뉴럴 네트워크가 과적합을 회피하는 규제 기법
  • 매 에포크마다 테스트 데이터셋에 대한 오차가 증가하는 시점에서 훈련을 멈추도록 조정
  • 종료 시점을 확인하기 위해 콜백(callback) 함수를 무조건 함께 사용

조기 종료 실습

### 라이브러리 호출

from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation
from tensorflow.keras.layers import Embedding
from tensorflow.keras.layers import Conv1D, GlobalMaxPooling1D
from tensorflow.keras.datasets import imdb
import tensorflow as tf
import numpy as np

### 하이퍼파라미터 초기화

max_features = 5000
maxlen = 400
batch_size = 32
embedding_dims = 50
filters = 250
kernel_size = 3
hidden_dims = 250
epochs = 300
np.random.seed(7)

### 체크포인트 설정

import os 
checkpoint_path = "training_1/cp.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path, verbose=1)	# 설명 1

상세 설명

  • 설명 1:  
    • 훈련하는 동안 체크포인트를 저장하기 위해 콜백 함수를 사용
    • 콜백 함수는 훈련 중간과 훈련 마지막에 체크포인트를 저장하는 데 많이 사용하는 방법
    • 다시 훈련하지 않고 모델을 재사용하거나 의도치 않게 훈련이 중지된 경우 이어서 훈련할 수 있음

### 데이터셋 메모리 로딩

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)

데이터셋 메모리 로딩 완료


### 모델 생성

model = Sequential()
model.add(Embedding(max_features,
                    embedding_dims,
                    input_length=maxlen)) # 설명 1
model.add(Dropout(0.2)) 
model.add(Conv1D(filters,
                 kernel_size,
                 padding='valid',
                 activation='relu',
                 strides=1))  # 설명 2
model.add(GlobalMaxPooling1D())
model.add(Dense(hidden_dims))
model.add(Dropout(0.2))
model.add(Activation('relu'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()

모델 훈련 결과

상세 설명

  • 설명 1:  
    • Embedding: 텍스트를 양의 정수로 변환해 주는 역할
      • max_features: 단어 사전의 크기
      • embedding_dims: 단어를 인코딩 후 나오는 벡터 크기
      • input_length=maxlen: 문장 길이
    • Conv1D: 문장 해석을 위해 합성곱층을 이용함
      • 글로벌 최대 풀링(GlobalMaxPooling1D): 합성곱층이 문장을 훑어 가면서 뽑아낸 특성 벡터 중 가장 큰 백터를 선택

### 조기 종료가 추가되지 않은 모델 훈련

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

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2,
          callbacks=[cp_callback])

모델 훈련 결과 일부분


### 모델 평가

from tensorflow.keras.models import load_model
model = load_model(checkpoint_path)
scores = model.evaluate(x_test, y_test, verbose=1)
print(f'Score: {model.metrics_names[0]} of {scores[0]}; {model.metrics_names[1]} of {scores[1]*100}%')

조기 종료를 적용하지 않은 모델 평가 결과


### 조기 종료를 적용한 모델 훈련

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint 
keras_callbacks=[
    EarlyStopping(monitor='val_loss', patience=30, mode='min', min_delta=0.0001),
    ModelCheckpoint(checkpoint_path, monitor='val_loss', save_best_only=True, mode='min')
] # 설명 1

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          validation_split=0.2,
          callbacks=keras_callbacks)

조기 종료 적용한 모델 결과(52 epoch에서 종료됨)

상세 설명

  • 설명 1:  
    • EarlyStopping: 해당 조건이 되면 학습을 조기 종료함
      • monitor: 관찰하고자 하는 항목. ex) val_loss, val_acc
      • patience: 개선이 없다고 바로 종료하지 않고 개선이 없는 에포크를 얼마나 기다려 줄지 지정
      • mode: 관찰 항목에 대한 개선이 없다고 판단하기 위한 기준을 지정
      • min_delta: 개선되고 있다 판단하기 위한 최소 변화량

### 모델 평가

model = load_model(checkpoint_path)
scores = model.evaluate(x_test, y_test, verbose=1)
print(f'Score: {model.metrics_names[0]} of {scores[0]}; {model.metrics_names[1]} of {scores[1]*100}%')

모델 평가 결과

상세 설명

  • 설명 1:  
    • 체크포인트를 이용한 정확도를 확인하였지만 조기 종료는 성능 최적화를 보장하지 않음
    • 조기 종료는 훈련 횟수를 줄여 훈련의 종료 시점을 알 수 있게 함

 

참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)