규제
과대 적합을 해결하는 대표적인 방법 중 하나가 가중치 규제(regularization)이다.
가중치 규제란 말 그대로 가중치의 값이 커지지 않도록 제한하는 기법이다.
가중치를 규제하면 모델의 일반화 성능이 올라간다.
두 그래프 모두 점들을 잘 표현하고 있다.
그러면 둘 중 어떤 그래프의 성능이 더 좋을까?? 이 경우에서는 기울기가 완만한 그래프가 성능이 좋다.
박스 표시된 점까지 잘 표현하였기 때문이다.
몇 개의 데이터에 집착하면 새로운 데이터에 적응하지 못하므로 성능이 좋지 않다.
이럴 때 규제를 사용한다. 대표적인 규제 L1 규제와 L2 규제를 알아보자.
L1 규제
손실 함수에 가중치의 절댓값인 L1 노름(norm)을 추가한다.
w는 벡터를 의미한다.
로지스틱 손실 함수에 L1 규제를 적용해보자.
다음은 로지스틱 손실 함수이다.
여기에 규제를 적용하면 다음과 같다,
L1 노름을 그냥 더하지 않고 규제의 양을 조절하는 파라미터 a를 곱한 후 더한다.
a는 L1 규제의 양을 조절하는 하이퍼 파라미터이다.
a가 커지면 w의 합은 작아져야 하고 반대로 a가 작아지면 w의 합은 커져도 상관없다.
L1 규제를 적용한 손실 함수를 미분하면 다음과 같다.
sign(w)는 w의 부호라는 의미이다.
이제 이 식을 가지고 가중치를 업데이트해보면 다음과 같다.
L1 규제를 추가한 로지스틱 손실 함수를 경사 하강법으로 최적화하는 것은 다음과 같다.
w_grad += alpha * np.sign(w)
alpha는 규제 하이퍼 파라미터이다.
np.sign() 함수는 배열 요소의 부호를 반환한다.
(절편은 규제하지 않는다. 절편은 모델에 영향을 미치는 방식이 가중치와 다르기 때문이다.)
SGDClassifier클래스에서는 penalty 매개변수 값을 l1으로 지정하여 L1 규제를 적용 가능하다.
회귀 모델에 L1 규제를 추가한 것을 라쏘(Lasso) 모델이라 한다.
L2 규제
L2 규제는 손실 함수에 가중치에 대한 L2 노름(norm)의 제곱을 더한다.
손실 함수에 L2 노름의 제곱을 더하면 L2 규제가 된다.
이때 a는 규제의 양을 조절하기 위한 하이퍼 파라미터이고 ½은 미분 결과를 보기 좋게 하기 위함이다.
로지스틱 손실 함수의 미분은 다음과 같다.
L1 규제는 부호만 더했지만 L2규제는 w값 자체를 더한다고 생각하면 쉽다.
가중치 업데이트 식에 대입해 보자.
L2 규제를 경사 하강법 알고리즘에 적용하는 것도 어렵지 않다.
w_grad += alpha * w
L2 규제는 그레이디언트 계산에 가중치의 값 자체가 포함되므로 L1 규제보다 조금 더 효과적이다.
또한 L2 규제는 가중치를 완전히 0으로 만들지 않아 특성을 제외하지 않는다.
회귀 모델에 L2 규제를 적용한 것을 릿지(Ridge) 모델이라 한다.
L1 규제와 L2 규제 정리