Data/머신러닝 & 딥러닝

신경망의 기본 구성 요소(7)/ 과대적합과 L1, L2 규제

빛날희- 2021. 7. 20. 17:35

참고 사이트

참고 영상


▶ 과대적합

심층 신경망은 때로 수백만 개의 파라미터를 가지고 있을 정도로 자유도가 매우 높아 대규모의 데이터 셋을 학습시킬 수 있다. 그러나 이런 특징이 학습데이터에 모델을 과대적합시켜 막상 테스트 데이터에선 성능을 발휘하지 못하는 현상이 발생할 수 있다. 

과대 적합을 줄이기 위해선 그래프를 일반화시켜야한다, 그래프를 일반화 시킨다는 것은 데이터 포인트에 맞춰져 있던 그래프들의 기울기를 작게 만든다는 의미이기도 하다. 기울기를 작게 만들기 위해선 가중치를 줄이는 과정이 필요하다. 가중치가 너무 작아지면 과소적합이 발생할 수 있기 때문에 과대적합과 과소적합을 적절히 완충시킬 수 있는 값을 구하는 것이 중요하다. 

 

이 과대적합 문제를 막기 위해 l1, l2규제, 드롭아웃 등의 규제 방법이 있는데 해당 포스팅에선 l1, l2규제에 대해 알아보려 한다. 

 

 

 

▶ l1 규제

l1 규제는 l1 norm을 손실함수에 더해준다. l1 규제의 공식은 다음과 같다. 

앞부분은 실제값과 예측값을 대상으로 loss함수를 구한 값이고 뒤의 부분이 l1 norm이다. 람다값은 우리가 설정해야하는 하이퍼파라미터이고 1부터 n까지의 가중치의 절대값을 모두 더한 후 람다값을 곱한 값이 l1 norm이 된다. 

 

람다값을 가중치 절대값 합에 곱함으로써 가중치가 loss에 얼마나 영향을 끼칠지 결정한다. 즉 Loss는 전체적으로 작아져야하기 때문에 람다값이 커지면 커질 수록 가중치 합은 줄어들 것이다. 다시말해 람다값이 커질 수록 기울기가 작아질 것이다. 반면 람다값이 작아지면 l1노름에 대한 제약의 효과가 없어져 과대적합을 해결할 수 없을 수 있다. 따라서 람다 값을 적절한 값으로 잘 조정하는 것이 과대적합을 완화하고 과소적합을 방지하는 데 중요한 요소이다. 

 

규제 부분은 후에 찾은 그레디언트 값에 미분하여 더해주면 규제를 적용한 그레디언트 값을 구할 수 있다. 

l1 norm을 미분하면 가중치 부분은 사라지고 람다값에 w의 부호를 곱한 값이 된다. 

 

grad += lambda * np.sign(w)

 

 

 

▶ l2 규제

그러나 l1규제의 경우 위의 코드와 같이 l1 norm을 미분하면서 가중치 부분이 부호만 남기고 사라지기 때문에 그레디언트 값에 가중치를 반영할 수는 없다.

따라서 l2 규제가 검증데이터의 손실을 잘 억제하면서 가중치를 완전히 0으로 만들지 않기 때문에 l1 보다는 l2를 많이 사용하는 추세이다. 

 

l2 규제의 공식은 다음과 같다. 

l1 규제와 달리 가중치를 제곱한 값의 합에 람다값을 곱한 값을 사용한다. 원리는 l1규제와 동일하다. 

 

l2 규제를 gradient값에 반영해 주기위해 미분하면 2lambda * w가 남는다. 따라서 해당 값을 구해진 그레디언트 값에 더하면 규제를 반영할 수 있다. l1과 달리 가중치가 직접 그레디언트 값에 포함되기 때문에 규제 효과가 더 크게 나타난다고 본다. 

grad += 2lambda * w

 

 

 

 

▶ 파이토치 구현

▷ l1 규제

l1 규제는 파이토치에서 따로 제공하지 않는기능이기 때문에 다음과 같이 직접 구현할 수 있다. 

 

l2 규제

l2 규제는 옵티마이저에서 weight_decay파라미터를 통해 구현할 수 있다. 파라미터 값으로 적절한 람다값을 넣어서 학습이 가능하다.