Tensorflow로 간단한 Linear regression 알고리즘 구현: 두 판 사이의 차이

기술노트
편집 요약 없음
편집 요약 없음
 
5번째 줄: 5번째 줄:


여러 x와 y 값을 기반으로 가장 근접한 직선(선형 모델)을 찾아야 한다. 이 선을 통해 입력된 새로운 x 값에 대응하는 y 값을 예측할 수 있다.
여러 x와 y 값을 기반으로 가장 근접한 직선(선형 모델)을 찾아야 한다. 이 선을 통해 입력된 새로운 x 값에 대응하는 y 값을 예측할 수 있다.
[[File:https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=http%3A%2F%2Fcfile21.uf.tistory.com%2Fimage%2F99A1B3365AF1362C106BFF|center|600px]]


현재 파란 선은 가설 H(x)에 해당한다. 예를 들어, 데이터가 (1,1), (2,2), (3,3)이라면 선과 이 점들 간의 거리를 최소화하는 것이 좋은 가설이다.
현재 파란 선은 가설 H(x)에 해당한다. 예를 들어, 데이터가 (1,1), (2,2), (3,3)이라면 선과 이 점들 간의 거리를 최소화하는 것이 좋은 가설이다.
28번째 줄: 26번째 줄:
=== (예측값 - 실제값)의 제곱을 사용하는 이유 ===
=== (예측값 - 실제값)의 제곱을 사용하는 이유 ===
음수 또는 양수 차이를 제거하고, 오차가 클수록 더 큰 페널티를 주기 위해 제곱을 사용한다.
음수 또는 양수 차이를 제거하고, 오차가 클수록 더 큰 페널티를 주기 위해 제곱을 사용한다.
[[File:https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=http%3A%2F%2Fcfile25.uf.tistory.com%2Fimage%2F99FEFF355AF13568288AE8|center|600px]]


===== '''Linear regression 알고리즘의 최종 목적: cost 값을 최소화하는 W와 b를 찾자''' =====
===== '''Linear regression 알고리즘의 최종 목적: cost 값을 최소화하는 W와 b를 찾자''' =====
87번째 줄: 83번째 줄:
if step % 20 == 0:
if step % 20 == 0:
print(step, cost_val, W_val, b_val)
print(step, cost_val, W_val, b_val)
[[File:https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=http%3A%2F%2Fcfile30.uf.tistory.com%2Fimage%2F9966EB3E5AF134071A0326|center|600px]]


최종적으로 가설 H(x) = x + 1.1로 수렴한다.
최종적으로 가설 H(x) = x + 1.1로 수렴한다.

2025년 5월 6일 (화) 06:54 기준 최신판

[딥러닝] 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값이 출력된다.