Tensorflow로 간단한 Linear regression 알고리즘 구현
[딥러닝] Tensorflow로 간단한 Linear regression 알고리즘 구현
시험 점수를 예측하거나 연속적인 값을 예측해야 할 때는 회귀(regression)를 사용한다. 여기서는 TensorFlow를 이용한 간단한 선형 회귀(Linear Regression) 모델 구현을 다룬다.
여러 x와 y 값을 기반으로 가장 근접한 직선(선형 모델)을 찾아야 한다. 이 선을 통해 입력된 새로운 x 값에 대응하는 y 값을 예측할 수 있다.
현재 파란 선은 가설 H(x)에 해당한다. 예를 들어, 데이터가 (1,1), (2,2), (3,3)이라면 선과 이 점들 간의 거리를 최소화하는 것이 좋은 가설이다.
이를 위해 다음과 같은 개념을 사용한다:
H(x): 예측 가설
cost(W,b): 비용 함수
W: 가중치(기울기)
b: 절편
m: 데이터 개수
H(x^(i)): 예측값
y^(i): 실제값
(예측값 - 실제값)의 제곱을 사용하는 이유
음수 또는 양수 차이를 제거하고, 오차가 클수록 더 큰 페널티를 주기 위해 제곱을 사용한다.
Linear regression 알고리즘의 최종 목적: cost 값을 최소화하는 W와 b를 찾자
미리 x와 y 값을 주었을 때
x_train = [1, 2, 3] y_train = [1, 2, 3]
W = tf.Variable(tf.random_normal([1]), name='weight') b = tf.Variable(tf.random_normal([1]), name='bias')
hypothesis = x_train * W + b cost = tf.reduce_mean(tf.square(hypothesis - y_train))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) train = optimizer.minimize(cost)
sess = tf.Session() sess.run(tf.global_variables_initializer())
for step in range(2001): sess.run(train) if step % 20 == 0: print(step, sess.run(cost), sess.run(W), sess.run(b))
2000번 반복 후, W는 1에 가까워지고 b는 0에 가까워진다. 따라서 가설은 H(x) = x로 수렴한다.
learning_rate에 대하여
너무 크면 발산(over-shooting)
너무 작으면 수렴 속도가 느리고 local minimum에 갇힐 수 있음
보통 0.01 ~ 0.5 사이 값을 사용한다.
placeholder를 이용하여 값 전달하기
W = tf.Variable(tf.random_normal([1]), name='weight') b = tf.Variable(tf.random_normal([1]), name='bias')
X = tf.placeholder(tf.float32, shape=[None]) Y = tf.placeholder(tf.float32, shape=[None])
hypothesis = X * W + b cost = tf.reduce_mean(tf.square(hypothesis - Y)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) train = optimizer.minimize(cost)
sess = tf.Session() sess.run(tf.global_variables_initializer())
for step in range(2001): cost_val, W_val, b_val, _ = sess.run([cost, W, b, train], feed_dict={X: [1, 2, 3, 4, 5], Y: [2.1, 3.1, 4.1, 5.1, 6.1]}) if step % 20 == 0: print(step, cost_val, W_val, b_val)
최종적으로 가설 H(x) = x + 1.1로 수렴한다.
예측 결과 확인
훈련된 모델로 예측을 수행하면 입력한 x값에 따라 적절한 y값이 출력된다.