본문 바로가기

카테고리 없음

[ML] Learning rate, 데이터 전처리, Overfitting(과적합)

반응형

이번 포스팅에서는 머신러닝을 모델링할 때 중요시되는 3가지에 대해서 알아보고 머신러닝 모델링할 때 팁을 알아보려고 한다. 3가지는 다음과 같다.

1. Learning Rate(학습률)

2. Data preprocessing(데이터 전처리)

3. Overfitting(과적합)

<1. Learning Rate>

학습률이라 함은 우리가 앞서서 같이 봐왔던 여러 회귀분석 모델에서 Cost값을 최소화시키기 위해 Gradient Decent 알고리즘을 사용했고 이 때 최소의 Cost값을 찾아가기 위해서 임의의 정도의 Step을 설정해주어야 한다고 했었다. 그림을 보면 기억이 날 것이다! 

Learning Rate는 최소의 Cost값을 찾아가기 위한 Step이다

위 그림 속 빨간색 알파값이 바로 Learning Rate이다. 그러면 모델링을 하는 사람이 알파값을 크게 또는 작게 줄 때 대체 어떤 일이 발생할까? 한 번 알아보자.

 

우선, 알파값이 매우 클 때를 생각해보자.

Overshooting

학습률이 매우 클 때 위의 그림 속 빨간 선처럼 최소의 Cost값을 찾지 못하고 양쪽을 왔다갔다 하다 결국 튕겨나가는 '발산'의 상태가 발생할 것이다. 그렇다면 학습률을 매우 작게 설정했을 때는 어떻게 될까?

Very small learning rate

매우 작게 설정하면 경사면을 매우 작은 보폭으로 하강하다가 결구 너무 오랜 시간이 걸리고 중간의 어느 지점에서 멈춰버린다고 한다. 그렇다면 대체 어떻게 하면 적당한 Learning rate를 설정할 수 있을까?

try! try! try!

해결방법은 계속 시도해보는 것이다. 즉 최초로 임의의 학습률(알파값)을 설정하고 Cost 함수를 관찰해보면서

Cost값이 발산해버린다면 이전의 학습률 보다는 작게, 반대로 Cost값이 엄청 조금조금씩 감소한다면 이전의 값보다는 좀 크게 하면서 몇 번의 시도를 하면서 적당한 학습률을 찾아가야 한다는 것이다.

 

<2. Data preprocessing(데이터 전처리)>

다음은 데이터의 전처리이다. 즉, 머신러닝을 모델링하고 이 머신러닝에 input으로 집어넣을 데이터들을 좋게 사전작업한다는 의미이다. 왜 이러한 작업들이 필요할까? 밑의 그림처럼 데이터의 값들이 서로 크기가 너무 다르다면 그래프는 다음과 같이 불균형하게 나타날 것이고 Cost값은 발산하고 말 것이다.

 

데이터 전처리의 필요성

 

그렇다면 데이터 전처리를 하기 위해 쓰는 방법에는 뭐가 있을까? 대표적으로 2가지가 있다. 

 

데이터 전처리 방법

우선 그림 속 가운데에서 보는 것처럼 가장 중앙의 데이터를 '0' 값에 위치시킴으로써 raw data를 zero-centered data로 만들어 주는 것이다. 또한 가장 많이 쓰는 방법으로 데이터를 정규화 시켜주는 것이다. 즉, 넓은 범위로 흩어져 있는 raw data를 일정의 범위를 정하여 그 사이에 데이터들이 놓이도록 하는 것이다. 여기서 정규화는 우리가 고등학교 수학시간에 배운 '정규화' 와 똑같다. " 정규화 = (데이터값 - 평균) / 분산 " 이 된다. 그림 속 맨 밑 줄은 Python으로 정규화를 표현하는 식이다.

 

정규화(Normalization=Strandardization)

 

<3.Overfitting(과적합)>

저번학기에 DSC 머신러닝 스터디를 하면서 과적합의 개념에 대해서 다룬적이 있었다. 다시 또 이 개념이 튀어나왔는데 아마 모든 머신러닝 모델에서 가장 빈번하게 발생하는 문제이기도 하면서 해결해야할 문제이기 때문에 과적합에 대한 해결이 머신러닝 모델링을 잘하는 방법 중 하나로 꼽히는 것 같다. 

 

우선 과적합이란 무엇인가에 대해서 간단히 살펴보자

과적합(Overfitting)이란?

"모델이 과적합하다" 라는 말은 그야말로 모델이 학습(훈련) 데이터 셋을 너무나 잘 학습을해서 오히려 테스트(검증) 데이터나 실제사용에는 적용되지 않는 것이다. 다시 말해서 훈련 데이터 셋에만 적용되고 보편적으로 외부의 데이터는 잘 예측하지 못한다는 의미이다. 그렇다.. 심각한 문제점이다..

 

어떤 모델이 좋은걸까?

그렇다면 두개의 선형회귀 중 어떤 모델이 과적합이 발생한 것일까? 바로 빨간색 선이다. 빨간색 회귀선은 모든 훈련 데이터셋에 각각 가중치를 약하고 강하게 알맞게 두어 구불구불한 회귀 선이 되버린다. 즉 훈련 데이터를 너~무나도 100% 잘 구분한다는 것이다. 결론적으로 두 개의 모델 중 성능이 좋은 모델은 과적합이 없는 파란색 모델이다.

 

과적합 해결법은?

그렇다면 과적합을 막기 위해서는 어떻게 해야할까? 3가지 방법이 있다.

  1. 더 많은 훈련 데이터 훈련시키기
  2. Feature의 수 줄이기
  3. 일반화(Regularization)

1,2번의 해결방법은 글자 그대로 이해할 수 있을 것이다. 그렇다면 3번인 일반화에 대해서 알아보자. 일반화 한다는 것은 우리가 위의 두개의 선형회귀 중 구불구불하면서 모든 훈련 데이터를 구분할 수 있는 빨간색 회귀선을 보았는데 이 때 구불구불한 부분을 펴준다는 의미이다. 이렇게 말하면 직관적으로 이해가 갈 거라고 믿는다..(아니면 댓글 달아주세요 ㅜㅜ)

일반화의 정의

데이터 요소에 너무 큰 가중치를 두어선 안된다는 것이다.

Cost함수 + 가중치

그렇다면 일반화를 어떻게 사용할까? 바로 Cost(Loss) 함수 뒤에 하나의 수식을 더해주면 된다. 그건 바로 그림 속 노란색 형광펜의 부분인데 W는 여기서 가중치를 의미한다. 즉 W제곱을 시그마로 다 더해준 후 시그마 바로 앞에 있는 상수(Regularization strength)에 높은 숫자를 부여함으로써 "난 일반화를 강하게 시켜줄거야! " 할 수 있고 0.001같은 숫자나 0을 부여함으로써 "난 일반화 거의 안하거나 아예 안할래" 라는 식으로 해줄 수 있다. 

 

즉 저렇게 일반화 수식을 더함으로써 Cost함수를 정의해준다면 모델의 Overfitting 문제를 예방할 수 있을 것이다.

그리고 저 Cost함수를 Gradient Decent알고리즘을 이용해서 Cost값을 minimizing 시켜주면 된다.

반응형