상위 목록: 하위 목록: 작성 날짜: 읽는 데 38 분 소요

일반화(Generalization)

모델을 학습시키는 목적은 훈련 데이터의 정답을 맞히는 데 있지 않고, 한 번도 보지 못한 새로운 데이터에 대해 올바른 예측을 내놓는 데 있습니다. 이처럼 학습에 사용하지 않은 데이터까지 잘 처리하는 능력을 일반화(Generalization)라 하며, 모델의 성능은 결국 이 일반화 성능으로 평가됩니다.

앞선 강좌에서 다룬 순전파(Forward Propagation)와 역전파(Back Propagation)는 훈련 데이터의 오차를 줄이는 과정입니다. 그러나 오차를 끝까지 줄이는 것이 언제나 좋은 결과로 이어지지는 않습니다. 훈련 데이터의 오차가 0에 가까워질수록 모델이 데이터에 담긴 규칙이 아니라 데이터 자체를 외우는 방향으로 학습될 수 있기 때문입니다.



과대적합과 과소적합

과대적합(Overfitting)은 모델이 훈련 데이터에 지나치게 맞춰져, 훈련 데이터에서는 높은 성능을 보이지만 새로운 데이터에서는 성능이 크게 떨어지는 현상입니다. 모델이 데이터에 포함된 잡음이나 우연한 패턴까지 규칙으로 받아들였기 때문에 발생하며, 주로 모델의 표현력에 비해 데이터가 부족할 때 나타납니다.

과소적합(Underfitting)은 그 반대로, 모델이 데이터의 규칙조차 제대로 학습하지 못한 상태를 의미합니다. 훈련 데이터와 새로운 데이터 모두에서 성능이 낮게 나타나며, 모델의 표현력이 부족하거나 학습을 충분히 진행하지 않았을 때 발생합니다.

두 현상은 편향(Bias)과 분산(Variance)으로도 설명할 수 있습니다. 편향은 모델의 예측이 정답에서 체계적으로 벗어난 정도를 뜻하며, 분산은 훈련 데이터가 조금만 달라져도 예측이 크게 흔들리는 정도를 뜻합니다. 과소적합은 편향이 높은 상태이고, 과대적합은 분산이 높은 상태입니다.

모델을 복잡하게 만들수록 편향은 줄어들지만 분산은 커지고, 단순하게 만들수록 그 반대가 됩니다. 두 값을 동시에 낮출 수는 없으므로 적절한 균형점을 찾아야 하며, 이를 편향-분산 상충 관계(Bias-Variance Tradeoff)라 합니다.



학습 곡선(Learning Curve)

과대적합이 발생하고 있는지는 학습 곡선(Learning Curve)으로 확인합니다. 훈련 데이터의 오차와 검증 데이터의 오차를 에폭(Epoch)마다 함께 기록해 그리면, 두 곡선이 어떻게 벌어지는지로 모델의 상태를 판단할 수 있습니다.

학습 초반에는 두 오차가 함께 감소합니다. 그러나 어느 시점부터는 훈련 오차가 계속 줄어드는 반면 검증 오차는 더 이상 줄지 않고 오히려 증가하기 시작합니다. 위 그래프에서 두 곡선이 갈라지는 지점이 과대적합이 시작되는 구간이며, 이 지점 이후의 학습은 일반화 성능을 떨어뜨립니다.

반대로 두 오차가 모두 높은 수준에서 더 이상 내려가지 않는다면 과소적합입니다. 이 경우에는 정칙화를 적용할 것이 아니라 모델의 표현력을 키우거나, 학습을 더 진행하거나, 더 나은 특성을 제공해야 합니다.

  • Tip : 과대적합 여부는 반드시 학습에 사용하지 않은 데이터로 판단해야 합니다. 훈련 데이터의 오차만 관찰하면 모델이 데이터를 외우고 있는 상황을 알아차릴 수 없습니다.



데이터 세트 분리

일반화 성능을 측정하려면 가지고 있는 데이터를 용도에 따라 나눠야 합니다. 일반적으로 훈련 데이터(Training Data), 검증 데이터(Validation Data), 시험 데이터(Test Data)의 세 가지로 분리하며, 6:2:2 또는 8:1:1 등의 비율을 사용합니다.

훈련 데이터는 가중치를 갱신하는 데 사용하고, 검증 데이터는 학습 도중 모델의 상태를 점검하거나 하이퍼파라미터(Hyperparameter)를 조정하는 데 사용합니다. 시험 데이터는 모든 학습과 조정이 끝난 뒤 단 한 번만 사용해 최종 성능을 측정합니다.

검증 데이터와 시험 데이터를 구분하는 이유는, 검증 데이터를 보며 모델을 반복해서 수정하다 보면 검증 데이터에도 간접적으로 과대적합되기 때문입니다. 이렇게 되면 검증 성능이 더 이상 일반화 성능을 대변하지 못하므로, 마지막 판단을 위한 데이터를 따로 남겨 두어야 합니다.

데이터의 양이 적어 세 가지로 나누기 어렵다면 교차 검증(Cross Validation)을 사용합니다. 데이터를 \(k\)개의 묶음으로 나눈 뒤 하나씩 돌아가며 검증 데이터로 사용하고 나머지로 학습하는 과정을 \(k\)번 반복해, 그 평균으로 성능을 판단하는 방법입니다.



정칙화(Regularization)

정칙화(Regularization)란 모델의 자유도를 의도적으로 제한해 과대적합을 완화하는 기법의 총칭입니다. 훈련 오차를 조금 손해 보더라도 검증 오차를 낮추는 것이 목적이므로, 훈련 성능과 일반화 성능을 맞바꾸는 장치로 이해할 수 있습니다.

정칙화는 과대적합이 실제로 발생하고 있을 때만 의미가 있습니다. 과소적합 상태에서 정칙화를 강하게 적용하면 이미 부족한 표현력을 더 제한하게 되므로, 학습 곡선을 먼저 확인한 뒤에 적용해야 합니다.


L2 정칙화(Ridge)

\[\mathcal{L}_{total} = \mathcal{L} + \lambda \sum_{i=1}^{n} w_{i}^{2}\]


L2 정칙화(L2 Regularization)는 손실 함수에 가중치의 제곱 합을 더해, 가중치가 큰 값을 갖는 것 자체에 벌점을 부여하는 방법입니다. 모델은 오차를 줄이면서 동시에 가중치를 작게 유지해야 하므로, 특정 입력에 과도하게 의존하지 않는 완만한 형태로 학습됩니다.

\(\lambda\)는 정칙화의 강도를 조절하는 하이퍼파라미터입니다. 값이 클수록 가중치가 더 강하게 억제되어 모델이 단순해지고, 0에 가까울수록 정칙화를 적용하지 않은 것과 같아집니다.

역전파 과정에서 이 항을 미분하면 가중치에 비례하는 값이 기울기에 더해지므로, 갱신할 때마다 가중치가 조금씩 0을 향해 줄어드는 효과가 나타납니다. 이러한 동작 때문에 가중치 감쇠(Weight Decay)라고도 부르며, 회귀 모델에 적용한 경우를 릿지 회귀(Ridge Regression)라 합니다.

  • Tip : PyTorch에서는 별도의 항을 직접 더하지 않고 optim.SGD(model.parameters(), lr=0.01, weight_decay=0.01)과 같이 최적화 함수의 weight_decay 인자로 적용합니다.


L1 정칙화(Lasso)

\[\mathcal{L}_{total} = \mathcal{L} + \lambda \sum_{i=1}^{n} \left| w_{i} \right|\]


L1 정칙화(L1 Regularization)는 제곱 대신 가중치의 절댓값 합을 더합니다. 두 방법 모두 가중치를 작게 만들지만, 미분값의 형태가 달라 결과에도 차이가 나타납니다.

L2는 가중치에 비례하는 값을 빼므로 가중치가 작아질수록 감소 폭도 함께 줄어들어 0에 가까워지되 0이 되지는 않습니다. 반면 L1은 가중치의 크기와 무관하게 일정한 값을 빼므로 일부 가중치가 정확히 0이 됩니다.

가중치가 0이 된 입력은 모델에서 사용되지 않는 것과 같으므로, L1 정칙화는 자연스럽게 특성 선택(Feature Selection)의 효과를 냅니다. 이러한 성질 때문에 입력 특성이 매우 많고 그중 일부만 유효할 것으로 예상되는 경우에 유용하며, 회귀 모델에 적용한 경우를 라쏘 회귀(Lasso Regression)라 합니다.


드롭아웃(Dropout)

\[Dropout(x) = \begin{cases} \ 0 & \text{if:} \ \text{mask} = 0 \\ \ \frac{x}{1-p} & \text{else:} \ \text{otherwise} \end{cases}\]


드롭아웃(Dropout)은 학습할 때마다 은닉층의 노드 중 일부를 확률 \(p\)로 무작위로 꺼 버리는 방법입니다. 매 반복마다 서로 다른 노드가 비활성화되므로, 모델은 특정 노드에 의존하지 않고 여러 경로로 정보를 전달하도록 학습됩니다.

노드가 무작위로 제거되면 매 학습 단계마다 구조가 조금씩 다른 신경망을 학습하는 것과 같습니다. 그러므로 여러 모델을 학습해 결과를 종합하는 앙상블(Ensemble)과 유사한 효과를 적은 비용으로 얻을 수 있습니다.

드롭아웃은 배치 정규화(Batch Normalization)와 마찬가지로 학습할 때와 추론할 때의 동작이 다릅니다. 추론 시에는 모든 노드를 사용해야 하므로 드롭아웃을 적용하지 않으며, 대신 학습 시에 살아남은 값을 \(1-p\)로 나눠 두어 전체 출력의 크기가 두 경우에 같도록 맞춥니다.

  • Tip : PyTorch에서 nn.Dropout(p=0.5)으로 적용하며, 추론 시 model.eval()을 호출하지 않으면 노드가 계속 무작위로 제거되어 실행할 때마다 결과가 달라집니다.


조기 종료(Early Stopping)

조기 종료(Early Stopping)는 검증 오차가 더 이상 줄어들지 않는 시점에 학습을 중단하는 방법입니다. 앞서 학습 곡선에서 확인한 것처럼 과대적합은 특정 시점 이후의 학습에서 발생하므로, 그 지점에서 멈추는 것만으로도 상당 부분을 예방할 수 있습니다.

검증 오차는 매 에폭 일정하게 감소하지 않고 오르내리므로, 한 번 증가했다고 즉시 중단하지는 않습니다. 일반적으로 개선이 없는 상태가 정해진 횟수만큼 이어질 때 학습을 종료하며, 이 횟수를 인내(Patience)라 합니다. 이때 중단 시점의 가중치가 아니라 검증 오차가 가장 낮았던 시점의 가중치를 저장해 사용합니다.


데이터 증강(Data Augmentation)

데이터 증강(Data Augmentation)은 모델을 제한하는 대신 데이터를 늘려 과대적합을 완화하는 방법입니다. 과대적합의 근본 원인이 모델의 표현력에 비해 데이터가 부족한 데 있으므로, 데이터를 확보할 수 있다면 가장 직접적인 해결책이 됩니다.

이미지 데이터라면 회전, 반전, 자르기, 밝기 조정 등을 적용해 원본과 다르지만 의미는 같은 데이터를 만들어냅니다. 텍스트 데이터라면 동의어 치환이나 역번역을, 음성 데이터라면 잡음 추가나 속도 변경을 사용합니다.

다만 증강은 레이블이 바뀌지 않는 범위 안에서 적용해야 합니다. 예를 들어 숫자 6을 180도 회전하면 9가 되므로, 필기체 숫자 인식에서 회전 증강을 과도하게 적용하면 오히려 잘못된 데이터를 학습하게 됩니다.



정칙화 기법 정리

기법 적용 대상 특징
L2 정칙화 손실 함수 가중치를 전반적으로 작게 유지
L1 정칙화 손실 함수 일부 가중치를 0으로 만들어 특성 선택
드롭아웃 신경망 구조 노드를 무작위로 제거해 앙상블 효과
조기 종료 학습 과정 검증 오차가 최소인 시점에서 중단
데이터 증강 데이터 데이터의 양과 다양성을 확보

정칙화 기법은 서로 배타적이지 않으므로 함께 사용할 수 있습니다. 실무에서는 데이터 증강으로 데이터를 확보한 뒤 가중치 감쇠와 드롭아웃을 적용하고, 조기 종료로 학습을 마무리하는 조합을 흔히 사용합니다.

다만 여러 기법을 동시에 강하게 적용하면 과소적합으로 넘어갈 수 있습니다. 그러므로 하나씩 추가하면서 학습 곡선의 변화를 확인하고, 검증 오차가 실제로 개선되는지를 기준으로 판단해야 합니다.

  • Tip : 배치 정규화(Batch Normalization)는 정칙화를 목적으로 만들어진 기법은 아니지만, 배치마다 통계량이 달라지며 잡음이 더해지므로 부수적으로 정칙화 효과를 냅니다.



  • Writer by : 윤대희

댓글 남기기