모델의 복잡도와 과적합

모델의 복잡도

  • 너무 단순한 모델 : train, val 성능이 떨어짐
  • 적절히 복잡한 모델 : 적절한 예측력
  • 너무 복잡한 모델 : train 성능 높고, val 성능 떨어짐

과적합을 해결하기 위해서 여러 요소를 조절해야 됨

  • Epoch와 learning_rate
  • 모델 구조 : hidden layer 수, node 수
  • 미리 멈춤 Early Stopping
  • 임의 연결 끊기 Dropout
  • 가중치 규제하기 Regularization(L1, L2)

 

Early Stopping

반복 횟수(epoch)가 많으면 과적합 될 수 있음

  • 항상 과적합이 발생되는 것 X
  • 반복횟수가 증가할 수록 val error가 줄어들다가 어느 순간부터 다시 증가할 수 있음.
  • val error가 더 이상 줄지 않으면 멈춰라 ➔ Early Stopping
  • 일반적으로 train error는 계속 줄어듦

EarlyStopping 옵션

  • monitor : 기본값 val_loss
  • min_delta : 오차(loss)의 최소값에서 변화량(줄어드는 량)이 몇 이상 되어야 하는지 지정. (기본값 0)
  • patience : 오차가 줄어들지 않는 상황을 몇 번(epoch) 기다려줄 건지 지정. (기본값 0) ✓
    • from keras.callbacks import EarlyStopping
    • es = EarlyStopping(monitor = 'val_loss', min_delta = 0, patience = 0)
  • fit 안에 지정
  •  callbacks : epoch 단위로 학습이 진행되는 동안, 중간에 개입할 task 지정 
    • model.fit(x_train, y_train, epochs = 100, validation_split = .2, callbacks = [es])
from keras.callbacks import EarlyStopping

# 모델 선언
clear_session()

model2 = Sequential( [Input(shape = (nfeatures,)),
                      Dense(128, activation= 'relu'),
                      Dense(64, activation= 'relu'),
                      Dense(32, activation= 'relu'),
                      Dense(1, activation= 'sigmoid')] )
model2.compile(optimizer= Adam(learning_rate = 0.001), loss='binary_crossentropy')

# EarlyStopping 설정 ------------
min_de = 0.0005
pat = 7

es = EarlyStopping(monitor = 'val_loss', min_delta = min_de, patience = pat)

# 학습
hist = model2.fit(x_train, y_train, epochs = 100, validation_split=0.2,
                  callbacks = [es]).history

Dropout - 연결을 임의로 끊기 

Dropout

  • 과적합을 줄이기 위해 사용되는 규제(regularization) 기법 중 하나
  • 학습시, 신경망의 일부 뉴런을 임의로 비활성화 ➔ 모델을 강제로 일반화

학습 시 적용 절차

  • 훈련 배치에서 랜덤하게 선택된 일부 뉴런을 제거
  • 제거된 뉴런은 해당 배치에 대한 순전파 및 역전파 과정에서 비활성화
  • 이를 통해 뉴런들 간의 복잡한 의존성을 줄여 줌
  • 매 epochs 마다 다른 부분 집합의 뉴런을 비활성화 ➔ 앙상블 효과

 

Dropout Rate 옵션

  • Hidden Layer 다음에 Dropout Layer 추가
  • Import : from keras.layers import Dropout
  • ex) Dropout(0.4) : hidden layer의 노드 중 40%를 임의로 제외시킴. 
  • 보통 0.2 ~ 0.5 사이의 범위 지정
  • 조절하면서 찾아야 하는 하이퍼파라미터!
  • Feature가 적을 경우 rate를 낮추고, 많을 경우는 rate를 높이는 시도
from keras.layers import Dropout

# input_shape : feature 수 도출
nfeatures = x_train.shape[1]

# 메모리 정리
clear_session()

# Sequential 타입
model3 = Sequential( [Input(shape = (nfeatures,)),
                      Dense(128, activation= 'relu'),
                      Dropout(0.4),
                      Dense(64, activation= 'relu'),
                      Dropout(0.4),
                      Dense(32, activation= 'relu'),
                      Dropout(0.4),
                      Dense(1, activation= 'sigmoid')] )

# 컴파일
model3.compile(optimizer= Adam(learning_rate = 0.001), loss='binary_crossentropy')

# 학습
hist = model3.fit(x_train, y_train, epochs = 50, validation_split=0.2, verbose = 0).history

성능관리 요약

데이터

  • 입력 데이터 정제, 적절한 전처리
  • 데이터 늘리기 : 열(적절한 feature 추가), 행(데이터 건수 늘리기) 

모델 구조

  • 은닉층, 노드 수 늘리기 : 성능이 증가할 때 까지 
  • activation 

학습

  • epochs, learning_rate, optimizer  

과적합 문제

  • 모델링 목적 : 모집단 전체에서 두루 잘 맞추는 (적당한) 모델 만들기
  • 과적합 : 학습 데이터에서만 높은 성능, 다른 데이터에서는 낮은 성능

과적합 문제 해결

  • 데이터 건수 늘리기
  • 모델 복잡도 조절하기 ➔ 가중치 규제(Regularization)
  • 반복 학습 횟수(epochs) 적당히 ➔ early stopping

모델 저장하기

  • 최종 모델 저장
  • 체크포인트에서 모델 저장
  • 성능이 개선되면 저장하기 가능.

+ Recent posts