과적합은 과대적합(Overfitting)과 과소적합(Underfitting)으로 나눠집니다. 과소적합은 훈련데이터의 손실이 낮을수록 테스트 데이터의 손실도 낮아지며 이러한 상황은 모델의 성능이 개선될 여지가 많으므로 예외로 처리하지 않습니다.
우리가 보통 말하는 과적합은 과대적합(Overfitting)을 의미합니다. 이 책의 이후에서 언급하는 과적합은 과대적합을 의미합니다. 과적합은 학습데이터를 과하게 학습하는 것을 뜻합니다. 일반적으로 학습데이터는 전체 데이터의 부분 집합이므로 학습데이터에 대해서는 오차가 감소하지만, 전체 데이터에 대해서는 오차가 증가하게 됩니다.
일반적으로 머신러닝과 딥러닝에서의 과적합을 아는 방법은 훈련 데이터셋의 오차(또는 정확도)와 검증 데이터셋의 오차(또는 정확도)의 차이를 보고 판단합니다. 훈련 데이터셋의 오차는 학습횟수가 많을 수록 줄어드는 반면 검증 데이터셋의 오차는 일정 부분까지 줄어들다가 학습이 더 진행되면 오히려 오차가 늘어날 수 있습니다. 이러한 상황이 발생하면 과적합이 있다고 볼 수 있습니다.
1.2 과적합 방지
과적합을 방지하는 방법으로 조기종료, 드롭아웃, 가중치 규제 등의 방법을 사용합니다.
1) 조기 종료(Early Stopping)
학습 시의 오차의 변화를 기록해 두고 이를 그래프로 나타냈을 때 다음 그림처럼 훈련 데이터(Traning set)의 오차는 지속해서 줄어들지만, 검증데이터(Test set)의 오차는 일정 시점이 지나면 오히려 증가하는 경향이 있습니다. 이렇게 되면 학습을 할수록 검증데이터의 오차는 커지게 됩니다. 이렇게 과적합이 발생한다면 학습을 도중에 멈추게 하는 방법으로 과적합 문제를 해결할 수 있습니다.
조기 종료
케라스의 fit() 함수는 매 학습(epoch)마다 loss와 accuracy를 계산한 값을 반환합니다. 이를 이용해서 조기 종료할 학습횟수를 정하는 것은 과적합을 줄일 수 있는 빠른 방법입니다.
2) 드롭아웃(Dropout)
인공신경망 층(Layer)이 많아지고 뉴런의 수가 많다고 해서 무조건 그 결과가 좋아지는 것은 아닙니다. 층이 많고 뉴런의 수가 많으면 과적합으로 인해 오히려 검증 데이터셋의 오차가 늘어날 수 있습니다. 이 경우 전체적으로 층과 뉴런의 수는 유지하면서 과적합 문제를 해결할 수 있습니다.
드롭아웃(Dropout)은 인공신경망의 일부 뉴런이 학습하지 않도록 하는 것입니다.
드롭아웃 적용
드롭아웃을 하는 근본적인 이유는 두 가지가 있습니다.
첫 번째 이유는 투표(Voting) 효과입니다. 일정한 미니배치(Mini Batch) 구간 동안 줄어든 네트워크를 이용해서 학습하게 되면 그 네트워크는 그 나름대로 과적합이 되며, 다른 미니배치 구간 동안 다른 네트워크에 대해 학습을 하게 되면 다른 네트워크에 대해 일정 정도 과적합이 됩니다. 이런 과정을 무작위로 반복하게 되면, 투표에 의한 평균 효과를 얻을 수 있으므로, 결과적으로 정규화(Regularization)와 비슷한 효과를 얻을 수 있게 됩니다.
두 번째 이유는 동조화(Co-adaptaion)를 피하는 효과입니다. 특정 뉴런의 바이어스나 가중치가 큰 값을 갖게 되면 그것의 영향이 커지면서 다른 뉴런들의 학습 속도가 느려지거나 학습이 제대로 진행되지 못하는 경우가 있습니다. 그러나 드롭아웃을 하면서 학습을 하면 어떤 뉴런의 가중치가 특정 뉴런의 영향을 받지 않기 때문에 뉴런들이 서로 동조화되는 것을 피할 수 있습니다.
케라스에서 드롭아웃은 Dropout 클래스를 이용해서 각 층의 드롭아웃 비율을 지정합니다.
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Dropout
model = Sequential()
model.add(InputLayer(4))
model.add(Dense(50, activation="sigmoid"))
model.add(Dropout(0.4))
model.add(Dense(30, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))
model.summary()
3) 가중치 규제
가중치 규제는(Weight Regularization)는 과적합을 해결하기 위해서 가중치의 값이 커지지 않도록 제한하는 방법입니다. 여기에서 사용하는 규제는 정규화 또는 일반화로 해석할 수 있습니다.
가중치 규제는 L1 규제와 L2 규제가 있습니다. 흔히 회귀분석에서 L1 정규화, L2 정규화라고 불리는 것입니다. L1 규제는 가중치의 절댓값에 대한 규제이며, L2 규제는 가중치의 제곱에 대한 규제입니다.