본문 바로가기
머신러닝

[머신러닝 이론] 4. 다변수 선형회귀 - 앤드류응 강의

by jasNote 2022. 5. 15.

 

4. Linear Regression with Multiple Variables

 

4.1. Multiple Feature

다변수 함수의 표현방법

학습을 위한 데이터의 feature는 무수히 많을수 있다. 주택가격을 예측한다고 해보자. 주택가격을 결정하는 feature로 주택크기, 방의 개수, 층수, 주택나이 등 무수히 많다. 아래의 예시처럼 주택가격을 예측할때 왼쪽의 단변수 모델보다 오른쪽의 다변수의 모델이 더 설득력이 있을 것이다.

 

다변수 표기법을 보자. 변수x 아래 첨자에 숫자를 쓴다. x1은 주택크기, x2는 방의 개수, x3는 층수,  x4는 주택 나이, y는 주택가격으로 가설 함수를 예측하는 변수들이다.

 

테이블에 4개의 feature와 학습 데이터가 있다. 이것을 선형대수로 표현할 수 있다.

  • n : Feature의 개수
  • m : 학습데이터의 개수
  • x^(i) : i번째 학습데이터
  • x^(i)j : i번째 학습데이터의 j번째 컬럼 값
  • x^(2)3 : 2

 

다변수 선형 회귀의 가설함수 계산 방법

다변수 선형회귀 가설함수를 행렬로 표현하고 계산할 수 있다. 행렬X는 feature, 행렬θ는 파라미터이다. 가설함수는 아래와 같이 방정식으로 표현되기 때문에 행렬곱으로 계산이 가능하다.

  • X혹은 θ를 전치하게 되면 행렬곱이 가능하다. (θ^(T) * x로 표현 가능)
  • y절편과 유사한 바이어스항θ0가 필요하기 때문에 x0를 추가하고 1을 대입한다.

아래와 같이 행렬을 전치하여 행렬곱을 한다면, x가 무수히 많은 다변수 선형회귀의 가설함수 계산이 가능해진다.

 

4.2. Gradient Descent For Multiple Variables

다변수의 비용함수

단변수의 비용함수 J(θ)의 경사 하강법 공식과 다변수의 비용함수 J(θ0, θ1, θ2, … , θn)의 경사 하강법 공식은 동일하다. 다변수 함수의 비용함수는 n+1의 벡터를 갖고, x0=1이기 때문에 일변수의 비용함수와 동일하다. 예를들어 두개의 피처(x1, x2)를 갖게 됐을때 x0에 1을 대입하여 업데이트 하기때문이다.

4.3. Gradient Descent : Feature Scaling

Feature Scaling하는 이유

다수의 feature를 다룰때 주의점있다. 피처들의 범위가 비슷할 때 경사하강법은 최저값에 빠르게 수렴한다. 하지만 feature들의 범위가 크게 다르다면 오랜시간 동안 구불구불하게 이동할 것이다. 왼쪽 이미지와 같이 특징의 범위가 크게 다르게 되면 비정상적인 타원이 형성될수 있으며, 최저값 수렴에 지장을 줄 것이다. 그렇기 때문에 오른쪽 이미지와같이 특징들의 범위를 어느정도 같게하여 비용함수가 원의 형태를 띄는 것이 목표이다. Feature Scaling은 경사하강 알고리즘을 더 빨리 동작할 수 있도록 도와준다.

Mean Normalization이란

모든 특징의 범위를 대략 -1 <= x <= 1 로 만들어주는 것이좋다. 이때 하는 작업이 데이터셋 정규화이며 mean normalization(평균 정규화)를 한다. 평균이 0이 되도록 스케일링 하는 것이다. x1은 평수, x2는 방 수이다. 평수와 방 수는 단위부터 일치하지 않아 크게 차이가 나기 때문에 정규화를 한다. 

4.4. Gradient Descent : Learning Rate

학습률의 영향과 적절한 값을 찾는 방법

학습률 α가 매우 작으면 비용함수 J(θ)는 천천히 최소값에 수렴할 것이고, 학습률 α가 매우 크다면 비용함수 J(θ)는 감소하지 않거나 수렴하지 않을 것이다.

 

y는 비용함수, x는 경사하강법 횟수이다. 경사하강법을 계속하여 업데이트 했을때 A,B는 최소값에 어느정도 수렴하고 있지만 C의 값은 점점 커지고있다. 

  • A : 적절한 α값으로 빠르게 최소비용에 수렴했다.
  • B : 매우작은 α값으로 최소비용에 수렴했지만, A보다는 오래걸렸다.
  • C : 매우큰 α값으로 비요함수의 값이 점점 커지고 있다.

때문에 적절한 학습률 α를 찾는것이 중요하다. 앤드류 응이 학습률 α를 구하는 방법은 아래와 같다.

  1. 학습률 α의 가장 작은값과 가장 큰값을 찾는다.
  2. 가장큰값 or 가장큰값 보다 조금 작은 값에서 시작
  3. 학습률 α값을 점차 낮추면서 학습률 α를 찾는다. (3~10배 씩 감소)

 

4.5. Feature and Polynomial Regression

피처와 가설함수 선택의 중요성

문제에 따라 기존 특징을 사용하기보다 새로운 특징을 만드는 것이 더 효과적일 수 있다. feature x1은 주택의 가로길이, feature x2는 주택의 세로길이 일때 feature 2개를 그대로 사용하기보다 ‘가로 X 세로’인 평수를 새로운 feature로 만드는 것이 현명하다.

 

집값의 데이터가 아래 빨간색x표시와 같을때 직선보다는 곡선의 가설이 적절할 것이다. 이때 2차함수 곡선을 그린다고 가정하면 평수가 어느 이상 커졌을때 집값이 하락하는 가설이 세워진다. 평수에 비례하여 집값이 저렴해지는 매물은 없기 때문에 적절한 가설이 아니다. 그럼 3차함수 곡선은 어떤가? 2차함수 보다는 적절한 가설이 세워진다. 하지만 세 피처(x, x2, x3)는 매우 다른 범위의 값을 갖기 때문에 피처 스케일링이 반드시 필요하다. 이 처럼 가설의 함수를 선택하는 것도 중요한 작업이다.

참고
사실 여기서 적절한 함수는 루트함수이다. 루트함수는 완만한 곡선을 그리며, 주택 크기가 클수록 주택가격은 상승하지만 절대로 낮아지지는 않는다.

여러개의 피처가 있을때 어떻게 합칠지 혼란스러울수도 있지만, 이후 자동으로 피처를 합쳐주는 알고리즘도 배운다. 그 알고리즘은 자동으로 2차함수나, 3차함수 혹은 다른 함수들 중 알맞은 것을 선택해준다. 하지만 그 알고리즘을 배우기 전에 피처를 활용하는 다양한 방법을 알아야한다. 데이터에 적합한 새로운 피처를 고안할 줄 알아야 적합한 가설을 찾을수 있기 때문이다.

 

4.6. Normal Equation

경사 하강법은 비용함수 J(θ)가 전역 최소값에 수렴하기 위해 많은 스텝과 반복을 하는 알고리즘이다. 정규방정식은 J(θ)의 최소값에 해당하는 파라미터 θ를 한번에 구하는 공식이다.

 

경사하강법과 정규방정식의 장단점을 비교해본다.

경사하강법은 학습률α를 선택하고 반복적인 업데이트를 요구하지만 정규방정식은 학습률α이 필요없으며 한번에 값을 구할수 있다. 반면에 피처개수 n이 많을때 경사하강법은 잘 동작하지만, 정규방정식은 n*n개수 만큼 역행렬 계산하기 때문에 느려질 수 있다.

 

그러므로 피처가 많다면 경사하강법, 피처가 적다면 정규방적식을 이용하면된다. 피처개수 n의 역행렬을 계산할때 현대 컴퓨터 계산능력을 고려해본 시간이다. (참고)

  • n이 100 단위일 때 100 X 100 행렬의 역행렬은 쉽게 계산합니다.   
  • n이 1,000 단위일 때 1,000 X 1,000 행렬의 역행렬은 쉽게 계산합니다. 
  • n이 10,000 단위일 때 10,000 x 10,000 행렬의 역행렬은 느리지만 계산합니다. 고민이 필요합니다.
  • n이 100,000 단위일 때 100,000 x 100,000 행렬의 역행렬은 확실히 오래 걸립니다.
다수의 피처를 갖는 가설이 hθ(X) =  θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x4 +... 일 때 

정규방정식 계산은 θ = (X^T *X)^-1 * X^T * y 이다.

 

 

4.7. Normal Equation Noninvertibility

Normal Equation Noninvertibility(정규 방정식의 비가역성)이란 수학적으로 역행렬이 존재하지 않을때를 말한다. 역행렬이 존재하지 않는 이유는 대체로 2가지이다.

  • 선형적으로 종속된 피처들
    • 예를들어 주택가격을 예측하기 위한 피처x1은 주택크기로 평방피트 단위이고, x2는 같은 주택크기이지만 단위가 제곱미터이다. 단위는 다르지만 이렇게 서로 연관된 특징을 사용했을때 역형렬이 존재하지 않는다.
  • 너무 많은 피처를 가진 학습알고리즘을 다룰때
    • 학습데이터개수m 보다 피처의 개수 n이 훨씬많을때 역행렬이 존재하지 않는다.

하지만 역행렬이 존재하지 않는 경우에도 올바르게 계산해주는 함수가 있기때문에, 라이브러리를 잘 사용해서 해결하면 문제는 되지 않는다.