Train 데이터셋에 대한 학습은 잘 되고 있지만, Validation loss가 감소하지 않고 증가하면 보통 우리는 Train 데이터셋에 과대적합 (오버피팅)이 일어났다고 할 수 있다.
왜 오버피팅이 문제가 되는가? 그것은 모든 ML 알고리즘의 목적은 일반화 성능에 있기 때문이다. 우리가 학습을 통해 배운 알고리즘은 학습 데이터에서만 잘 작동하면 문제가 될 것이다. 즉, 우리가 보지 못한 Unseen 데이터에 잘 작동해야 한다. 따라서, 일반화 성능을 높이기 위해서 우리는 오버피팅을 고려해야 한다.
딥러닝 아키텍쳐를 구성하기 시작하는 순간 오버피팅과의 싸움이 일어난다. 따라서, 다양한 기법을 통해 이를 해결하기 위해 노력해야한다. 그럼 과소적합과 과대적합은 무슨 차이일까?
과소 적합은 데이터를 제대로 모델이 학습하지 못한다는 의미이다. 과소적합이 본인의 딥러닝 아키텍처에 발생하게 된다면, 본인이 설계한 딥러닝 아키텍쳐가 해당 문제를 풀 수 있을만한 표현력 (Representation Capacity)가 없다는 이야기이다. 따라서, 아키텍쳐를 다시 설계해야하기 때문에 딥러닝을 구현하는 엔지니어에게 차라리 오버피팅이 낫다고 말할 수 있다. 이를 통해 아래와 같은 설계 전략을 도출할 수 있다.
딥러닝 설계 전략 (1) 오버피팅을 통해 아키텍쳐가 해당 문제를 풀 수 있는 표현력을 가지고 있는지 확인하자
(2) 오버피팅을 해소할 수 있는 다양한 기법을 활용해 이를 해소하자
과소적합이 되면 Loss가 줄어들다가 올라가는 오버피팅과 다르게 아래와 같은 그림의 Loss를 볼 수 있게 된다.
그럼 과적합은 왜 발생하는 것일까? 가장 큰 문제는 아키텍쳐의 파라미터수가 내가 학습시키는 샘플 수에 비해 매우 많아서, 딥러닝이 학습해야 하는 파라미터(W)의 자유도가 너무 높기 때문이다.
Number of parameters >> # of samples
예를 들어서, 2x+5y = 7, x+4y = 5의 방정식이 있으면 x,y의 유일한 해가 하나 밖에 없을 것이다. 즉, 자유가 없다. 하지만 만약에 우리가 가지고 있는 방정식이 2x+5y = 7이라고 하면 이를 만족하는 해 x,y는 직선 전체가 되기 때문에 자유도가 매우 높다. 이를 Neural Network (NN)에 빗대어 말하면, 학습해야 하는 파라미터 W는 어떤 값이든 될 수 있으며, train data를 완전히 외워버리는 학습을 하게 된다.
위에서 딥러닝 설계는 우선 오버피팅을 통해 아키텍쳐의 표현력을 확인하고, 이를 해결하기 위한 다양한 기법을 통해 오버피팅을 해소한다고 했다. 어떻게 이를 해소 할 수 있을까?
(1) Get more training data! 데이터를 더 모은다.
내가 수집한 데이터 분포인 파란색과 모집단의 데이터 분포인 빨간색은 다를 수 밖에 없다. 따라서, 원래의 Data distribution과 최대한 비슷하게 데이터를 수집한다면 오버피팅이 발생해도 일반화 성능에는 문제가 없을 것이다.
(2) Data Augmentation
데이터를 수집하기에는 Label Cost가 많이 들기 때문에 데이터를 수집 못할 수도 있다. 이럴 때는 Data Augmentation을 진행할 수 있다.
(3) Weight regularization
Loss 함수에 Panalty 항을 추가하여 학습할 수 있는 W값 자체에 대한 제한을 줄 수 있다.
아래 수식에서 L2 규제를 추가함으로써 직관적으로 딥러닝 아키텍쳐는 Loss를 줄이는 문제와 함께 W값 자체를 줄여야 하는 문제를 동시에 부여 받게 된다. 즉, W를 줄이는 태스크를 부여함으로써 자유도를 낮출 수 있는 것이다. lambda를 2로 나눠주는 이유는 미분에 용이하게 만들기 위해서다.
L1 규제(절대값) / L1 + L2 규제도 가능
(4) Dropout
가장 많이 쓰는 기법중 하나인 드롭아웃이다. 드롭아웃은 매 Iteration마다 랜덤하게 뉴런을 끄게 만들어 학습하는 파라미터도 줄이고, 매번 새로운 아키텍쳐를 학습하는 듯한 효과를 볼 수있다. 또한, 여러 아키텍쳐가 합쳐지는 앙상블 효과가 있어 성능이 올라갈 수 있다고 주장한다. 최근에는 Dropout이 Underfitting에도 도움이된다는 논문이 발표된 적이 있다.
어떤 입력 샘플에 대해 [0.2, 0.5, 1.3, 0.8, 1.1] 벡터를 출력한다고 가정하면, 드롭아웃이 적용된 Layer의 경우 [0,0.5,1.3,0,1.1]이 될 수 있다. 즉, 출력 특성을 0으로 만들어서 제외시킨다. 대신 Dropout이 적용되었으면, 출력에서 Compensate를 위해 비율만큼 곱해준다.
단, Dropout을 사용한다면, 학습이 어려워지기 때문에 Epoch를 늘려주자.
(5) Network Size를 줄이자
특정 Layer를 제거하거나, Layer에서의 뉴런수를 줄일 수 있다. 하지만, 네트워크 사이즈를 줄이면 딥러닝의 표현력이 줄어서 비선형적 관계를 학습할 수 있는 딥러닝의 장점이 줄어들 수 있다.
(6) Early Stopping
학습하는 Epoch수가 줄어들기 때문에 표현력이 여전히 줄어든다. 오버피팅 해결책의 마지막 고려사항.
개인적으로 또는 권장사항은 데이터 수집 -> Augumentation -> 규제 -> Dropout 이후 (5)번과 (6)을 고려하는게 좋음. 단순히 Ealry Stopping 또는 네트워크 사이즈를 줄이는 방식으로 오버피팅을 막을 생각을 하면 안된다.