본문 바로가기
Machine Learning

18. 모델의 과최적화를 피하는 방법 (overfitting, regularization)

by 대소니 2016. 7. 19.


지금까지 우리는 두가지 모델에 대해서 배웠습니다.

Supervised Learning에 대한 Linear regression 모델과 Logistic regression 모델을 배웠습니다.

이 두가지 모델을 이용하면 상당히 많은 머신러닝에 대한 해답을 찾을 수 있을 것입니다.


Overfitting


이시점에서 우리는 h함수에 대해서 조금더 알아보도록 하겠습니다.

아래 그림은 Linear regression에서의 dataset을 그래프로 표현한 것입니다. 가장 왼쪽에 세타에 대한 1차방정식으로 h함수를 정의했다고 생각합시다. 이때 직선을 그리면 그래프와 같이 될 것입니다. 실제 데이터 결과와 직선으로 예측되는 결과와는 완전히 일치를 하지 않습니다. 대략적으로 추정이 가능한 정도의 수준입니다. 이때의 h함수를 Underfit 또는 High bias라고 이야기 합니다. 아직 덜 최적화가 되어 있어 더 최적화 할 수 있다는 의미가 됩니다.


가장 오른쪽에 그래프를 보겠습니다. 이때의 h 함수는 4차방정식으로 표현되는 다차원방정식으로 나타내었습니다. 그래프를 그리면 많은 곡선으로 이루어진 하지만 각각의 데이터 결과 값을 모두 만족하는 형태가 됩니다. 우리가 가지고 있는 샘플 dataset에서는 아주 최적화가 잘되어 있다고 생각할 수 있지만, 새로운 dataset에서도 잘 적용이 될지 즉, 일반적으로도 적용이 가능한지에 대해서는 의심스럽습니다. 이러한 h 함수가 발생하는 문제를 Overfit 또는 High variouce라고 합니다. 너무 과하게 최적화가 되어서 일반화하기 어려운 상태를 의미합니다.


가운데 그래프를 보겠습니다. 2차방정식으로 구성되어 그래프를 그리면 어느정도 dataset에 적합하면서 집값의 가격상승분에 대한 그래프를 잘 나타내어 주고 있습니다. 이것을 Just right라고 표현하고 적절한 최적화가 되었다고 할 수 있습니다.



이번에는 Logistic regression에서 동일한 방식으로 알아보겠습니다.

가장 왼쪽의 1차방정식의 경우 어느정도 가능한 예측치를 제시할 수 있기는 하지만 최적화가 덜 되었습니다.(Underfit)

가장 오른쪽의 다항식의 경우에는 너무 샘플 데이터에 대해서 과최적화가 되어 일반적으로 사용하기가 어려울 것 같습니다.(Overfit)

가운데의 2차방정식의 경우 적절한 예측치를 제시할 수 있어 좋아보입니다.



실제로 우리가 사용하게 될 dataset에는 상당히 많은 features가 포함되어 있을 것입니다.

이것을 사용하여 모델을 적용하게 되면 자연스럽게 overfitting 현상이 발생하는 경우가 생기게 됩니다.



이런 과최적화(Overfitting)를 해결하는 방법에는 2가지 옵션이 있습니다.

하나는 사용하는 features의 수를 줄이는 방법입니다. 이것은 핵심 정보를 제외하고 일부 정보를 포기하는 형태가 되는데 이것을 특별한 알고리즘을 사용해서 자동적으로 수행할 수도 있습니다. 하지만 이것은 결과에 중요한 영향을 미치는 feature가 버려지는 결과가 발생할 가능성이 있는 단점이 있습니다.


또 다른 하나는 우리가 배울 정규화(Regularization)를 사용하는 것입니다.

모든 features를 사용할 수 있으며 대신 parameters의 값과 크기를 줄이므로서 해결하는 방법입니다.




Reqularization


정규화에 대한 개념을 직관적으로 살펴보면,

아래 그림에서 왼쪽의 h 함수는 2차방정식으로 되어 있고, 오른쪽의 h 함수는 4차방정식으로 되어 있습니다. 과최적화가 된 모습이죠.

우리가 배운 Linear regression에서 Cost 함수를 그대로 사용한다고 생각하고 뒤에 세타three와 세타four를 1000으로 곱해서 추가한다고 생각해보겠습니다.


이 새롭게 추가된 Cost 함수는 minimize 세타를 찾기 때문에 세타three와 세타four의 값은 아주 작은 거의 0에 가까운 값이 될 것입니다. 결국 4차방정식의 h 함수가 뒤에 뒤에 두개 항이 0이 되므로 2차 방정식과 같아지게 됩니다. 이것이 정규화에 개념이 됩니다.



0부터 n개의 parameters가 있을때, 일부 parameter를 작은 값으로 만들면 다항식의 h 함수가 심플해지도록 할 수 있습니다. 이것이 overfitting을 적게 발생시킬 수 있으며 정규화를 한다고 이야기 합니다.


이것을 공식으로 표현을 하면 Cost함수인 J 함수뒤에 추가적인 람다의 공식을 더하여 만들수 있습니다.

람다 곱하기 i가 1부터 n까지의 합의 세타j 제곱의 형태가 되는데, 이때 i는 parameters의 수를 의미하며 세타zero는 상수항이므로 제외하고 1부터 시작해야 합니다.


이렇게 cost 함수에 regularization 식을 추가하여 아래 그림의 공식과 같이 J함수가 됩니다.

이때 람다(lamda)를 regularization parameter라고 하며 이 람다가 하는 역활은 2가지로 구분할 수 있습니다.

하나는 본래의 cost 함수가 잘 적용이 될 수 있도록 조절해주는 역활을 하며, 또 하나는 고차항의 parameters를 아주 작은 0에 가까운 값으로 만들어주어 적당한 2차항의 함수로 만들어주는 정규화의 역활을 수행합니다.



만약에, 람다의 값을 아주 큰 값으로 10에 10승의 값으로 셋팅을 했다고 생각해보겠습니다.

람다가 아주 큰 값이 되면 세타의 parameter값들이 모두 0이 되어 버려서 결국 세타zero만이 남게 되고 이것은 1차함수의 직선으로 그래프에 그릴 수 있게 될 것입니다. 이것은 dataset에 대하여 적절하지 않은 Underfit 의 함수가 되어 버리게 됩니다.


그러므로 우리는 람다의 값을 적절하게 조절을 해야하며 이것을 어떻게 셋팅하고 자동적으로 셋팅하게 할 수 있는지 더 알아보도록 하겠습니다.




Regularized Linear Regression


Linear Regression에서의 정규화에 대해 더 알아보겠습니다.

위에서 Cost 함수에 정규화식인 람다를 추가하여 정규화된 Cost함수를 생성하였습니다.


이번에는 Gradient Descent에서 세타 parameter를 업데이트하는 공식에 정규화를 적용하는 것에 대해서 알아보겠습니다.

정규화를 수행할때 세타zero를 제외하고 세타one부터 정규화를 하도록 했었죠?

그래서 세타zero는 별도로 나누어 처리하도록 하기 위해서 아래 그림의 공식과 같이 세타zero와 세터j로 구분하였습니다.


세타zero는 정규화 대상이 아니므로 그대로 두고

세타j는 정규화 대상이므로 뒤에 람다로 표현된 식을 추가해줍니다. ( lamda / m * theta j )

이 식을 정리해서 다시 쓰면 맨 아래와 같은 식으로 표현할 수 있습니다. 이때 세타j의 함수는 세타j와 (1 - alpha * lamda/m)이 되는데, 여기서 알파와 람다와 m은 모두 0보다 큰 값이므로 결국 이식의 값은 1보다 작은 값이 됩니다.

그러므로 앞의 식의 의미는 세타j를 줄여간다는(minimize)것을 알수 있습니다. 이것은 Gradient Descent 알고리즘이 하는 역할과 동일합니다.


그리고 뒤부분의 공식은 이전에 배운 Gradient Descent 의 공식 그대로 남게 됩니다. 정규화가 잘 적용이 되었습니다.



이번에는 Gradient Descent를 사용하지 않고 Normal Equation을 사용하여 처리할 때 정규화를 어떻게 하면 되는지 알아보겠습니다.


X matrix는  m by (n+1)의 크기를 갖는 메트릭스입니다. y vector는 m 의 크기를 갖는 벡터입니다.

이때 세타를 구하는 공식은 ( Xt*X) inverse * Xt*y 였습니다. Xt * X 뒤에 람다와 메트릭스를 곱한 값을 추가하면 됩니다.

이때의 matrix는 아래 그림의 파란색 매트릭스와 같이 대각선 방향으로 1을 갖으며 그외에는 0이 되고, 특히 첫번째 세타zero의 자리에는 0으로 시작됩니다. 만약, n=2인 경우에는 맨 아래의 matrix와 같이 3 x 3 크기의 matrix가 되며 [0,0,0; 0 1 0; 0 0 1] 의 값을 갖습니다.



이전에 배운것과 같이 Xt*X의 값이 non-invertibility가 되는 경우가 있었습니다.

정규화된 즉, 람다가 0보다 큰 값이라면 Xt*X가 non-invertiblilty라고 할지라도 람다식으로 인하여 항상 invertible하게 되니 걱정할 필요가 없습니다.





Regularized Logistic Regression


이번에는 Logistic Regression에 정규화를 적용하는 것에 대해서 알아보겠습니다.

아래 그림에서 처럼 과최적화가 된 h 함수가 있습니다. 그리고 Cost 함수인 J함수는 log의 함수로 나타낼 수 있었습니다. 


Cost 함수 J에 정규화 식을 추가합니다. 아래 그림의 람다로 시작되는 파란색 공식입니다. 이때 역시 세타zero는 정규화에서 제외시킵니다.



이번에는 Gradient descent에 정규화를 적용해 보겠습니다.

세타zero는 정규화 대상이 아니므로 분리하여 그대로 두고, 세타j는 정규화 식을 아래와 같이 람다로 시작하는 파란색 공식을 추가하여 바꿀 수 있습니다. 이때 세타의 공식은 Linear regression에서와 동일하지만 h 함수가 sigmoid 함수로 다르다는 것을 잊지 말아야 합니다. 



실제로 이것을 Octave에 구현할 때에도 앞에 알아본 것과 같이 Cost 함수(jVal) 정규화 식이 추가된 형태로 변하며, Gradient 세타에 대한 함수도 세타zero를 제외하고 정규화식이 포함되어 변하기만 하면 됩니다. 아래 그림의 식을 참고하셔서 구현해보시길 바랍니다.



댓글8

  • SINSIN 2017.01.02 15:43

    안녕하세요 좋은글 감사합니다

    Regularuzation 에서 람다 파라미터에 대해서 질문 있어서 그런데

    첫번째 예제는 고차항 계수에

    1000을 곱한값을 코스트함수에 넣어서 Cost함수가 고차항을 줄이게 한다는건 이해가 가는데

    바로 밑에 식을 보면 1차2차항도 똑같은 람다로 곱해져있는데

    그러면 고차항의 계수만을 줄이는게 아닌

    전체 계수가 그냥 작아지는게 아닌가요??

    강의보면서도 이해가 잘안됬는데
    답글

    • Favicon of https://daeson.tistory.com 대소니 2017.01.02 21:57 신고

      안녕하세요~ 새해 첫 댓글을 주셔서 감사합니다. 복많이 받으시구요.

      첫번째 예제는 개념을 설명하기 위한 예제일 뿐입니다. 고차항을 줄이기 위한 설명이라기 보다는, 람다가 값이 커지면 상대적으로 n차항의 세타값이 작아지게 되는 원리를 설명하기 위한 내용입니다.

      실제적으로 정규화식은 말씀하신 바로 밑의 식이 정석입니다. 세타zero를 제외하고 모든 항에 람다가 적용이 되구요. 중간쯤에 나오는 내용과 같이 람다 값이 너무 큰 값이 되버리면 1차 방정식이 되어버려서 직선의 형태가 되는 것이지요.
      직선의 모델이 된다는 이야기는 아무리 학습을 시키더라도 우리가 원하는 정상적인 예측값을 찾아주지 못한다는 의미가 됩니다.

      결국 이러한 역할을 하는 람다값을 얼마나 적정하게 선택을 해야 우리가 원하는 학습모델을 얻을 수 있을까에 대한 고민을 우리가 해야하게 됩니다. 그리고 이와 관련된 내용은 뒤에 나오는 bias, variance등과도 이어집니다.

      여기까지 답변을 드렸는데 또 궁금한 내용이 있으시면 언제든지 댓글 달아주세요. 참고로 최근에는 정규화 람다를 사용하지 않고도 다른 방법으로 과최적화를 피하는 방법들을 많이 사용하는 추세입니다. 하지만 기본 개념은 중요합니다.^^

  • JASON 2017.07.09 20:51

    안녕하세요
    코세라 강의보면서 공부하고있는 학생입니다.

    위에 올려주신 내용중 "람다가 값이 커지면 상대적으로 n차항의 세타값이 작아지게 되는 원리"가 왜 그런건지 설명해주실 수 있을까요? shrink 해야하는데 lamda가 작으면 덜 shrink시켜도 되기 때문에 세타값을 덜 작게 해도 되는것인가요?
    답글

    • Favicon of https://daeson.tistory.com 대소니 2017.07.09 21:00 신고

      안녕하세요. 람다의 값이 커지게 되면 cost 함수의 값인 J 값이 커지게 됩니다.

      그리고 이 값은 다음 학습에서 gradient decent 알고리즘에서 세타의 값이 업데이트가 될때 커진 값이 마이너스가 되기 때문에 업데이트 이후의 세타가 값은 더 작아지게 됩니다.

      이런 연관된 변수가 전체 알고리즘에서 작용하는 내용을 설명하는 것이에요~

  • wr 2018.10.25 15:35

    1-alpha * (lambda/m)에서 람다가 비정상적으로 클 경우 세타값이 발산할 것같은데 아닌가요??
    a가 0.001 m이 한 100만 lambda를 1조 이런식으로 주면 절대값이 1보다 큰 음수가 나와서 이상한 값으로 튈 것 같은데 제가 잘못 이해하고 있는 것인가요!?
    답글

    • Favicon of https://daeson.tistory.com 대소니 2018.10.29 11:53 신고

      안녕하세여~ 말씀하신 수식은 교수님께서 설명을 하기 위해서 사용한 부분이고 전체적인 내용은 윗부분에 내용이 더 중요합니다. cost 함수에 대한 전체적인 프로세스에 따라서 변화하는 세타 값을 생각을 해보셔야 하는 내용이에요^^ 좀 복잡하게 설명을 하고 있지만 핵심을 정리하면 이렇습니다. ^^

      ‘람다 값을 비정상적으로 주면 학습이
      안되기에 적절한 값을 찾아서 셋팅을 해야한다.’

  • Favicon of https://dkanxmstmdgml.tistory.com 달승 2020.10.20 16:37 신고

    많은 도움이 되었습니다. 정말 감사합니다.
    답글