본문 바로가기

데이터와 함께 탱고를/통계 기초 공부

L1, L2 Regularization (Lasso, Ridge)

머신러닝을 위한 파이썬 워밍업에서 Linear Regression 파트를 공부하며 복습한 내용을 적어본다.

Overfitting 의 문제

Regularization 이라는 문제에 앞서 항상 먼저 나오는게 overfitting 이슈다. 기술 관련 이슈는 대부분 원인 -> 해결방법 순으로 설명이 되다보니 당연한 일이겠지만.

이전에 Gradient Descent 를 통해 W 를 기계적으로 (반복문과 갱신을 통해) 찾아내었다. 일단 머신러닝이라고 하는 것이 되긴 한거다. 사람이 찾지 않고, 어떤 식과 기계의 힘을 빌려서 찾았으니깐 말이다.

그럼 이제 문제는 '잘' 찾는 것인데. 본격적인 고도화 및 성능 이슈의 시작되는 듯 하다. Overfitting 은 이러한 고도화 이슈 중, 가장 일반적인 현상인데, 한 마디로 표현하자면 학습데이터에 너무 최적화되어 W 값이 잡히고, 이후 학습 데이터가 아닌 새로운 데이터에는 올바른 값을 내보내지 못하는 현상을 말한다.

Regularization

데이터에 너무 과적합되어 모델(W) 이 피팅되었으니, 이를 좀 덜 적합하게(?) 하고, 이후 새로운 데이터에도 일반적으로 들어맞는 모델을 만들어야 한다. 이 때, 과적합이 아닌 일반성을 띄게 해주는 기법을 Regularization 이라고 한다.

먼저, 왜 과적합, Overfitting이 일어날까? 어떤 요소가 그렇게 만드는걸까?

출처 : https://www.verdazo.com/blog/machine-learning-finding-the-signal-or-fitting-the-noise/

위 사진을 보면, 파란색 선이 구불구불하게 생긴 것을 볼 수 있다. 우리가 기대하는 일반성을 띈 모델은 빨간색 점선이다.

모델은 y = Wx+b 꼴로 되어있고, 이것을 좀 더 열어보면, y = w1x1 + w2x2 + w3x3 + x4x4 + .. wnxn + b 꼴이다.
우리가 머신러닝을 돌리게 되면, 각 w값들이 어떤 수로 적합하게 피팅되는데, 과적합이 되는 이유는 바로 여기에 있다.

직관적으로 생각해보면, 과적합하다는 것은 모델로 그래프를 그렸을 때, 너무 구불구불 하다는 것이고, 구불구불한 이유는 모델의 차수가 크기 때문이다. (생각해보면, 1차 함수보다 2차함수가, 3차함수가 그리고 4차함수.. n차 함수록 갈수록 그래프가 구불구불 해지는 것을 고등학생 때 배웠다! )

과적합을 피하려면, 이 구불구불한 것을 조금 펴주면 된다. 그리고, 구불구불 한 것을 펴주려면, 모델의 차수를 줄여주면 된다.

그런데 변수의 차수, 즉 식에서 x의 개수는 데이터의 핏처 개수이므로, 변수의 개수를 줄이지 않고, 최대한 데이터를 보존하며 차수를 줄여주는 방법을 생각해야 한다. 그러려면 우리가 조정할 수 있는 것은 W값, 즉 각 x에 대한 계수 값이다. 우리는 Cost function 과 GD를 이용해 W를 업데이트 해나갔는데, 이 부분에 뭔가 부수적인 작업을 해볼 수 있다.

결과적으로는, Cost function J에 어떤 항들을 추가하는데, 이 추가하는 항에 따라 L1 과 L2 로 Regularization 을 구분하여 이름붙인다.

Cost function이 원래 어떤 꼴이었는지 잠깐 환기하고 가자.

L1 Regularizaiton (Lasso)

L1 Regularizaiton 은 Lasso 라고도 불리며, 기존 Cost function 뒤에 L1 항을 추가해준 것이다.
공식은 다음과 같다.

우리는 GD 에서 이 Cost function J를 실제로는 미분해서 쓰기 때문에, 실제 GD 식에서 위 Cost function 을 접목하면, W를 업데이트 할 때, 계속해서 특정 상수를 빼주는 꼴이 된다.

이게 어떤 효과를 불러일으키냐면, W가 계속해서 업데이트 해나갈 때, W의 원소인 어떤 wi 는 0 이 되도록 한다. 왜냐하면 계속해서 특정상수를 빼나가기 때문이다. 따라서, L1은 영향을 크게 미치는 핵심적인 피처 xi 들만 반영하도록 한다.

L2 Regularization (Ridge)

L2 Regularizaiton 은 Ridge 라고도 불리며, 기존 Cost function 뒤에 L2 항을 추가해준 것이다.
공식은 다음과 같다.

마찬가지로 위 식을 미분하여 GD 에서 사용하면, 전체적으로 W 값이 작아지도록 한다.
아래 식은 기존 GD 식과 Ridge를 풀어낸 식이다.

위 식과 아래식은 같다. (풀어낸 것)

보면, 기존의 GD 에서, 앞에 1 - a * (lambda) / m 이 추가된 것을 볼 수 있는데, 이로 인해, 기존 GD 보다 Θ 가 일정비율로 더 감소하는 것을 알 수 있다. 즉, 위의 Lasso 같이 일부 항의 계수를 0으로 만들어버리지는 않고, 전체적인 wi 값의 절대값을 감소시켜 덜 구불구불하게 하는 것이다. Lasso 보다는 좀 더 구불구불하지만, 일반 GD 보다는 덜 구불구불한 느낌의 그래프를 갖는다.

Lasso, Ridge 비교

두 방법의 특징은 다음과 같다.

출처 : 강의노트

구글에서 제공하는 툴을 이용해 한 예를 들어보면 다음과 같다.
각 수는, wi 즉, 식에서 각 xi에 대한 계수를 의미한다.

참고하면 좋은 링크

라온 피플 머신러닝 아카데미 - Regularization

해커에게 전해들은 머신러닝 2 - 정형화 파트