본문 바로가기
언어/Python

[Machine Learning] 텐서플로우 딥러닝 - 2. Simple Linear Regression과 TensorFlow 로 구현 (edwith)

by 민-Zero 2020. 4. 7.
edwith[부스트코스] 텐서플로우로 시작하는 딥러닝기초 강의를 통해 공부한 내용을 요약˙정리한것입니다. 

Simple Linear Regression

Regression : 후퇴, 퇴보, 되돌아가다
"Regression toward the mean" : 전체의 평균으로 되돌아간다. '어떤 데이터들이 크거나 작은 데이터들이 나와도 전체적으로 봤을 때 전체 평균으로 되돌아가려는 속성이 있다.'라는 통계적 원리를 설명한다. Sir Francis Galton (1822 ~ 1911)

 

https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80


Linear Regression

선형회귀는 종속변수 y와 한 개 이상의 독립변수 x의 선형 관계를 모델링하는 것이다. 

Simple Linear Regression

독립변수 x가 단일 개 일 때의 모델링을 말한다. 즉, x와 y라는 데이터를 가장 잘 대변하는 직선의 방정식을 찾기 위해

y = ax + b의 기울기와 y절편을 구하는 것이다.

 

Hypothesis


가설이라는 뜻을 가진 단어로 회귀분석에서 H(x) = Wx+b를 통해 H(x)라는 여러 가지 가설을 생성하고 그중 가장 데이터를 잘 대변하는 W(Weight), b(bias)를 설정하기 위한 가설 함수이다.


H(x) - y의 값은 가설을 통해 얻은 값과 실제 값의 차이로 해당 값이 작을수록 데이터가 가장 잘 대변된다. 이 값을 cost, error, loss라고 한다.
이때 코스트가 음수, 양수가 모두 나올 수 있어서 최소인지 확인하고자 모든 코스트를 합할 때 최소가 아닐 수 있다.

따라서 코스트를 제곱해서 더한 뒤 전체 데이터의 개수가 m이라면 m으로 나눈 코스트의 평균을 통해 최소 코스트인지 판별한다. 이 제곱들의 전체 평균을 가지는 cost(W, b)를 비용함수로 자주 사용한다.

 

따라서 최종 목적인 데이터를 가장 잘 나타내는 직선의 방정식을 찾기 위해서는

W와 b의 함수인 비용함수를 최소로 만드는 W와 b를 찾아야 한다.

 

앞에서 정리한 Hypothesis 함수를 통한 simple leanear regression을 tensorflow를 통해 수행해보자.

① tensorflow를 사용하기 위해 import시킨후 x, y데이터를 준비한다. 해당 데이터는 x값과 y값이 동일한 데이터로 y=x그래프의 데이터임을 알 수 있다.

 

② 선형회귀분석을 위해 가설함수 Hypothesis의 기울기와 절편인 W와 b를 임의의 값으로 초기화한다. 이미 데이터가 y=x 그래프를 따라가는 것을 알고 있기 때문에 W, b의 값이 1, 0에 가까워 지는지 확인하면 된다.

 

③ 가설함수는 hypothsis = W * x_data + b로 1차함수 모양을 만들수 있도록 생성하고 cost함수는 앞서 정리한것 처럼 cost의 제곱의 평균으로 설정한다. 이때 제곱값을 구하기위해 tf.square(n)함수를 사용하였는데 해당 함수는 입력받은 값의 제곱값을 반환하는 함수이다.

평균값은 tf.reduce_mean() 함수를 사용하였다. 이때 reduce라는 이름이 붙은 이유는 아래와 같다.
v = [1, 2, 3, 4]
tf.reduce_mean(v)  # 2.5 반환 
reduce는 줄어들다는 뜻으로 차원이 하나 줄어들다, 랭크가 줄어들다 라는 의미로 사용된다. 1차원 변수 v를 입력받으면 0차원인 실수값을 반환하므로 차원이 줄어서 reduce라는 명칭이 붙었다.

 

④ cost함수를 최소화 하는 알고리즘은 여러가지가 있지만 여기서는 Gradient descent 알고리즘을 사용했다.

Gradient-경사 descent-하강 경사하강 알고리즘이라고 하여 기울기를 점점 줄여가며 W, b를 찾는 방법이다. 해당 알고리즘을 구현하기 위해 미분값을 구하는 GradientTape()을 사용하였다. 보통 with 구문과 같이 사용되는데 해당 구문안에 있는 변수들의 변화를 tape에 기록하고 tape.gradient(y, x) 명령으로 변수형 텐서 x에 대한 함수 y의 미분값을 계산한다. 계산한 미분값을 저장하고 W, b의 값을 업데이트한다. assign_sub()함수와 앞서 선언한 learning_rate를 사용하는데 learning_rate는 이 gradient 값을 얼마만큼 반영할 것인지를 결정하는 비율로 해당 비율이 크다면 기울기가 크게크게 변화시킬것이고 작으면 작을수록 기울기가 조금씩 변한다. 따라서 해당 값은 대체로 0.01, 0.001처럼 작은값을 사용하며 A.assign_sub(B) 함수는 A = A-B | A -=B 의 연산을 수행하는 함수로 적용되는 기울기의 크기를 W, b에서 빼주어 기울기의 하강을 수행한다.

 

⑤ W와 b를 for문을 통해 여러번 업데이트를 수행하기 때문에 각 횟수별로 W, b, cost의 값을 확인하면 다음과 같다.

알고리즘을 수행할 수록 W는 1에 가까운 1.005로 b는 0에 가까운 -0.017로 수렴하는 것을 확인할 수 있다. 횟수를 좀더 많이하면 1과 0으로 좀더 수렴할 것이다. cost값 또한 점점 0에 가까워져 minimize cost가 구해지는것을 확인할 수 있다. 

댓글