본문 바로가기
딥러닝/모두를 위한 딥러닝 2

02-05 regression 이론

by 혜 림 2021. 3. 24.

deeplearningzerotoall.github.io/season2/

 

모두를 위한 딥러닝 시즌 2

Deep Learning Zero To All - Season 2 page

deeplearningzerotoall.github.io

 

1. 회귀란?

 

우리는 데이터 모두를 가지고 이야기하지 않는다.

이번에 학생들 성적 분포는 어떤가요? 라고 하면

A는 국어가 80점이고요 B는 국어가 70점이고요.... 이런 식으로 모두를 나열하지 않는다.

대신, 평균이 85점이예요. 로 말한다.

왜냐하면 평균이 데이터 전체를 대표할만한 값이기 때문이다. 

 

평균은 가장 대표적인 대푯값이다.

계산하기도 수월하고, 이해하기도 직관적이다.

그래서 회귀는, 우리가 추정하는 독립변수와 종속변수 간 모종의 함수가 평균으로 회귀한다는 데서 출발한다. 

 

2. 단순 선형 회귀

 

 아래의 그림을 어떤 데이터의 산점도라고 하자. x는 독립변수고, y는 종속변수다.

 관측 개체의 값들을 모두 점으로 찍은 그림을 산점도라고 하는데, x와 y 사이의 선형적인 관계를 보여주는데 효과적이다.

 그림에서 x와 y는 어떤 타원적인 관계를 가지고 있는 것처럼 보인다.

 

 회귀의 목적은 독립변수에 대한 어떤 함수로 y를 예측하는 것이다. 그 함수의 종류에 따라서 선형 회귀, 로지스틱 회귀 등으로 나뉜다. 

 선형 관계를 나타내는데 효과적인 산점도를 가져왔으니, 예측했다시피 이번에 보고자 하는 것은 선형 회귀다. 

 

 

 

선형회귀라고 부르는 것은 변수들을 선형적으로 연결한 함수를 쓰기 때문이다. 

함수가 계수(coefficient)와 변수의 곱들의 합으로 나타내진다. 

가장 간단하게 변수가 하나 존재하는 것부터 생각해보자. 

그럼 함수의 형태는 y= ax+b 가 된다. (표기할 때는 b대신에 베타_0, a 대신에 베타_1을 사용한다)

그리고 이 경우를 단순 선형 회귀 simple linear regression 이라고 한다.

 

즉, 변수가 하나만 존재하는 선형 회귀식을 의미한다. 

 

하지만 본고에서는 위와 같이 쓰겠다 

만약에 변수가 여럿인 경우는 다음과 같이 쓰면 된다.

베타들은 계수, x들은 변수다.(행렬로 표현할 수 있으며 곧 다룰 것이다.)

 

방금 쓴 수식은 나중에 더 보기로 하고 잊어버리자. 

 

다시 단순선형회귀로 돌아와서, 

아래의 그림처럼 우리는 단순선형회귀를 이용하여 다양한 직선을 만들 수 있다. l1, l2, l3가 그것이다.

 

직선을 만드는 데는 아무 문제가 없다.

하지만 다음과 같은 질문이 생기기 마련이다: 셋 중에서 어떤 직선을 택해야 하는가? 

 

 

3. 최적의 직선 찾기 

 

3.1 cost 함수 

그래서 직선들을 비교하기 위해서 우리가 도입한 것이 cost다. 

cost를 재는 방법에는 다양한 것들이 있지만, <모두를 위한 딥러닝2>에서 제시하는 방법은 다음과 같다. 

 

 

그림에서 노란색으로 표현한 것들은 예측된 값(직선 위의 값)과 실제 값(직선 밖의 값, 그러나 독립변수는 동일함)의 차이다. 

예측된 값, 추정한 값을 통계학에서는 ^ (hat)을 씌워서 표현한다.

'구'래서 통계학 수업에선 모자를 써도 된다.^^(난 이 농담이 제일 웃기더라'구'..)

그래서 아래와 같이 표현할 수 있다. 

 

 

예측값
예측값과 실제값의 차이

그럼 이 잔차들을 어떻게 해야할까?

단순히 더할 수는 없다. 모든 잔차들의 합은 0이 되기 때문이다. 

대신, 우리가 분산을 구할 때처럼 제곱해서 평균을 내는 방법을 취한다.

 

 

여기서 n은 샘플(관측 개체)의 수다. 

비용함수의 이름은 cost라고 하고, w와 b의 값에 따라 비용함수의 값이 바뀐다.

따라서 그 둘이 위 함수에서는 변수이기 때문에 cost의 인자로 들어간다.

(한편 xi와 yi값들은 여기서 상수다. 이미 관측된 값이기에 우리가 아는 값이기 때문이다.)

 

여러 직선들을 그릴 수 있음에도, cost 함수값을 기준으로 우리는 최적의 직선을 선택할 수 있다!

 

3.2 cost 함수의 최소화: 경사하강법 

그렇다면 우리는 이제 직선들을 비교할 '기준'으로서 cost 함수값을 이용할 것이다.

cost값이 높으면? 예측값과 실제값의 차이가 많다는 뜻이기에 그 직선을 선택하지 않을 것이다.

cost값이 낮으면? 예측값과 실제값의 차이가 적다는 뜻이기에 그 직선을 택할 것이다.

 

 따라서 우리가 해야 하는 것은 cost 함수의 최소화 다. 

 

고등학교 미적분을 배우면서 우리는 극솟점을 어떻게 찾았는가?

미분을 통해 도함수가 0이 되는 지점을 찾았다.

똑같이 적용하면 된다!

 

 하지만 문제가 발생한다. 여기서 변수는 w와 b, 총 2개이기 때문에 통상 알던 미분으로는 할 수가 없다.

 그래서 gradient의 개념을 필요로 한다. 

 

 

그렇다면 gradient는 어떻게 구하는가?

쉽게 편미분의 모임이라고 생각하면 된다.  

사용하는 표기는 다음과 같이 바뀐다. x에 대해서 f를 미분한다는 뜻이다. 

 

그래서 변수가 여러 개 있는 경우, gradient는 다음과 같은 형태를 취한다. 

 

기하학적인 의미는 y값이 최대로 증가하는 방향이다.

2차함수에서 gradient의 의미를 생각해보자. 

위 2차 함수의 점 a에서는 미분계수 값(gradient라고 생각하면 된다)은 양수가 된다. 즉 더 큰 함숫값이 양의 방향으로 있다는 것이다. 한편 점 b에서는 미분계수 값이 음수인데, 실제로도 b로부터의 음수 방향에 더 큰 함숫값이 존재한다. 

 

 

우리는 cost의 최소값을 찾는 것이 목표다. 그런데 gradient는 함숫값이 증가하는 방향이라고 했다. 

따라서 비용함수의 최소값을 찾기 위해서는  gradient의 반대방향(-)로 가면 된다. 

 

여기까지가 경사하강법의 대강적인 원리다.

구체적으로 들어가면 다음과 같은 순서를 따른다.

 

1. 임의의 포인트를 잡는다.

        - 이 포인트가 나중에 큰 영향을 줄 수도 있다.

 

2. gradient의 영향력을 정한다.

        - gradient의 반대방향으로 '얼마나' 갈 것인지를 정한다.

        - learning rate라고 하며 아래의 수식에서는 알파에 해당한다.

 

3. (1)에서 설정한 포인트에서의 gradient를 구한다.

4. 임의의 포인트에서 learning rate*gradient값만큼 이동시켜준다. (방향은 gradient 부호의 반대)

5. (1) -(4) 의 과정을 반복한다. 

6. 극소를 찾는다 / 어떠한 조건을 만족시키면 종료한다. 

더보기
처음 지정하는 값이 왜 중요한가?

 

cost 함수가 2차 이상이라고 해보자. 그러면 그림과 같이 극솟값을 가지는 지점이 2이상이 있을 수 있다. 

만약 우리가 처음 포인트를 A라고 잡으면 어떻게 되는가? 가까운 극솟점인 A*로 수렴할 것이다.

만약 B로 잡으면? B*에 수렴할 것이다.

 

 

learning rate는 왜 중요한가?

 

 

이때 하강하는 길이가 점점 짧아지는 걸 볼 수 있다.

극솟점에 가까워질수록 gradient는 0에 가까워질 것이기 때문이다. 이는 곧 w가 움직이는 거리 역시 줄어드는 것을 의미한다. 

 

Gradient에 learning rate을 곱한만큼 하강한다.

그럼 learning rate가 크면 어떻게 될까?

그만큼 점이 움직이는 거리가 커질 것이다.

 

확 움직이기 때문에 위와 같이 움직일 것이다.

지금 위치로부터 극솟점이 멀리 있을 것이라면 learning rate를 크게 잡는 것이 중요하다.

 

 

 

이제 경사하강법을 알았으니, 실제로 단순 선형회귀에서는 어떻게 적용되는지 보자.

우선 계산하기 간단하게 절편항(b)를 빼고 고려하자. 

 

다음과 같이 cost를 구할 수 있다. 

우리는 cost의 최소값을 비교하기 위해서 이를 계산하는것이지, 실제로 절대적인 값은 의미가 없다.

따라서 분모에 2를 곱해준다. 나중에 계산하기 편함을 위해서다.

그럼 아래와 같다. 

 

4번의 과정을 수식으로 나타내면 다음과 같다. 

이런 식으로 w를 갱신해가며 최적의 직선을 택한다. 

 

 

그러나 주의해야 할 점이 하나 있다면, cost 함수가 오목한 함수여야 한다는 것이다. 

즉 convexity를 만족해야 한다는 것인데, 이를 이해하기 위해서 반대의 경우인 볼록한 함수를 상상해보자.

 

 

 

만약 gradient의 반대 방향으로 가면 어떻게 되는가? 한없이 미끄러질 뿐이다. 

화살표의 길이가 달라보이는건 착각이다. 방향에만 집중하자!

 

convexity에 대해서 정확한 이해를 원한다면 아래의 링크를 참고하자. 

 

 

4. multi variable linear regression

가끔식 한국어보다 영어가 혼동을 줄여주는 경우가 있다. 

 

지금까지 독립 변수가 1만 존재하는 단순한 경우를 살펴보았다.

하지만 현실은 어떤가? 어떤 결과에 영향을 끼치는 요소가 하나만 있을까?

존재하긴 하지만 매우 작을 것이다.

 

그래서 우리는 현실적인, 여러가지 변수를 고려하는  multi variable linear regression 을 사용한다. 

중간고사 시험 성적을 공부시간, 휴대폰을 한 시간, 잠을 잔 시간을 통해 예측하는 경우를 생각해보자.

 그럼 이런 테이블을 그릴 수 있다.

Y는 종속변수인 성적, X1 X2 X3는 독립변수인 공부시간, 폰하는 시간, 잠자는 시간이다.

그렇다면 변수가 여럿일 때는 어떻게 선형함수를 쓰는가?

앞에서 잠깐 언급했듯이, 우리는 이를 변수와 계수의 곱들의 합으로 나타낼 수 있다.

 

 테이블의 각 열을 위의 직선에 대입하면 다음과 같다.

좀 더 간단하게 나타내고 싶다. 그래서 행렬 곱셈을 도입한다.

즉, 이런 식이다.

 

행렬의 곱으로만 표현한다면, 이후의 내용은 앞서서 한 단순 선형회귀의 비용함수 줄이기 과정과 동일하다. 

 

 

 

5. 로지스틱 회귀Logistic regression

우리는 지금까지 연속형 변수를 종속변수에 두고 생각했다. 하지만 명목형 변수가 온다면?

그때 우리가 사용하는 것은 logistic regression 이다. 

 

명목형 변수는 binary(0과 1만을 가지는 값)나 multi-class로 구분할 수 있다.

시험에 통과했다, 못했다 와 같이 두 개의 답이 나온다면 => binary

아시아, 유럽, 아메리카 등 두 개를 넘어선 답이 나온다면 => multi class

 

그렇지만 이런 '통과했다', '낙제했다' 와 같은 단어들을 결과값으로 돌리기에는 무리가 있어보인다.

그래서 간단한 숫자 (0,1) 로 고치는 데 이를 인코딩 encoding이라고 부른다.

만약에 multi class라면 (0,1,2...)의 형태로 갈 것이다.

 

한편 logistic regression 에서는 0과 1로만 나뉘어지는, binary인 경우만 가능하다

 

/*그 이유에 대해서 간단하게 설명하기 위해 1과 2 그리고 3으로 인코딩된 경우를 상상하자.

그럼 이때 생기는 문제점은, 1과 2 사이에 1만큼의 차이가 발생하고 2와 3 사이에 1만큼의 차이가 발생하며 1과 3사이에 2만큼의 차이가 발생한다는 것이다. 또 1은 2보다 작고 3은 1보다 크다. 하지만 실제로 생각하면 아시아가 유럽보다 낮은 것은 아니며, 아메리카가 유럽보다 높은 것도 아니다. 즉 원래 우위가 없는 변수들 사이에 우위가 생긴다는 것이다. 또한 어떤 변수들의 차이는 다른 변수들의 차이와 그 크기가 다르다는 점에서 또다른 왜곡이 생긴다. */

 

x축은 시험 성적이라고 하고 y축은 결과라고 하자. (이때 Y의 값은 각각 0은 낙제, 1은 통과로 인코딩 된 변수다.)

위의 그림을 보면 우리는 앞서 봤던 단순선형 회귀 분석과 다른 점을 쉽게 깨달을 수 있다.

y값이 0이나 1 외의 값을 가지지 않는다는 것이다!

앞서 사용했던 단순 선형회귀를 저 그림 위에 그린다면, cost가 크고 또 어떻게 보면 낭비라는 생각이 든다.(예측하는 y 값의 범위가 너무 넓으므로)

그래서 우리는 대신 다른 형태의 함수를 고민하게 된다. 

 

바로 위와 같은 형태다. y값이 (0,1)을 경계값으로 가지는 함수다. (물론 그 사이의 값을 얼마든지 가질 수는 있다)

이를 sigmoid 함수 라고 부른다.

그림을 통해서 알 수 있듯이, x값이 어느 시점에서는 완전히 0이고 완전히 1인 지대가 존재한다.

그리고 중간에 섞인 지대 역시 존재한다.

 

로지스틱 회귀 함수를 만든 후, 우리는 새로운 데이터 셋으로 결과를 예측하고 싶을 것이다. 

완전히 0이고, 1인 시점에서는 y값을 예측하는데 아무 문제가 없을 것이다. 위의 함수를 그대로 쓰면 된다.

그렇다면 그 중간지대는 어떻게 할 것인가? 

 

여기에서 우리는 임계값threshold을 정해준다.

y값이 0.5를 넘으면 class 1로 판단하고, 0.5를 못 넘으면 class 0로 판단하는 형태다.

여기서 기준이 되는 0.5가 바로 임계값이다. 

 

이 정도의 이론을 <모두를 위한 딥러닝2>에서는 다루고 있지만, 실은 그 수식이 한 번쯤 궁금할만도 하다.

어떻게 저런 그래프 모양이 나오는거지? 하는 나같은 궁금증을 가진 사람을 위하여... 그래서 나온

 

+) 부록

수식 쓰는게 너무 재밌다

 

우리는 종속변수를 예측하기 위해서, 독립변수들의 함수를 만든다. 

그게 바로 f(X)인데, 그 형태가 조건부확률 이다. 

즉 X라는 독립변수의 값이 주어졌을 때 y가 k class에 속할 확률은 어떻게 되는가?

이게 우리가 구하고자 하는 함수의 정체라는 것이다. 

그래서 우리는 y hat에

조건부확률을 최대화하는 k값을 넣어준다.

즉 90점이라는 시험성적이 주어졌을 때, 시험에 통과(1)할 확률과 시험에 낙제(0)할 확률을 비교한다는 것이다.

(*상식을 잠깐 활용해서) 조건 X가 주어졌을 때 class 1 에 속할 조건부확률과  class 0 에 속할 조건부 확률을 비교한다.

이를 통해서 우리는 결과를 예측한다.

(*argmax_k f(k)는 k에 대한 함수 f(k)를 가장크게 하는 k값 을 의미한다)

 

그렇다면 cost는 어떻게 구하는가?

이제보니 lab05-2에 있었지만 아래가의 방식이 좀 더 이해하기 쉬울 거라고 생각한다.

MSE는 cost함수의 종류 중 하나라고 생각하면 된다. 실은 우리가 위에서 쓴 것도 cost 함수도 MSE(Mean squared error)다.

여기서 I_k는 지시 함수indication function를 의미한다. 

i번째 개체에 대해서 괄호가 성립하면 1을, 그렇지 않으면 0을 할당한다. 

즉 이때의 MSE는 예측값과 실제값이 다른 데이터 갯수의 비율을 의미한다. 

 

 

앞에서 언급했듯이 우리는 조건부확률을 이용해 명목형 변수의 값을 예측한다고 했다. 

역시 우리는 선형적으로 함수를 만들 수 있다.  

그렇지만 이 형태는 음수의 값도 가진다. 확률이 0보다 작다니 말도 안 된다. 

그래서 다음과 같이 지수함수의 function 으로 넣어준다. 

그러나 여전히 마음에 들지 않는다. 확률의 범위인 (0, 1)을 벗어나기 때문이다. 

아래의 조치를 다시 한 번 더 취해준다. 

휴...

그러나 우리가 구해야 하는 것은 b_0, b_1인데 사족이 너무 많다.

그래서 아래와 같은 형태로 구한다. 

그럼 우리는 선형적으로 구할 수 있다.

이때 좌변을 logit of P(X)라고 한다. 

그래서 MSE는 다음과 같이 계산된다.

class k 의 샘플이 class k일 확률은 이상적으로 1이라는데서 기인한다. 

그러나 위의 방식으로 계산하기에는 다소 어렵기 때문에 우리는 대신, 
tensorflow 코드는 아래에서 최대우도추정법 maximum likelihood estimation 을 쓴다. 

여기는 너무 통계학적인 내용으로 들어가므로 생략한다. 

원한다면 수리통계학을 듣자. 진짜 재밌는 학문이다. 

 

 

 

 

hyelimkungkung.tistory.com/6?category=935192

 

02-05 regression 코딩

 

hyelimkungkung.tistory.com

 

댓글