과적합 (Over-fitting)
과적합은 훈련 데이터를 과하게 학습해서 발생합니다.
일반적으로 훈련 데이터는 실제 데이터의 일부분입니다
(딥러닝은 훈련 데이터를 통해 학습을 진행하고 검증 데이터를 통해 모델을 평가합니다)
훈련 데이터를 과하게 학습했기 때문에 예측 값과 실제 값 차이인 오차가 감소하지만, 검증 데이터에 대해서는 오차가 증가합니다. 이러한 관점에서 과적합은 훈련 데이터에 대해 과하게 학습하여 실제 데이터에 대한 오차가 증가하는 현상을 의미합니다.
그러면 과적합은 데이터를 완벽하게 학습한거 아니냐? 즉, 모델 성능을 최대치로 만든 것 아니냐?
라고 하실 수 있지만... 아무리 훈련 데이터라고 해도 현실 세계의 정확한 정보를 완벽하게 수집하지 못 할 뿐더러, 훈련 데이터에 포함된 노이즈(이상치) 까지 학습할 가능성이 있습니다. 이로 인해 잘못된 정보를 학습할 수도 있고, 새로 들어온 데이터에 대한 일반화 능력이 극히 떨어지게 돼어, 현실 세계의 다양한 상황과 변화에 대응할 수 없습니다.
그렇다면 이러한 과적합을 방지하기 위한 방법을 알아보겠습니다.
조기 종료 (Early stopping)
조기 종료는 모델이 과적합 되기 전에 훈련을 종료시키는 가장 일차원 적인 방법입니다.
단순히 훈련 데이터의 정확도가 매우 높으면 종료시키는 것이 아니라,
일정 에포크(epoch) 동안 검증 데이터의 성능이 향상되지 않으면 훈련을 종료합니다.
EarlyStopping
from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)
model.fit(X_train, y_train, epochs=100, validation_data=(X_val, y_val), callbacks=[early_stopping])
- monitor : 조기 종료를 결정할 성능 지표를 나타냅니다.
- patience : 특정 에포크 동안 성능이 향상되지 않으면 훈련을 중단합니다.
- restore_best_weights : 최적의 가중치로 복원하여 과적합을 방지합니다.
드롭 아웃 (Dropout)
드롭 아웃은 정규화 방법중에 하나로 훈련중에 무작위로 선택된 일부 뉴런을 비활성화 시킴으로써 신경망의 복잡성을 줄여줍니다.
모델이 특정 뉴런에 지나치게 의존하지 않고 여러 경로로 학습할 수 있어, 과적합을 방지하고 모델의 일반화 능력을 향상시킬 수 있습니다.
dropout
from tensorflow.keras.layers import Dense, Dropout
model = Sequential([
Dense(32, activation='relu', input_shape=(X_train.shape[1], )),
Dropout(0.5), # 드롭아웃 비율은 0.5로 설정 (조절 가능)
Dense(16, activation='relu'),
Dense(1, activation='sigmoid')
])
Dropout(0.5) : 드롭아웃 비율을 0.5로 설정하였습니다. 이는 각 훈련 배치에서 50%의 뉴런을 무작위로 비활성화합니다. 드롭아웃 비율은 사용자가 조절할 수 있습니다.
정규화 & 정칙화 (Regularization)
정규화(혹은 정칙화)는 가중치를 조절하여 모델이 훈련 데이터에 지나치게 적합되는 것을 방지합니다.
L1 정규화 ( Lasso Regularization )
L1 정규화는 손실 함수에 모든 가중치의 절대값의 합에 비례하는 항을 추가하여 가중치를 제한합니다.
L1 정규화의 핵심 아이디어는 손실 함수에 가중치의 절대값의 합을 추가하는 것입니다.
이를 통해 모델이 불필요한 특성에 대응하는 가중치를 0으로 유도됩니다.
따라서 특성 선택의 효과를 가지며, 중요하지 않은 특성들에 대한 가중치를 제거하거나 감소시킵니다.
위 수식과 같이 기존 손실함수에 λ(정규화 강도)가 적용된
∑i=1n∣wi∣ (각 가중치의 절대값의 합) 을 더합니다.
이렇게 얻은 J(θ) , 즉 새로운 손실함수를 다음 학습 때 적용합니다.
( J(θ)는 L1 정규화를 적용한 층에만 사용됩니다 )
from tensorflow.keras.regularizers import l1
model = Sequential([
Dense(32, activation='relu', input_shape=(input_dim,), kernel_regularizer=l1(0.01)),
Dense(16, activation='relu', kernel_regularizer=l1(0.01)), # kernel_regularizer로 L1 규제 추가
Dense(output_dim, activation='softmax')
])
L2 정규화 (Ridge Regularization)
L2 정규화는 L1 정규화와 다르게 손실 함수에 가중치의 제곱의 합을 추가합니다.
이를 통해 모델이 각 가중치를 작게 유지하거나 0으로 수렴하도록 유도됩니다.
from tensorflow.keras.regularizers import l2
model = Sequential([
Dense(32, activation='relu', input_shape=(input_dim,), kernel_regularizer=l2(0.01)),
Dense(16, activation='relu', kernel_regularizer=l2(0.01)), # kernel_regularizer로 L2 규제 추가
Dense(output_dim, activation='softmax')
])
L1 정규화는 희소성과 특성 선택의 측면에서 유용하며, L2 정규화는 모델의 일반화 성능을 향상시키는 데 도움 됩니다.
'인공지능 > 딥러닝' 카테고리의 다른 글
[딥러닝] 잔차 학습 (residual learning) - ResNet (4) | 2024.02.10 |
---|---|
[딥러닝] 이론 - 기울기 소멸 (활성화 함수) (0) | 2024.02.03 |
[딥러닝] 이론(2) (0) | 2024.01.19 |
[딥러닝] 이론(1) (0) | 2023.03.16 |