모델의 복잡도와 과적합
모델의 복잡도
- 너무 단순한 모델 : 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
모델 저장하기
- 최종 모델 저장
- 체크포인트에서 모델 저장
- 성능이 개선되면 저장하기 가능.
'<프로그래밍> > [python]' 카테고리의 다른 글
[python] 딥러닝 Function API / 시계열 데이터 (0) | 2024.10.15 |
---|---|
[python] 딥러닝 기초 (0) | 2024.10.10 |
[python] 머신러닝의 기초3 (0) | 2024.09.30 |
[python] 머신러닝의 기초2 (1) | 2024.09.27 |
[python] 머신러닝의 기초 (0) | 2024.09.26 |