오버피팅(Overfitting)

기술/인공지능 2017. 8. 10. 21:18 Posted by 아는 개발자

학습 능률을 높인다는 것은 비용함수(Cost function)의 값을 줄이는 것입니다. 하지만 학습에 사용하는 Feature(쎄타라고 생각하시면 됩니다)의 개수가 일정하면 Gradient Decent와 같은 최적화 작업을 통해 통해 최적의 해에 도달 했다고 해도 절대적인 비용은 어쩔 수가 없습니다.


최대한 학습 데이터를 따르는 직선을 만들었지만 그래도 비용은 어쩔수가 없네요.


그런데 우리가 직선이 아니라 볼록한 함수를 이용해서 학습한다면 어떨까요? 쎄타2를 추가하고 이때의 x는 제곱으로 본다고 합시다. 여러차례 최적화 작업을 거치면서 아래로 볼록한 함수가 나온다면 데이터의 흐름을 잘 따를 수 있을 것 같습니다. 실제로 그림으로 그려보봐도 그렇네요.


데이터 흐름을 더 잘 따라가는 것 같습니다.


실제로 계산해보면 비용함수의 값도 감소합니다. 이로써 Feature의 개수를 늘리면 학습효과가 더 증가 한다는 것을 알 수 있겠네요. 내친김에 극솟값 x축에 있는 학습 데이터도 캐치 할 수 있도록 차원을 더 올려봅시다. 이번엔 아예 다섯제곱까지 늘려보자구요.


이제는 학습에 사용된 모든 데이터들을 캐치 할 수 있게 됐습니다. 아마 비용함수의 값은 0이 나올것 같네요. 학습 성능은 가장 좋은 것으로 판단해도 될 것 같습니다만 X축에서 오른쪽으로 갈수록 값이 곤두박질 치고 있다는게 맘이 걸리긴 합니다.


만약 위 데이터의 원래 흐름이 아래로 블록한 그래프였다면 어땠을가요? 실제로 아래 그림의 노란색 데이터들이 들어온겁니다. 이런 경우 학습을 잘했다고 보기 어렵습니다. 차라리 2차원 블록한 그래프가 비용함수 값은 좀 있더라도 노란색 데이터가 들어 올 것이라고는 더 잘 예측 했을 것 같네요.


이처럼 비용함수의 값을 낮추기 위해 여러개의 Feature를 과하게 넣다보면 오히려 실제 데이터와 괴리되는 현상이 생깁니다. 분명 학습 데이터는 잘 맞추는데 실제로 보면 예측은 전혀 못하고 있는 것이지요. 이런 경우를 오버피팅(Overfitting)이라고 합니다. 학습 모델을 만들 때 위와 같은 경우를 방지하기 위해 비용함수의 수식에 Feature의 크기에 따른 변화값을 두기도 한답니다. 선형회귀에선 수식으로는 이렇게 표현해요!


파란색 원으로 그려둔 부분이 Overfitting을 방지하기 위한 값입니다. 일반적으로 쎄타의 값이 커질수록 Overfitting 발생 정도가 증가합니다. 그래서 이 값의 제곱 값을 더하면 전체 비용함수가 늘어나는 것으로 보고 학습 효과를 떨어뜨리게 되는 것이죠.


람다 값은 이때의 상수입니다. 오버핏 방지 연산에 얼만큼 비중을 둘 것인지를 결정합니다. 이 값이 커질수록 오버피팅이 하지 않게 되겠지만 낮아진다면 학습 데이터도 잘 맞추지 못하게 됩니다. 이 값이 적당할 때 가장 그럴듯한 예측을 하는 학습 모델을 만들 수 있게 됩니다.

728x90