juuuding

[Supervised Machine Learning: Regression and Classification] Regression with multiple input variables - Gradient descent in practice 본문

인공지능/코세라 머신러닝 특화과정

[Supervised Machine Learning: Regression and Classification] Regression with multiple input variables - Gradient descent in practice

jiuuu 2023. 10. 19. 20:53

 Feature Scaling

 

 경사 하강이 빠르게 실행될 수 있도록 하는 "feature scaling"에 대해서 알아볼 것이다. 

 

[Feature and parameter values]

 집 값을 정하는 feature가 집의 크기와 방의 수라고 가정하면 집 값을 결정하는 모델의 식은 다음과 같다.

 여기서 x1은 집의 크기이며 x1의 범위는 300-2000이고, x2는 방의 수이며 x2의 범위는 0-5이다. 이와 같이 feature들의 범위가 크게 차이가 나면 parameter w의 값을 조절해주는 것이 좋다. feature의 값이 큰 곳에 큰 w 값을 넣고 작은 곳에 작은 w을 넣어줘야 할지, 값이 큰 곳에는 작은 w을 넣고 작은 곳에 큰 w을 넣어야 할지에 대해 나눠서 비교해보자.

 

House: x1=2000, x2=5, price=$500k 라고 가정한다.

 

① x가 큰 곳에 큰 w값. x가 작은 곳에 작은 w값 -> w1=50, w2=0.1, b=50

  price=50*2000 + 0.1*5 + 50

  price=$100,050.5k -> $100,050,500 😞

 

② x가 큰 곳에 작은 w값. x가 작은 곳에 큰 w값 -> w1=0.1, w2=50, b=50

  price=0.1*2000 + 50*5 + 50

  price=$500k -> $500000 😊

 

 위에서 보다시피 두 번째 경우가 더 합리적인 것을 알 수 있다.

 

[Feature size and gradient descent]

 

① x가 큰 곳에 큰 w값. x가 작은 곳에 작은 w값일 때에 w 값에 따른 cost function

 w1을 조금만 움직여도 cost function이 급격하게 변하고, w2는 아주 많이 움직여도 cost function이 잘 변하지 않게 된다.

 

② x가 큰 곳에 작은 w값. x가 작은 곳에 큰 w값일 때에 w 값에 따른 cost function

  Global minimum에 도달할 수 있는 더 직접적인 경로를 찾기 쉽다.

 

[Feature scaling]

 

 결론적으로 feature들 간에 범위 값이 크게 차이 난다면 Gradient descent을 하기 어려워지는 것을 확인했다. 따라서 둘의 범위 차이를 줄여주도록 하는 과정이 필요한데, 이를 "Feature scaling"이라고 부른다. 아래에서 3가지 feature scaling 방법에 대해 알아보자.

 

① 범위의 최대 값으로 나누기

  300 ≤ x1 ≤ 2000, 0 ≤ x2 ≤ 5

  x1,scaled = x1/2000

  x2,scaled = x2/5

  0.15 ≤ x1,scaled ≤ 1, 0 ≤ x2,scaled ≤ 1

 

② 평균 정규화

  300 ≤ x1 ≤ 2000, 0 ≤ x2 ≤ 5

  x1,scaled = x1 - Mu1 / 2000 - 300

  x2,scaled = x2 - Mu2 / 5 - 0

 -0.18 ≤ x1 ≤ 0.82

 -0.46 ≤ x2 ≤ 0.54

* Mu1: x1의 평균

  Mu2: x2의 평균

 

③ z-score 정규화

 300 ≤ x1 ≤ 2000, 0 ≤ x2 ≤ 5

 표준편차1 = 450, 표준편차2 = 1.4

 x1 = (x1-Mu1) / 표준편차1

 x2 = (x2-Mu2) / 표준편차2

 -0.67 ≤ x1 ≤ 3.1

-1.6 ≤ x2 ≤ 1.9

 

5 feature 예시

 위의 예시들처럼 범위가 너무 크거나 작아 feature끼리 차이가 많이 난다면, -1~1에 가까운 범위로 rescale 하는 것이 좋다.

 

 

 Checking Gradient Descent for Convergence

 

 경사 하강을 위해 J(w,b)를 반복하였는데 이 값이 증가한다면, alpha 값이 너무 크거나 코드에 버그가 있을 수 있다는 의미이다. 경사 하강이 제대로 작동한다면 반복할수록 값이 감소해야하며 결론적으로 converged 되어야 한다. 하지만 경사 하강법에서 수렴 때까지의 반복 횟수를 아는 것은 매우 어려우므로, 모델 학습 완료 시기를 결정할 수 있는 "Automatic convergence test"를 실행하는 방법이 있다. 

 

[Automatic convergence test]

 ① epsilon을 10^(-3) = 0.001 로 둔다

 ② 만약 경사 하강을 한 번 반복했을 때 J(w,b)가 epilon 값(0.001) 이하로 감소한다면 convergence라고 할 수 있다.

 

 

 Choosing the Learning Rate

 

 alpha를 잘못 설정한다면 경사 하강이 제대로 실행되지 않을 것이다. alpha가 너무 크다면 아래와 같은 과정으로 cost function이 증가 (overshoot)할 것이고, alpha가 너무 작다면 경사 하강이 아주 느리게 작동할 것이다. 

여기서 한 가지 팁으로 경사 하강이 잘 작동하지 않는 경우, alpha를 아주 작은 수로 설정하여 cost function이 감소하는지 확인하는 방법이 있다. 만약 cost가 증가하는 경우가 있다면 코드에 버그가 있다는 의미이므로 코드를 확인하여야 한다. 

 예를 들어 alpha를 0.001 과 같이 작은 수로 설정한 다음 약 3배씩 증가시키며 경사 하강이 잘 작동하는지 확인하고, 잘 작동하는 alpha 값 중 가장 큰 값 or 그 값보다 약간 작은 값을 선택하면 좋은 learning rate(alpha)을 고를 수 있다. 

0.001 -> 0.003 -> 0.01 -> 0.03 -> 0.1 -> 0.3 ->1 ....

적절한 alpha 값 설정하기

 

 

 Feature Engineering

 

 집의 가격을 정하는데  frontage, depth 두가지 feature이 존재한다고 가정하자. 하지만 frontage와 depth를 별개의 특징으로 집의 가격을 정하는 것보다 이 두가지 특징을 모두 활용한 면적을 기준으로 가격을 예측하는 것이 더 효과적이라는 것은 누구나 생각해볼 수 있다. 

 위의 아이디어처럼 문제와 관련한 지식/직관을 사용하여 기존의 특징을 변형하거나 결합하여 새로운 특징을 만드는 것을 "feature engineering"이라고 한다. 

 x1 : frontage,  x2 : depth

(원래 식)

 f_w,b(x) = w1*x1 + w2*x2 +b

 

(feature engineering)

 area = frontage * depth

 x3 = x1*x2

f_w,b(x) = w1*x1 + w2*x2 + w3*x3 +b

 

 

 Polynomial Regression

 

 이때까지 배웠던 다중 선형 회귀와 feature engineering의 아이디어를 바탕으로 polynomial regression이라는 새로운 알고리즘을 생각해볼 수 있다. 다음과 같은 주택 데이터 집합이 있다고 가정했을 때, 이 데이터 집합에는 직선이 잘 맞지 않는다는 것을 확인할 수 있다. 그렇다고 해서 2차 함수를 적용시키면 x인 size가 증가하였을 때 y인 price 줄어드는 현상이 나타날 것이다. 그래서 3차 함수를 선택하면 1차, 2차 함수보다 이 데이터에 잘 맞는 곡선을 만들 수 있다. 다음의 예시에서 x1은 크기, x2는 (크기)^2, x3는 (크기)^3이다. 이와 같은 feature engineering으로 거듭제곱을 이루는 특징을 만들면 feature scaling이 점점 더 중요해질 것이다. 1 ≤ x1 ≤ 10^3 , 1 ≤ x2 ≤ 10^6, 1 ≤ x3 ≤ 10^9 에서 알 수 있 듯, 특징들의 범위가 아주 많이 차이나기 때문이다. 그렇기 때문에 경사 하강을 이용하는 경우에는, feature scaling을 적용하여 그 특징들을 비교 가능한 값의 범위로 가져오는 것이 중요하다.

 이러한 방법에 또 다른 합리적인 방법이 있다. x의 제곱근을 이용하는 것이다. 제곱근은 x가 커질수록 덜 가파르지만 완전히 평평해지지는 않으며, 절대 다시 내려오지 않는다는 특징이 있다. 이러한 특징은 이 데이터 집합에도 잘 맞는 모습을 확인할 수 있다.