[Tensorflow] 3.Simple Linear Regression
Linear Regression : 선형 회귀
Regression ; 회귀: 모든 data는 전체 데이터의 평균으로 돌아가려는 속성을 가지고 있다.
Linear Regression : 데이터를 가장 잘 대변하는 직선의 방정식을 찾는 것, 즉 a,b를 찾는 것
a,b 를 찾기 위해 고려해 볼 수 있는 것이 cost. 점들과 선의 차이값이 가장 작은 선(=비용이 가장 적게 나오는 방정식)을 찾아보는 것이다. 하지만 그 차이값이 때로는 양수, 때로는 음수가 나오기 때문에 각 에러값의 제곱의 평균값을 사용하기로 한다.
Regression ; 회귀: 모든 data는 전체 데이터의 평균으로 돌아가려는 속성을 가지고 있다.
Linear Regression : 데이터를 가장 잘 대변하는 직선의 방정식을 찾는 것, 즉 a,b를 찾는 것
a,b 를 찾기 위해 고려해 볼 수 있는 것이 cost. 점들과 선의 차이값이 가장 작은 선(=비용이 가장 적게 나오는 방정식)을 찾아보는 것이다. 하지만 그 차이값이 때로는 양수, 때로는 음수가 나오기 때문에 각 에러값의 제곱의 평균값을 사용하기로 한다.
즉 머신러닝의 궁극적 목표는 minimize cost 를 이끌어내는 W,b를 구하는 것
(W : weight, b: bias, H(x) : Hypothesis)
간단한 예제를 jupyter notebook 환경에서 실습해 본다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import tensorflow as tf
import numpy as np
tf.enable_eager_execution()
# Data
x_data = [1, 2, 3, 4, 5]
y_data = [1, 2, 3, 4, 5]
# W, b initialize
W = tf.Variable(2.9)
b = tf.Variable(0.5)
# W, b update
for i in range(100):
# Gradient descent
with tf.GradientTape() as tape:
hypothesis = W * x_data + b
cost = tf.reduce_mean(tf.square(hypothesis - y_data))
W_grad, b_grad = tape.gradient(cost, [W, b])
W.assign_sub(learning_rate * W_grad)
b.assign_sub(learning_rate * b_grad)
if i % 10 == 0:
print("{:5}|{:10.4f}|{:10.4f}|{:10.6f}".format(i, W.numpy(), b.numpy(), cost))
| cs |
위의 x_data, x_data 가 [1,2,3,4,5] 라면, W=1, b=0 이 되어야 한다.
W와 b의 초기값으로 2.9와 0.5를 넣는다.
tf.reduce_mean() 함수는 차원을 한단계 낮춰주면서(reduce) 그 평균값을 구해준다.
tf.square() 함수는 인자의 제곱값을 구해준다.
우리는 오차값(error)의 평균을 사용할 것이기 때문에 위 처럼 계산 해 준 것이다.
cost가 최소화 되도록 하는 W, b를 찾는 Minimize 알고리즘은 여러가지가 있지만 그 중 가장 유명한 것을 'Gradient descent'알고리즘 ( 경사 하강 알고리즘/ 경사 하강법) 이 있다.
tape은 보통 with 구문과 함께 사용되는데, 위 코드에는 변수로 W,b가 있다. 변수에 대한 변화되는 cost 값을 테잎에 기록하고 tape.gradient(cost, [W,b]) 함수는, 함수에 대한(cost) 각 변수들 ([W,b])의 미분값(기울기)을 반환한다.
learning_rate 변수는 계산된 gradient 값을 얼마만큼 반영할 것인지 정하는 것이다. learning_rate가 클 수록 한번에 변화를 크게 주는 것이다. 위 예제에서는 0.1로 주고 101번째까지 학습을 반복하고 그 결과를 출력했다.
결과를 살펴보면 100번째에서 W값은 1에, b값은 0에 가까워 지고 있는 것을 볼 수 있다.
Gradient Descent 알고리즘에 대해 좀 더 알아보자면
cost (W, b) 함수가 있을 때 그래프로 나타낼 경우
위와 같은 2차 함수 그래프가 나타나게 된다. gradient descent 알고리즘은 초기값으로 준 지점에서의 gradient를 구하고 그래프의 경사로를 따라 차츰차츰 내려가면서 기울기가 0이되는 지점, 즉 cost가 최소가 되는 지점을 찾아내는 것을 목표로 한다.
여기서 '알파' 가 위 예제에서 사용했던 running rate 이다.
Gradient Descent 알고리즘은 많은 경우에 사용될 수 있지만 경우에 따라 적합하지 않을 수도 있다. 보통 Convex function에서만 사용 될 수 있다고 하는데 부적합한 경우에는 local minimum 값과 global minimum 이 일치하지 않는 경우 시작하는 지점에 따라 최소값을 나타내는 b,W 값이 다르게 나올 가능성이 있다. 하지만 convex function에 적용할 경우에는 어느 초기값을 사용하더라도 같은 최소값이 나오게 된다.
No comments: