앞의 포스트에서 우리는 L2 정규화를 통해 모델이 학습 데이터에 과적합 되는 것을 막는 방법을 배웠습니다. 그럼 우리는 어느정도 정규화를 해야 좋은 모델을 얻을 수 있을까요?


이번 포스트에서는 정규화 항에 람다(Lambda)라는 정규화율(Regularization Rate)을 곱하여 정규화의 정도를 조정하는 것에 대해서 알아보도록 하겠습니다.


람다(Lambda)

람다(Lambda)란 얼마나 정규화를 할지 조정하는 정규화율(Regularization Rate)입니다. 

만약 람다 값을 높인다면 정규화 효과가 강화되어 아래와 같이 정규 분포 모양의 그래프가 그려집니다.


람다 값이 높은 모델 가중치 분포 그래프를 보면, 가중치의 평균 값에 가장 많은 빈도가 발생하는 뚜렷한 정규 분포의 모양을 나타내는 것을 알 수 있습니다.


만약 람다 값을 낮춘다면 아래와 같이 좀 더 평평한 모델 가중치 분포 그래프가 그려집니다.



단순성(Simplicity)과 학습 데이터 적합성(Training-Data-Fit)의 균형

우리가 적절한 람다 값을 선택할 때 고려해야하는 것은 바로 단순성과 학습 데이터 적합성 사이에 적절한 균형을 맞추는 것입니다.

  • 람다 값이 너무 높은 경우: 모델은 단순해지지만 데이터가 과소적합해질 위험이 있음
    => 모델이 학습 데이터에 대해 충분히 학습하지 못할 수 있음

  • 람다 값이 너무 낮은 경우: 모델은 더 복잡해지고 데이터가 과적합해질 위험이 있음
    => 모델이 학습 데이터의 특수성을 너무 많이 학습하게 되어 새로운 데이터로 일반화하지 못함


이번 포스트에서는 우리가 학습시키는 모델이 주어진 데이터 세트에만 과적합 되는 것을 방지하기 위해 정규화를 하는 방법에 대해서 다뤄보도록 하겠습니다.


위의 그림은 반복 학습 횟수에 대해 학습 세트(Training Data)와 검증 세트(Validation Data)의 손실을 일반화된 곡선으로 보여줍니다.


이를 보면, 학습 손실은 점차 감소하지만 검증 손실은 어느 순간부터 증가하는 것을 나타냅니다. 즉, 이 일반화 곡선은 모델이 학습 세트에 과적합되어 있다는 것을 의미합니다.



정규화를 통한 과적합 줄이기

정규화란, 모델의 복잡도에 패널티를 줌으로써 과적합을 줄이는 것을 말합니다. 정규화 전략에는 크게 2가지가 있습니다.

  • 조기중단: 학습 데이터에 대해 손실이 특정 값에 수렴하기 전에 학습을 중단하는 방법
    => 위의 그림에서 검증 세트에 대한 손실율이 올라가는 지점, 즉 학습 데이터에 대해 손실율이 수렴하기 전에 학습을 중단하는 것입니다.

  • 모델 복잡도에 패널티를 부여: 학습하는 동안 모델에 패널티를 주어 학습 데이터에 과적합하지 않게 복잡성을 줄이는 방법

다음으로 모델 복잡도에 패널티를 부여하여 모델을 일반화하는 정규화 방법을 알아보도록 하겠습니다.


경험적 위험 최소화 -> 구조적 위험 최소화

우리는 이전까지 모델이 데이터에 대해 발생하는 손실을 최소화하는 것만을 목표로 삼았습니다. 이를 경험적 위험 최소화라고 합니다.


경험적 위험 최소화(Empirical Risk Minimization): minimize( Loss( Data | Model ) )


경험적 위험 최소화 방법은 학습 데이터에 대한 최소 손실을 알려주지만, 학습 데이터에만 과적합한 모델이 될 수 있습니다.]

이제부터 우리는 손실을 최소화하는 목표에 모델의 복잡도를 낮추어 좀 더 일반화된 모델을 만드는 목표를 추가하도록 하겠습니다. 이를 구조적 위험 최소화라고 합니다.


구조적 위험 최소화(Structural Risk Minimization): minimize( Loss( Data | Model ) + complexity( Model ) )


지금부터 우리의 학습 최적화 알고리즘은 모델이 데이터에 얼마나 적합한지 측정하는 손실 항(Loss Term)과 모델 복잡도를 측정하는 정규화 항(Regularization Term)의 함수가 됩니다.


모델 복잡도를 정의하는 방법

본 머신러닝 스터디 과정에서는 일반적으로 사용되는 2가지 방법으로 모델 복잡도를 표현할 것 입니다.

  • 모든 특성(Feature)의 가중치(Weight)에 대한 함수
    => 가중치의 절대값이 낮은 것을 더 선호(높은 절대값을 사용하는 특성 가중치는 낮은 절대값을 사용하는 특성 가중치보다 더 복잡함)

  • 0이 아닌 가중치를 사용하는 특성(Feature)의 총 개수에 대한 함수
    (차후 포스트에서 이 접근 방식을 다룸)

이번 포스트에서는 정규화 방법 중 L2 정규화(L2 Regularization)공식에 대해서 알아보도록 하겠습니다. 



L2 정규화(L2 Regularization)

L2 정규화란, 가중치의 제곱의 합에 비례하여 가중치에 패널티를 주는 정규화 방법입니다. 즉, 가중치가 클수록 큰 패널티를 부과하여 과적합을 억제하는 것 입니다.

L2 정규화 공식을 통해 복잡도를 수치화할 수 있습니다.



이 공식에서 0에 가까운 가중치는 모델 복잡도에 거의 영향을 미치지 않는 반면, 어떤 값이 비이상적으로 크다면 큰 영향을 미칠 수 있습니다.


L2 정규화를 통해 가중치들은 전체적으로 고르고 작은 값을 선호하게 됩니다. 만약 튀는 값(이상점)이 있거나 전체적으로 가중치의 크기가 커지면 정규화 손실(R(w))값이 커집니다.

https://de-novo.org/tag/regularization/


L2 정규화가 모델에 끼치는 영향

  • 가중치 값을 0으로 유도(정확히 0은 아님)
  • 정규 분포(종 모양)를 사용하여 가중치 평균을 0으로 유도


ML 엔지니어에게는 유저로 부터 수집된 여러 데이터들이 주어집니다. 이러한 데이터들 중에는 유저의 실수 혹은 서버의 오류와 같은 문제들로 인해 나쁜 데이터가 있을 수 있습니다. ML 엔지니어들은 일반적인 데이터의 상황과 다른 나쁜 데이터를 찾아 정제하는 과정을 수행하여야 합니다.


이번 포스트에서는 나쁜 데이터를 정제하는 방법에 대해서 다뤄보도록 하겠습니다.


특성 값 조정(Scaling feature values)

조정(Scaling)이란, 수집된 특성 값을 0~1 또는 -1~+1의 표준 범위로 변화하는 것을 말합니다. 만약 특성이 하나인 데이터 세트에서는 조정(Scaling)하는 과정이 불필요하겠지만, 데이터 세트가 여러 특성으로 구성되어 있다면 특성 조정(Feature Scaling)을 통해 다음과 같은 이점을 누릴 수 있습니다.


  • 더 빠르게 경사하강법이 수렴함
  • 'NaN(Not a Number) 트랩'이 방지됨
  • 모델이 특성의 적절한 가중치를 익히는데 도움이 됨
     

모든 특성을 동일한 범위로 할 필요는 없습니다. 예를 들어 특성 A는 -1~+1, 특성 B는 -3~+3으로 조정해도 큰 문제는 없습니다. 하지만 특성 B만 -1000~+1000과 같이 너무 큰 차이가 나게 설정을 하면 모델이 적절한 가중치를 찾지 어려울 것입니다.


극단적 이상점 처리(Handling extreme outliers)

우리에게 주어지는 데이터 중에 비이상적으로 튀는 값이 있을 수 있습니다. 아래의 예시는 1인당 몇 개의 방을 가지고 있는지를 나타내는 그래프입니다.

위의 그림을 보면, 1인당 평균 방의 개수가 50개인 유독 튀는 한 점을 볼 수 있습니다. 이러한 데이터는 데이터 수집 단계에서 유저 혹은 서버의 문제로 인해 발생한 이상점입니다.


이러한 극단적 이상점이 주는 영향을 최소화하는 방법은 두 가지가 있습니다.

  • 모든 값에 로그를 취해(Logarithmic scaling) 값의 범주를 줄임
  • 특정 값에서 잘라(Clipping), 이를 넘어서는 값은 잘라낸 값으로 인식함

왼쪽의 그림은 모든 값에 로그를 취해 전체 값의 범주를 줄인 모습입니다. 오른쪽 그림은 원래의 데이터 중 4가 넘는 값을 잘라내어 모두 4로 인식시킨 모습입니다.


비닝(Binning)

한국의 위도에 따른 상대적인 주택 분포를 나타내는 데이터가 아래의 그림과 같이 주어졌다고 생각해 보겠습니다.

주어진 데이터에서 위도(Latitude)는 부동 소수점 값입니다. 하지만, 이 모델에서 위도는 주택 수와의 선형적인 관계가 없기 때문에(위도를 나타내는 숫자와 주택 수는 아무런 관계가 없음으로), 위도를 부동 소수점 특성(floating-point value)으로 표현할 수 없습니다.


예를 들어, 위도 35도에 위치한 주택이 위도 34도에 위치한 주택보다 35/34 만큼 싸거나 비싸지는 않습니다. 그러나 각각의 위도 값은 주택 가격을 예측하는 좋은 지표가 될 수 있습니다.


위도를 부동 소수점 값이 아닌, 하나의 지표로 이용하기 위해서 여러 '빈(Bin)'으로 나누겠습니다.

Binning 이란, 연속적인 하나의 특성을 Bin이라고 하는 그룹의 특성으로 변환하는 작업.(연속적인 값을 일정한 크기의 범주로 나누는 것)


위의 그림은 위도를 11개의 빈(Bin)으로 나눈 것(LatitudeBin1, LatitudeBin2, ..., LatitudeBin11) 입니다. 이렇게 하면 위도 32.6도를 다음과 같이 원-핫 벡터로 표현 할 수 있습니다.

[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]


이렇게 비닝(Binning)을 이용하면 모델에서 각 위도에 따라 완전히 다른 가중치를 학습시킬 수 있습니다.


스크러빙(Scrubbing)

ML을 진행하면서 우리에게 다루는 데이터로 100% 신뢰할 수 있는 데이터만 주어지지는 않을 것 입니다. 아마 다음과 같은 문제를 갖고 있는 데이터 세트를 주로 접하게 될 것입니다.

  • 값 누락(Omitted Value): 유저가 실수로 연령 정보를 입력하지 않았을 수도 있습니다.
  • 중복 예(Duplicate Examples): 서버에서 같은 정보를 실수로 두 번 업로드 했을 수도 있습니다.
  • 잘못 된 라벨(Bad Labels): 사용자가 고양이 사진에 실수로 강아지 라벨을 지정했을 수도 있습니다.
  • 잘못된 특성 값(Bad Feature Values): 사용자가 숫자를 실수로 입력했을 수도 있습니다.
일반적으로 위와 같은 잘 못된 예를 발견하면 데이터를 삭제하는 데이터 세트 수정과정을 거침니다. 값 누락과, 중복 예 같은 경우 간단한 프로그램을 통해 탐지 하기 용이하지만, 잘못 된 라벨, 잘못 된 특성 값을 탐지하기는 매우 까다롭습니다.

철저한 데이터 파악

철저한 데이터를 파악을 위해 다음의 규칙을 항상 상기하여야 합니다.

  • 정상적인 데이터가 어떠한 모습이어야 하는지 항상 생각하자
  • 데이터가 예상과 일치하는지 확인하고, 그렇지 않다면 그 이유를 파악하자
  • 학습 데이터가 대시보드 등의 다른 소스와 일치하는지 확인하자


+ Recent posts