Lecture 3 - Locally Weighted & Logistic Regression | Stanford CS229: Machine Learning (Autumn 2018)
이번 강의 주요내용
- Linear Regression(Recap 지난시간내용)
- Locally Weighted Regression(지역가중회귀)
- Probabilistic Interpretation(확률 해석)
- Logistic Regression(로지스틱 회귀)
- Newton's method(뉴턴 방법)
Linear Regression(Recap 지난시간내용)
- (x^(i), y^(i)) : 입력 x값중 i번째 값(또는 백터)과, 출력 y값중 i번째 값을 의미한다. i 번째 예시라고 한다.
- x^(i) ㅌ R^n+1 : 입력 x의 i 번째는 전체행렬(R^n+1) 의 일부이다.
- y^(i) ㅌ R : 출력 y의 i번째는 전체행렬(R) 의 일부이다.
- m : 전체 예시 수
- n : 전체 입력항목(feature)의 수
- 선형회귀 모델 : hθ(x) = ∑ j=0,m θj xj = θ^T X (단, θ0 = 1)
- 비용합수 : J(θ) = 1/2 ∑ j=0,m ( hθ(xj) - yj )^2
지난 강의에서는 위의 내용들을 공부했고 이를 통해 기계학습 모델을 만드는 방법을 배웠습니다. 즉, 선형회귀 모델을 이용해서 2차원의 데이터에 대한 최적의 모델을 찾는 방법을 공부했습니다. 최적의 모델을 찾기 위해서는 실제 값과 모델이 출력한 값의 차이를 최소화하는게 필요합니다. 그래서 이런 차이 값을 계산하는 비용합수(코스트 함수, Cost Function)을 정의할 수 있고, 이 함수에 훈련 데이터를 하나씩 대입하면서 나온 차이들의 전체합을 최소화 시키는 파라메터(세타 theta θ)를 찾는 방법으로 Gradient Descent를 알아 보았습니다.
- θj := θj - α 편미분(θj) * J(θ)
- θj := θj - α ( hθ(x) - y ) * Xj
- θj := θj - α ∑ i=1,m ( hθ(x(i)) - y(i) ) * x(i)j
Locally Weighted Regression(LWR)
그런데 1차원, 2차원 정도가 아니라 복잡한 선형인 경우 어떻게 해야할까요?
파라메타(Parametar, 모수: 평균,분산,표준편차 등) 를 정하는 방법에 따라 크게 두가지 학습방법으로 나뉩니다.
파라메트릭 학습 알고리즘(Parametric Learning Algorthm)은 주어진 데이터를 가지고 최적의 파라메타(모수)를 찾아 정하는 방법입니다. 지난 시간에 배운 선형회귀 방법이 그 예입니다.
비파라메트릭 학습 알고리즘(Non-Parametric Learning Algorthm)은 주어지는 데이터의 양에 따라서 파라메타 값을 누적해가면서 파라메타를 찾고 정의하는 방법입니다.
LWR은 비파라메트릭 방법중 하나로 그 컨셉은 이름에 나와있는 것처럼 로컬에 중심해서 회귀선을 만들고 추정하는 방법입니다. 이 내용을 그래프와 함께 설명해 줍니다. 선형회귀 에서와 같이 최적의 세타(θ)값을 찾는것이 아니라 지역에서 찾는 것입니다.
LWR은 그림에서 처럼 x값이 주어졌을 때 특정 구간을 기준으로 직선(공식/모델)을 만들고 이것에 따라 추정/예측하는 방법입니다. 이렇게 만들어주는 가중치를 찾는 것이지요. 즉, x 값과 가까운 것에 많이 신경쓰고 멀리 있는 것은 신경을 덜 쓰도록 만드는 것입니다. 이부부은 마치 딥러닝에서 어텐션(Attention) 방법이나 NLP에서 Word 2 Vec/n-gram 같은 것을 연상하게 합니다.
LWR = ∑ i=0,m W(i) ( y(i) - θ^T x(i) )^2
가중치 행렬은
W(i) = exp(- (x(i) - x)^2 / 2 τ(tau)^2 )
입니다. exp(지수) 표현이기 때문에 (x(i) - x) 값이 작아지면 W(i) 값이 1에 가까워지고 반대로 커지면 0에 가까워집니다. 일반적으로 그리고 기본적으로 사용되는 공식이라고 합니다. 이공식은 가우시안 분포와 같은 종모양의 분포를 따릅니다. 그래서 아래와 같은 그림이 그려집니다.
수평축에 x가 주어졌을때 그래프 상에 표시된 관측치(X표시)의 y 값을 그대로 사용하는게 아니라 하단에 있는 종모양의 녹색 선에 해당하는 가중치를 적용하여 계산하는 것입니다. 이렇게 계산할때 변수가 되는게 x 주변 좌/우 어디까지의 범위를 기준으로 w를 찾을 것인가 입니다. 이 범위의 크기에 따라서 모델이 오버피팅(over fitting) 또는 언더피팅(under fitting) 됩니다. 그리고 가우시안 형태만이 아니라 여러가지 다른 함수를 이용할 수 있다고 합니다.
Probabilistic Interpretation
왜 제곱오차를 이용할까요?
주택 가격예측 예시를 기반으로 선형회귀 모델을 만들어보면 아래와 같습니다.
y(i) = θ^T x(i) + e(i)
e(i)는 자연 발생한 오차를 말하는데 정규분포(가우시안분포)를 따른다고 가정합니다. 그리고 데이터 샘플들이 각각 IID(Independently and Identically Distributed)하다고 가정합니다. 각각 독립적이고 서로 영향을 안준다는 의미입니다.
이러한 가정은 x가 주어졌을 때 y의 값을 (x와 θ가 적용된) 변형 가우시안 분포에서의 확률로 구할 수 있다는 의미입니다. (이말은 정규 분포를 가정했을때 실제 값에 매우 가까운 값을 (MLE를 통해) 구할 수 있다는 것 입니다. MLE를 쉽게 말하면 정규분포를 가정하에 관측치를 기반으로 가장 가능성 높은 실제 값을 구하는 방법입니다. )
P(y(i) | x(i); θ) = 1 / √2πσ * exp(- ( y(i) - θ^T x(i) )^2 / 2 σ^2 )
(31:00) 용어 중 혼동하기 쉬운 것이 확률(Probability)과 가능도(Likelihood) 입니다.
probability of data : 파라메터가 정해진 경우 입력 데이터를 바꾸어 가면서 나온 값을 확률 이라고 부릅니다.
likelihood of theta : 입력 데이터를 고정된 것으로 생각하고 파라메터를 변경해가면서 나온 값을 가능도/우도 라고 합니다.
MLE(Maximum Likelihood Estimation) 38:12
MLE란 L(θ) : Likelihood of theta 이고 l(θ) : log likelihood of theta(L(θ)에 log를 적용한 것) 일때 l(θ)를 최대화 시키는 θ를 찾는 것입니다.
L(θ) : Likelihood of theta. l(θ) : log likelihood of theta
결국 제곱 오차를 사용하는 것이 가우시안분포를 가정한 확률분포상의 가능도를 MLE로 계산하는 것과 같은 효과를 나타냅니다. 일상 대부분의 데이터가 정규분포를 따르고 있다는 가정에서 모델과 파라메타를 정규분포로 가정하는 것은 자연스러운 가정이고, 따라서 정규분포 기반의 MLE계산이나 제곱 오차가 같은 효과를 나타낸다는 것은 말이 되는 것 같습니다.
Logistic Regression
Classification 43:20
y 벨류가 0, 또는 1인 분류 문제에 대해서 설명합니다. 이처럼 2개 분류가 있는 것을 바이너리 분류(Binary classification)이라고 합니다. 분류 문제에 선형회귀를 적용하는게 안좋을 때가 많습니다. 특히, 아웃라이어가 아니면서 차이가 큰 특이한 x 값을 훈련 데이터에 포함하는 경우 선형회귀의 직선이 특이한 x값을 제외했을 경우랑 매우 다른 모양이 되어 정확한 분류가 안되는 경우가 있습니다. 그래서 교수님은 분류 문제에 선형회귀를 안쓰신다고 하네요.
그래서 분류에 가장 많이 사용되는 로지스틱 회귀(모델)에 대한 설명을 해주십니다.
hθ(x) ∈ [0, 1]
(For values of h subscript tehta of x lies in the set from 0 to 1)
즉, 모델이 x을 입력으로 받아서 0, 또는 1을 출력해야 합니다. 그래서 계산은 어떻게 되더라도 주어진 값을 0또는 1로 만드는 함수인 g(z)함수(시그모이드 함수, 로지스틱 함수)를 만들어서 적용합니다.
hθ(x) = g(θ^T x) = 1 / (1 + e^(-θ^T x))
g(z) = 1 / (1 + e^-z) : sigmoid function, logistic function
이러한 함수를 다시 확률로 바꾸어서 종양의 양성과 음성을 분류하는 경우를 설명해 보면 다음과 같습니다.
P(y = 1 | x; θ) = h(x) - 공식(1)
: 변수 x와 θ가 주어졌을 때 양성(y=1)일 확률은 모델이 x를 가지고 예측한 값과 같다.
P(y = 0 | x; θ) = 1 - h(x) -공식(2)
: 변수 x와 θ가 주어졌을 때 음성(y=0)일 확률은 1에서 모델이 x를 가지고 예측한 값을 뺀 것과 같다.
y ∈ {0, 1} : 즉, y가 0또는 1만 가능하므로 위의 두 식을 아래와 같이 하나로 합칠 수 있습니다.
P(y | x; θ) = h(x)^y * (1- h(x))^1-y - 공식(3)
(위 공식에서 y=1 이라고 가정하고 계산해 보면, 모든 수의 영제곱(^0)은 1이기 때문에 (1-h(x))^1-y가 1이 되서 계산 결과 값이 h(x)가 나오게되며 결국 이것은 공식(1)과 같습니다. 반대로 y=0이면 공식(2)와 같아집니다.)
상기 내용을 기반으로 세타의 최대 유사도 공식을 구해보면 아래와 같이 됩니다.
L(θ) = P(->y | x; θ) = ∏i=1,m p(y(i) | x(i); θ) 여기에서 p(y(i) | x(i); θ) 대신에 위의 공식(3)을 적용해 보면
= ∏i=1,m h(x(i))^y(i) * (1- h(x(i)))^1-y(i) - 공식(4)
선형회귀때와 마찬가지로 여기에 로그를 적용한 공식으로 바꾸면 아래와 같습니다.
l(θ) = Log L(θ) = ∑i=1,m y(i) log h(x(i)) + (1- y(i)) log (1-h(x(i))
로그 함수는 단조증가함수 이기 때문에 l(θ)를 최대화 시키는 θ를 찾는 것이나 L(θ)를 최대화 시키는 θ를 찾는 것이나 같은 의미입니다. 그래서 결국l(θ)를 최대화 시키는 θ를 찾는 것이 목표이며 이를 위해 Batch Gradient Descent를 수행합니다.
θj := θj + α 편미분(θj) * l(θ) - 공식(5)
이것은 선형회귀에서 했던 θj := θj - α 편미분(θj) * J(θ) 와 비교해보면 +/- 기호가 다르고 l(θ)/J(θ)가 다릅니다. 다른 이유는 선형회귀에서는 함수의 오차를 최소화 시키는 θ를 찾아야 하는 것이고, 로지스틱 회귀에서는 유사도를 최대화 시키는 θ를 찾아야 하기 때문입니다.
공식(5)의 편미분(θj) * l(θ) 부분을 실제로 미분하면 아래와 같습니다.
θj := θj + α ∑i=1,m (y(i) - hθ(x(i)) * x(i)j) - 공식(6)
지난 시간에 배웠던 선형회귀의 Gradient Descent공식(θj := θj - α ∑ i=1,m (hθ(x(i)) - y(i)) * x(i)j )와 비교해보면 부호가 다르고 차이를 구할때 y - h(x)를 할지 아니면 h(x)-y를 할지가 다릅니다. 위에서 선형회귀는 분류 문제에 적합하지 않다고 했는데 왜 위의 공식에서는 선형회귀와 유사한 공식이 사용될까요?
바로, GD 공식은 동일하게 2차원곡선(아래로 오목: convex 또는 위로 볼록: concave)으로 결국 최저점 또는 최고점을 찾는 공식이기 때문에 그렇습니다. (순서가 바뀐 것은 likelihood를 구할 때 분류 문제이기 때문에 확률 1에서 모델이 계산한 값을 빼는 방법으로 계산이 필요해서 바뀐 것 같습니다.)
Newton's method (1:05:55)
설명을 위해 새로운 예를 사용합니다.
우리가 원하는 것은 f라는 함수인데, 이 함수는 가중치(세타θ) 가 주어졌을 때 0을 반환하는 함수 입니다.
f(θ) = 0
이렇게 만드는 θ를 찾기를 원하고 있는 거죠. 이를 위한 비용함수 l(θ)의 최대값을 찾는 것이지요.
이말은 예를 들면 함수를 log likelihood 함수의 미분(ㅣ'(θ))이 0이되는 θ를 찾는 것이 됩니다. 즉,
f(θ) = l'(θ) = 0
(지금 우리가 원하는 것은 Gradient Descent 와 같이 특정 조건을 만족시키는 값을 찾기 위한 반복 알고리즘 입니다.)
x1 이 주어졌을때 f(x1) 값을 가지고 미분하여 가로축과 만나는 x2를 알수 있고 다시 x2로 이동하고 이를 이용하여 f(x2)계산해서 x3의 위치를 알 수 있습니다. 이러한 방법으로 계속해나가면 빠르게 0과 만나는 점을 찾을 수 있습니다. 이러한 방법이 뉴튼의 방법 입니다.
아래는 위키에 정의된 뉴턴 방법입니다.
"수치해석학에서, 뉴턴 방법(영어: Newton's method)은 실숫값 함수의 영점을 근사하는 방법의 하나이다. 뉴턴-랍슨 방법(영어: Newton–Raphson method)이라고도 불린다."
위에서 글로 설명했던 내용을 공식으로 정리한 판서 내용 입니다. 시간(t)에 계산된 theta에서 기울기를 기준으로한 변화량 델타(delta, △) 만큼을 빼서 시간(t+1)의 값(위치)를 찾아내고 이를 반복합니다.
이것은 Quadratic Convergence 라는 특징을 갖는데, 예를 들면 첫번째 에러가 0.01 error라고하면 다음 반복에서 0.0001 error가 발생하고 그 다음 반복에서 0.00000001 error가 발생한다. 빠르게 낮은 에러로 접근한다 는 것입니다. 즉, 엄청 빠르게 수렴한다는 것입니다. 그래서 Gradient Descent와 다르게 빠르게 변수를 찾을 수 있습니다.
단점은 큰 행렬을 전환해야한다는 것입니다. 그래서 파라메타 수가 작으면 (보통 50개 이하인 경우) 연산이 빠르지만 더 많으면 백터 연산이 오래걸려서 비효율적입니다. 이럴땐 Gradient Descent를 쓰는게 더 효과적이라고 합니다.
아래는 강의 영상 링크입니다.
https://www.youtube.com/watch?v=het9HFqo1TQ&list=PLoROMvodv4rMiGQp3WXShtMGgzqpfVfbU&index=3