[DL Basic] 정규화(Regularization)

 

정규화(Regularization, 규제화)

  • 이전에 신경망을 학습 할 때, 좋은 위치에서 시작하는 가중치 초기화에 대하여 알아보았다. 이와 더불어 최적해로 가는 길을 잘 찾을 수 있도록 해주는 정규화에 대해 알아보려 한다.
  • 정규화란 최적화 과정에서 최적해를 잘 찾도록 정보를 추가하는 기법으로, 성능을 개선할 수 있는 포괄적인 기법들을 포함한다.
  • 여기서 성능이 좋다는 것은 일반화가 잘 되었다는 것으로 훈련 성능과 검증/테스트 성능의 차이를 나타내는 일반화 오류가 적다는 것이다.

정규화의 접근 방식

  1. 모델을 최대한 단순하게 만들기
    • 복잡한 모델의 파라미터 수를 줄이거나, 파라미터를 제거하는 등의 기법으로 모델을 단순하게 만들어 과적합을 줄이는 것이다.
  2. 사전 지식을 표현해서 최적해를 빠르게 찾도록 함
    • 데이터나 모델에 대한 사전 분포를 이용하여 정확하고 빠르게 해를 찾는 방법으로 가중치 감소가 그 예이다.
  3. 확률적 성질을 추가
    • 데이터, 모델, 훈련 기법 등에 확률적 성질을 추가하여 조금씩 변형된 형태로 데이터를 다루어 다양한 상황에서 학습하는 효과를 준다.
    • 이는 손실 함수가 풍부한 데이터를 이용하여 넓은 범위를 세밀하게 표현하도록 하여 더 정확한 해를 찾고, Noise에 민감하지 않다.
    • 데이터 증강, 잡음 주입, 드롭 아웃 등의 방식을 이용한다.
  4. 여러 가설을 고려하여 예측
    • 앙상블 같은 방법을 이용하여 하나의 모델이 가지는 편향을 제거하여 오차를 최소화하는 방법이다.

가중치 감소

  • 선형 회귀를 가정했을 때, $w^{T}x + b = 0$과 2를 곱한 $2w^{T}x+2b$는 완전히 같은 직선이다. 이렇듯 하나의 직선을 표현할 수 있는 표현은 굉장히 많다.
  • 이 중에서 가장 좋은 식은 $w^{T}x+b=0$이다. 왜냐하면 최적화 시에 다루는 숫자의 크기가 작을 수록 오차의 변동성이 낮아지기 때문이다.(파라미터 값이 작을수록 손실 함수의 변화가 더 매끄럽고 안정적)
  • 즉, 파라미터 공간이 원점 근처에 있을 때, 정확한 해를 빠르게 찾을 수 있는 것이다. 그렇기에 학습 시에 weight와 bias는 작은 것이 좋다.
  • 학습 과정에서 작은 크기의 가중치를 갖게 해주는 것이 가중치 감소이다.
  • 가중치 감소는 $J(w) = J(w) + \lambda R(w)$와 같이 손실 함수($J(W)$)에 가중치의 크기를 표현하는 정규화 항($\lambda R(W)$)을 더하여 사용한다. $\lambda$는 정규화 상수로서, 가중치의 크기를 조절해주는 역할을 한다.($\lambda$가 크면 정규화 항의 비중이 커지며, 가중치의 크기가 더 작아진다.)

      $\lambda$ 커짐 $\lambda$ 작아짐
    정규항의 비중 비중이 커짐 비중이 작아짐
    가중치의 크기 더 작아짐 더 커짐
  • 주로 정규화 항은 $L_{2}$노름이나 $L_{1}$노름을 사용한다. $L_{2}$노름을 사용하면 리지 회귀, $L_{1}$노름을 사용하면 라소 회귀라고 한다.

스크린샷 2025-04-15 201116

  • 리지 회귀는 주로 가중치의 사전 분포를 모르거나, 가우시안 분포일 경우 사용하고, 라소 회귀는 데이터의 사전 분포가 라플라스 분포일 경우에 사용한다.
  • 또한, 가중치 감소는 정규화의 효과를 볼 수 있다. 원래 손실 함수 값은 최적해 방향으로 가려하지만, 정규화 항은 다른 방향으로 가려고 하기에 최적해 부분이 아닌 정규화 항과 손실 함수의 접점이 해가 된다.
  • 전역 최적해는 과적합 일수도 있기에, 거기에서 떨어진 부분의 가중치를 사용하여 과적합을 방지하기에 정규화의 효과를 볼 수 있는 것이다.

스크린샷 2025-04-15 201714

  • 위의 그림을 보면 리지 회귀를 보면, 손실 함수가 어느 곳에 있던지 정규화 항이 원 모양이기에 접할 확률은 손실 함수가 어디에 있던지 동일하다.
  • 하지만 라소 회귀의 경우, 마름모 모양으로 꼭짓점 부분에서 접할 확률이 가장 높다. 이는 최적해가 특정 축 위에 있을 확률이 높다는 것이고, 나머지 축의 값은 0이 된다는 것이다. → 정규화 접근 방식의 “모델을 최대한 단순하게 만들기에 해당되고, 리지 회귀는 정규화 접근 방식의 “사전 지식을 표현해서 최적해를 빠르게 찾도록한다.”에 해당한다.

조기 종료

  • 조기 종료란 모델이 과적합되기 전에 훈련을 멈추는 정규화 기법이다.
  • 훈련 성능과 테스트/검증 성능을 비교하여, 이 둘의 차이가 벌어지는 부분 즉, 훈련 성능은 계속 향상하지만, 테스트/검증 성능은 향상 하지 않는 경우에 멈추는 것이다.(여기에서 성능은 주로 Loss나 평가 지표를 기준)
  • 이 때, 주의할 점은 모델의 성능이 향상하지 않더라도 바로 종료하는 것이 아니라, 몇 번 더 지켜본 뒤에 멈추는 것이다. 이것은 미니 배치로 근사한 그레디언트와 실제 그레디언트는 차이가 있기에 성능이 좋았다 나빴다 할 수 있기 때문이다.
  • 즉, 일시적인 성능 변동이 아닌 지속적인 성능의 정체나 하락이 보일 때, 종료하는 것이 좋다.
  • 조기 종료는 파라미터 공간을 작게 만들어, 크기를 제약시키므로 $L_{2}$정규화와 동일한 효과를 볼 수 있다.

    스크린샷 2025-04-15 204031


데이터 증강

  • 모델의 복잡도에 비해 충분한 훈련 데이터가 제공되지 않으면 모델이 데이터를 암기해서 과적합이 생기게 된다.
  • 이 과적합을 막는 가장 근본적인 방법은 훈련 데이터의 양을 늘리는 것이다. 훈련 데이터의 양이 크면 훈련 데이터의 오류는 약간 증가하지만, 테스트 오류는 감소하여, 일반화 오류 또는 과적합 정도가 줄어들게 된다.

    스크린샷 2025-04-15 212600

  • 하지만 데이터셋을 증가시키기 위해, 데이터를 더 수집하는 것은 어렵기에 기존의 가지고 있는 훈련 데이터 셋을 이용하여 새로운 데이터를 만드는 것이 데이터 증강이다.
  • 이렇게 증강한 데이터를 미리 훈련 데이터 셋에 추가하여 사용할 수도 있지만, 일반적으로는 훈련 과정에서 실시간으로 데이터를 증강한다. 이는 데이터를 확률적으로 변형하기에 무한히 많은 변형이 생길 수 있기 때문이다.
  • 가장 기본적인 데이터 증강으로는 훈련 데이터를 조금씩 변형해서 새로운 데이터를 만드는 방법이고, 여기서 좀 더 나아가면, 학습 데이터로 학습한 생성모델로 새로운 데이터를 생성하는 방법이 있다.
  • 증강 방법은 굉장히 다양한데 이때는 데이터의 종류와 문제, 하고자 하는 Task에 따라 고려하여 선택해야 한다.
  • 데이터 증강 시 주의할 점으로는 클래스 불변 가정을 따라야 한다. 이는 클래스의 결정 경계 안에서 데이터를 변형해야 하는 것으로 증강할 때, 클래스가 바뀌지 않도록 해야한다는 것이다.

배깅

  • 배깅은 여러 모델을 실행하여 하나의 강한 모델을 만드는 방법인 앙상블 기법 중 하나로 독립된 여러 모델을 동시에 실행한 뒤 개별 모델의 예측을 이용하여 최종으로 예측하는 방법이다.
  • 배깅은 모델의 종류와 관계 없이 다양한 모델로 팀을 구성할 수 있다. 단, 성능을 높이려면 모델 간의 독립을 보장해야한다.
  • 배깅에서는 모델 간의 독립을 더욱 보장하기 위해 모델 별로 부트스트랩 데이터를 사용한다. 부트스트랩이란 훈련 데이터에서 복원 추출하여 훈련 데이터와 같은 크기로 만드는 것이다.
  • 하지만 신경망 모델에서는 부트스트랩 안해도 된다. 랜덤한 값으로 가중치를 초기화 하고, 미니 배치를 사용하기에 모델 별로 다른 데이터 셋을 사용하는 것 같은 효과를 주기 때문이다.
  • 이 후, 추론 단계에서는 개별 모델의 결과를 집계하여 예측한다. 예를 들어, 회귀 문제에서는 예측 값들을 평균을 낸다거나, 분류 문제에서는 Voting을 사용하여 추론한다.
  • 배깅의 정규화 효과를 확인하기 위해 개별 모델의 예측 오차가 배깅에서 어떻게 줄어드는지 보자.

    스크린샷 2025-04-15 214122

  • 여기에서 $\epsilon_{i}$는 개별 모델의 오차이고, 개별 모델의 오차는 평균이 0이고, 분산이 $v$이고, 모델 간의 공분산을 $c$로 표현한 것이다. 위 그림에서는 배깅에 의해 오차가 줄었는지 확인하기 위해 오차의 분산을 구한 것이다.
  • 우선 개별 모델이 독립일 때를 가정하자. 그럼 공분산($c$)가 0이 될 것이다. 그럼 오차의 분산은 $\frac v{k}$가 되어 모델의 개수(k)에 비례하여 분산이 감소하게 된다.
  • 이와 반대로 개별 모델 간의 상관성이 커서 공분산($c$)와 $v$가 같다고 가정하면 오차의 분산은 $v$가 되어 오차의 분산이 개별 모델과 동일해진다.
  • 즉, 배깅으로 효과를 보려면, 개별 모델들이 독립이여야한다.

드롭아웃

  • 드롭 아웃은 미니 배치를 실행할 때마다 뉴련을 랜덤하게 잘라 새로운 모델을 생성하는 정규화 기법이다. 이 때, 각 계층마다 다른 드롭 아웃 확률을 지정할 수 있고, 각 계층의 각 뉴런들마다 지정한 확률로 살아 남는다.(주로 50% 이상으로 지정, 또한 입력과 은닉 뉴런에 지정, 입력은 더 높은 확률 부여, 출력에는 일반적으로 지정 X)

    스크린샷 2025-04-15 221018

  • 이는 확률적으로 뉴련을 지우기에 하나의 신경망 모델에서 다양한 모델을 생성하는 것으로 볼 수 있기에 배깅과 같은 효과를 볼 수 있다. 하지만 드롭아웃은 모델 간의 독립성이 보장되지 않는 문제가 있다.
  • 그렇다면 배깅과 드롭아웃을 비교해보면, 모델 간의 독립성을 보장하는 배깅보다는 드롭아웃은 성능이 떨어지겠지만 더 실용적이라는 장점이 있다.
  • 훈련 단계에서는 미니배치마다 베르누이 분포에서 각 계층의 뉴런별로 난수를 발생시켜 0과 1로 이루어진 이진 마스크를 생성한다. 이 이진 마스크를 해당 계층에 적용하여 마스크가 1인 부분은 살아남고, 0인 부분은 죽게 된다.
  • 추론 단계에서는 뉴런을 드롭아웃하지 않고 훈련 과정에서 확률적으로 생성했던 다양한 모델의 평균을 예측한다. 모델들의 평균을 구해보면 원래 output에 드롭아웃 확률(p)의 곱으로 나타나는 것을 알 수 있다. 즉 드롭아웃의 각 계층의 출력은 원래 출력에 드롭 아웃 확률(p)를 곱해주면 된다.
  • 위의 내용을 기반으로 했을 때, 훈련 시점에 각 계층의 출력을 미리 드롭아웃 확률(p)로 나눠주면 원래의 값을 그대로 사용할 수 있다. 이 방식이 역 드롭아웃이다. → $a^{(l)} = (a^{(l)} \bigodot r^{(l)}) / p$

잡음 주입

  • 데이터나 모델을 확률적으로 정의할 수 있다면 더 정확하게 추론할 수 있다. 하지만 데이터나 모델이 확률적으로 정의되지 않았다면 간단한 잡음을 넣어서 확률적 성질을 부여할 수 있다. 이것이 잡음 주입이다.
  • 잡음 주입 방식
    1. 입력 데이터에 잡음 주입
      • 입력 데이터에 잡음을 추가하는 것은 데이터 증강 기법에 해당하고, 아주 작은 분산을 갖는 잡음을 넣으면 가중치 감소와 동일한 정규화 효과를 볼 수 있다.
    2. 특징에 잡음 주입
      • 은닉 계층에서 추출된 특성에 잡음을 넣는 것으로 추상화된 상태에서 데이터 증강을 하는 것이다.
      • 추상화된 데이터에 확률적 성질을 부여하기에 상대적으로 의미 있는 단위로 데이터 증강이 일어나 성능이 크게 향상된다.
    3. 모델 가중치에 잡음 주입
      • 대표적인 예시가 드롭아웃이다. 드롭아웃에서 뉴런을 제거할 때 확률적으로 가중치를 조절하기에 가중치에 잡음을 넣는 것이라 볼 수 있다.

        스크린샷 2025-04-15 232705

      • 또한 최소 지점의 경사가 가파른 경우, 일반화 성능이 떨어질 수 있는데 가중치에 잡음을 넣으면 최소 지점 주변이 평평해져 일반화 성능이 향상된다.
      • 위의 그림에서 보면 경사가 가파른 곳의 최소값은 훈련 함수와 테스트 함수가 조금만 달라도 큰 차이를 내는 것을 볼 수 있기에 최소 지점이 평평한 곳에 있는 것이 좋다.
    4. 소프트 레이블링
      • 분류 문제에서 훈련 데이터의 레이블에 잡음을 주는 것이다. 예를 들어, [1, 0, 0, 0]의 라벨을 [0.7, 0.1, 0.1, 0.1]로 하는 것이다.
      • 레이블에 오차가 있을 경우, 모델이 정확히 1이나 0으로 예측하지 못하기 때문에 계속하여 일정한 손실이 발생하고 최적화가 이뤄지지 않을 수 있다.
      • 이를 일정량의 오차가 있다고 가정하여, 타겟 클래스의 확률을 줄이고, 줄인 만큼을 나머지 클래스에 분배하는 방식이다.(약간의 여지를 준다고 볼 수 있음) 이렇게 레이블에 오차를 반영한 후 학습하면 모델의 성능이 높아진다.