윤제로의 제로베이스

과적합(Overfitting)을 막는 방법들 본문

Background/Pytorch 기초

과적합(Overfitting)을 막는 방법들

윤_제로 2022. 1. 17. 23:16

https://wikidocs.net/60751

 

09. 과적합(Overfitting)을 막는 방법들

학습 데이터에 모델이 과적합되는 현상은 모델의 성능을 떨어트리는 주요 이슈입니다. 모델이 과적합되면 훈련 데이터에 대한 정확도는 높을지라도, 새로운 데이터. 즉, 검증 데이 ...

wikidocs.net

1. 데이터의 양 늘리기

데이터의 양이 적을 경우 해당 데이터의 특정 패턴이나 노이즈까지 쉽게 암기하게 되므로 과적합 현상이 발생할 확률이 늘어난다. 

그렇기 때문에 데이터의 양을 늘릴 수록 모델은 데이터의 일반적인 패턴을 학습하여 과적합을 방지할 수 있다.

 

만약, 데이터의 양이 적을 경우에는 의도적으로 기존의 데이터를 조금씩 변형하고 추가하여 데이터의 양을 늘리기도 하는데 이를 데이터 증식 또는 증강(Data Augmentation)이라고 한다.

이미지의 경우에는 데이터 증식이 많이 사용되는데 이미지를 돌리거나 노이즈를 추가하고, 일부분을 수정하는 등으로 데이터를 증식시킨다.

2. 모델의 복잡도 줄이기

인공 신경망의 복잡도는 은닉층(hidden layer)의 수나 매개변수의 수 등으로 결정된다.

과적합 현상이 포착되었을 때, 인공 신경망 모델에 대해서 할 수 있는 한 가지 조치는 인공 신경망의 복잡도를 줄이는 것이다.

 

class Architecture1(nn.Module):
  def __init__(self, input_size, hidden_size, num_classes):
    super(Architecture1, self).__init__()
    self.fc1 = nn.Linear(input_size, hidden_size)
    self.relu = nn.ReLU()
    self.fc2 = nn.Linear(hidden_size, hidden_size)
    self.relu = nnReLU()
    self.fc3 = nn.Linear(hidden_size, num_classes)

  def forward(self, x):
    out = self.fc1(x)
    out = self.relu(out)
    out = self.fc2(out)
    out = self.relu(out)
    out = self.fc3(out)
    return out

 

위 인공 신경망은 3개의 선형 레이어(Linear)를 가지고 있다.

 

class Architecture1(nn.Module):
  def __init__(self, input_size, hidden_size, num_classes):
    super(Architecture1, self).__init__()
    self.fc1 = nn.Linear(input_size, hidden_size)
    self.relu = nn.ReLU()
    self.fc2 = nn.Linear(hidden_size, num_classes)

  def forward(self, x):
    out = self.fc1(x)
    out = self.relu(out)
    out = self.fc2(out)
    return out

 

위 인공 신경망은 2개의 선형 레이어를 가지고 있다.

인공 신경망에서는 모델에 있는 매개변수들의 수를 모델의 수용력(capacity)라고 한다.

3. 가중치 규제(Regularization) 적용하기 

복잡한 모델이 간단한 모델보다 과적합될 가능성이 높다.

그리고 간단한 모델은 적은 수의 매개변수를 가진 모델을 말한다.

복잡한 모델을 더 간단하게 하는 방법으로 가중치 규제(Regularization)가 있다.

 

  • L1 규제 : 가중치 w들의 절대값 합계를 비용 함수에 추가한다.
  • L2 규제 : 모든 가중치 w들의 제곱합을 비용 함수에 추가한다.

L1 규제는 기존의 비용 함수에 모든 가중치에 대해서 절댓값을 더한 값을 비용 함수로 하고, L2 규제는 기존의 비용 함수에 모든 가중치에 대해서 유클리드거리를 더한 값을 비용 함수라고 한다.

이때 각각의 규제에 곱해지는 람다 값은 규제의 강도를 정하는 하이퍼파라미터이다.

람다가 크다면 모델이 훈련 데이터에 대해서 적합한 매개 변수를 찾는 것보다 규제를 위해 추가된 항들을 작게 유지하는 것을 우선한다는 의미가 된다. 

 

이 두 식 모두 비용 함수를 최소화하기 위해서는 가중치 w들의 값이 작아져야 한다는 특징이 있다.

 

L2 규제는 L1 규제와는 달리 가중치들의 제곱을 최소화하므로 w의 값이 완전히 0이 되기보다는 0에 가까워지기는 경향을 띈다.

L1 규제는 어떤 특성들이 모델에 영향을 주고 있는지를 정확히 판단하고자 할 때 유용하다. 

이러한 판단이 필요 없다면 L2 규제가 더 잘 작동하므로 L2 규제를 권장한다.

L2 규제를 가중치 감쇠(weight decay)라고도 부른다.

4. 드롭아웃(Dropout)

드롭아웃은 학습 과정에서 신경망의 리부를 사용하지 않는 방법이다.

드롭아웃은 신경망 학습시에만 사용하고, 예측시에는 사용하지 않는 것이 일반적이다.

학습시에 인공 신경망이 특정 뉴런 또는 특정 조합에 너무 의존적이게 되는 것을 방지해주고, 매번 랜덤 선택으로 뉴런들을 사용하지 않으므로 서로 다른 신경망들을 앙상블하여 사용하는 것 같은 효과를 내어 과적합을 방지한다.