가중치 규제(Regularization)
과대적합(overfitting)과 과소적합(underfitting)을 다룬 포스팅(https://psleon.tistory.com/116)에서 이를 해결하는 방법으로 가중치를 제한하거나 가중치 규제를 완화하는 방식으로 해결할 수 있다고 하며 '가중치 규제(regularization)'를 소개했다.
그렇다면 가중치 규제가 무엇일까?
가중치 규제란 가중치(weights)의 값이 너무 커지지 않도록 제한하는 기법이다. 가중치(w)가 너무 큰 값을 가지게 되면 아래의 사진과 같이 과하게 복잡한 모델이 만들어지는데 이러한 경우 과대적합(overfitting)이 발생한다.
따라서 가중치를 규제하면 모델의 일반화 성능이 올라간다.
참고로 모델의 일반화에 관한 내용을 바로 아래 자세히 설명한다. 그러니 이해가 잘되지 않더라도 이어서 읽어나가자.
위의 그래프를 보자. (a)는 가중치 규제를 없이 생성한 모델이고, (b)는 가중치 규제를 적용한 모델이다.
두 그래프 모두 데이터를 적절하게 fit하고 있다. 그렇다면 둘 중 어떤 모델이 더 성능이 좋을까? 대개 (a)처럼 경사가 급한 그래프보다는 (b)처럼 경사가 완만한 그래프가 원으로 표현한 샘플 데이터(data)를 더 잘 표현하기 때문에 성능이 더 좋다고 평가한다.
그렇다면 다른 관점에서 한번 살펴보자. 샘플 데이터에 딱 맞는 그래프를 가지면 항상 좋은 성능을 가졌다고 할 수 있을까?
위 그래프를 보면 과하게 training을 하여 모델의 복잡도가 올라가면 모델이 샘플 데이터에 너무 집착한 나머지 새로운 데이터에 적응하지 못하므로 정확도가 떨어진다. 이 경우 좋은 성능을 가졌다고 할 수 없으며 이것을 '모델이 일반화되지 않았다'라고 말한다. 이럴 때 규제를 사용하여 가중치를 제한하면 일반화 성능을 높일 수 있으며 대표적인 규제 기법으로는 L1 규제와 L2 규제가 있다.
* L1 노름과 L2 노름에 관한 포스팅은 https://psleon.tistory.com/40 이 포스팅에서 소개하고 있다.
1. L1 규제(L1 Regularization)
L1 규제는 손실 함수(loss function)에 가중치(w)의 절댓값인 L1 노름(l1 norm)을 추가하며 아래와 같이 정의된다.
위 식에서 L1 노름의 k는 가중치의 개수를 의미하므로 L1 규제를 '가중치의 절댓값을 손실 함수에 더한 것'으로 이해해도 좋다.
L1 규제를 추가한 로지스틱 손실 함수를 경사 하강법 알고리즘에 적용하면 아래와 같다.
w_grad += alpha * np.sign(w)
즉, 그레이디언트에서 alpha에 가중치의 부호를 곱하여 그레이디언트에 더한다.
그리고 회귀 모델에 L1 규제를 적용한 것을 '라쏘(Lasso) 모델'이라고 하며 사이킷런에서는 sklearn.linear_model.Lasso 클래스에서 라쏘 모델을 제공하며, SGDClassifier 클래스에서는 penalty 매개변수 값을 l1으로 지정하여 L1 규제를 적용할 수 있다. 하지만 라쏘는 가중치를 줄이다 못해 일부 가중치를 0으로 만들어 과소적합이 심해질 수도 있다. L1 규제는 가중치의 크기에 따라 규제의 양이 변하지 않으므로 규제 효과가 좋다고 할 수 없어 일반적으로 L2 규제를 많이 사용한다.
2. L2 규제(L2 Regularization)
L2 규제는 L1 규제와 다르게 손실 함수에 가중치에 대한 L2 노름(l2 norm)의 제곱을 더하며 아래와 같이 정의된다.
손실 함수에 L2 노름의 제곱을 더하면 L2 규제가 된다.
L2 규제를 경사 하강법 알고리즘에 적용하면 아래와 같다.
w_grad += alpha * w
즉, 그레이디언트에서 alpha에 가중치를 곱하여 그레이디언트에 더한다.
L2 규제는 그레이디언트 계산에 가중치의 값 자체가 포함되므로 가중치의 부호만 사용하는 L1 규제보다 조금 더 효과적이다.
그리고 회귀 모델에 L2 규제를 적용한 것을 '릿지(Ridge) 모델'이라고 하며 사이킷런에서는 sklearn.linear_model.Ridge 클래스로 제공하며, SGDClassifier 클래스에서는 penalty 매개변수를 l2로 지정하여 L2 규제를 적용할 수 있다.
정리
가중치(weights)를 규제(regularization) 한다는 것은 가중치가 작아지도록 학습한다는 것이고 이것은 특이점(outlier)의 영향을 적게 받도록 한다는 것이다. 즉, 모델의 일반화 성능을 올리기 위해 가중치 규제를 적용하는 것이다. 또한 일반적으로 사용하는 것은 L2 규제이다.
과대적합(overfitting)이 발생하면 가중치를 규제하고 과소적합(underfitting)이 발생하면 가중치 규제를 완화하자.
'AI & BigData' 카테고리의 다른 글
[AI] Object Detection 모델 성능 평가 지표(IoU, Precision, Recall, mAP, F1 Score) (1) | 2023.08.16 |
---|---|
[AI] CNN 이미지 분류 with PyTorch (0) | 2023.08.15 |
[AI] 스테이블 디퓨전 AI 실사 모델 만들기 with Stable Diffusion WebUI (0) | 2023.07.27 |
[AI] Diffusion: stable diffusion webui (0) | 2023.07.27 |
[AI] 과대적합(overfitting) / 과소적합(underfitting) (0) | 2023.07.25 |