Adventure Time - Finn 3
본문 바로가기
AI/ML

선형 회귀 코드로 구현해보기 (TensorFlow)

by hyun9_9 2026. 3. 3.

지난 포스트에서 선형 회귀의 개념을 알아봤습니다.
이번엔 실제로 TensorFlow 코드로 직접 구현해보겠습니다.


전체 코드

import tensorflow as tf

# 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)

learning_rate = 0.01

for i in range(100+1): # W, b update
    #Graduebt descent
    # 경사 하강법
    with tf.GradientTape() as tape:
        hypothesis = W * x_data +b
        # cost 함수
        #tf.square (제곱)
        #tf.reduce_mean (평균 - 랭크가 줄어들면서 mean을 구한다)
        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.4}|{:10.6f}".format(i, W.numpy(), b.numpy(), cost))

print(W * 5 + b)
print(W * 2.5 + b)

 


1. 데이터 준비

x_data = [1, 2, 3, 4, 5]
y_data = [1, 2, 3, 4, 5]

x와 y가 동일한 값으로, 이상적인 직선은 y = xW=1, b=0 입니다.
학습을 통해 W와 b가 이 값으로 수렴하는지 확인하는 것이 목표입니다.


2. W, b 초기값 설정

W = tf.Variable(2.9)
b = tf.Variable(0.5)

tf.Variable 은 학습을 통해 값이 계속 업데이트되는 변수입니다.
처음엔 W=2.9, b=0.5 로 정답과 거리가 먼 값에서 시작합니다.


3. 가설(Hypothesis) 과 비용 함수(Cost Function)

with tf.GradientTape() as tape:
    hypothesis = W * x_data + b
    cost = tf.reduce_mean(tf.square(hypothesis - y_data))
  • hypothesis = W * x_data + b : H(x) = Wx + b, 현재 W와 b로 예측값 계산
  • tf.square : 오차를 제곱 → 음수 오차를 양수로 만들기 위해
  • tf.reduce_mean : 전체 오차의 평균 계산
  • tf.GradientTape() : 이 블록 안의 연산을 기록해서 나중에 미분할 수 있게 해줍니다

4. 경사 하강법(Gradient Descent) 으로 W, b 업데이트

W_grad, b_grad = tape.gradient(cost, [W, b])

W.assign_sub(learning_rate * W_grad)
b.assign_sub(learning_rate * b_grad)
  • tape.gradient : cost를 W와 b로 각각 미분해서 기울기(gradient)를 구합니다
  • assign_sub : 현재 값에서 학습률 * 기울기 를 빼서 업데이트
  • learning_rate = 0.01 : 한 번에 얼마나 이동할지 결정하는 값

기울기의 반대 방향으로 조금씩 이동하면서 Cost가 최소가 되는 W와 b를 찾아갑니다.


5. 학습 결과 확인

100번 반복 학습 후 출력 결과를 보면 W는 점점 1에 가까워지고, b는 점점 0에 가까워지는 것을 확인할 수 있습니다.

    0|    2.4520|     0.376| 45.660004
   10|    1.1036|  0.003398|  0.206336
   20|    1.0128|  -0.02091|  0.001026
   30|    1.0065|  -0.02184|  0.000093
   40|    1.0059|  -0.02123|  0.000083
   50|    1.0057|  -0.02053|  0.000077
   60|    1.0055|  -0.01984|  0.000072
   70|    1.0053|  -0.01918|  0.000067
   80|    1.0051|  -0.01854|  0.000063
   90|    1.0050|  -0.01793|  0.000059
  100|    1.0048|  -0.01733|  0.000055

 


6. 새로운 값 예측

print(W * 5 + b)    # x=5 일 때 → 약 5.0
print(W * 2.5 + b)  # x=2.5 일 때 → 약 2.5

tf.Tensor(5.00667, shape=(), dtype=float32)
tf.Tensor(2.4946702, shape=(), dtype=float32)

학습이 끝난 W와 b로 새로운 x 값에 대한 y를 예측할 수 있습니다.
W ≈ 1, b ≈ 0 으로 수렴했기 때문에 예측값도 실제값에 매우 가깝게 나옵니다.


정리

단계 개념 코드
1 가설 설정 hypothesis = W * x_data + b
2 비용 계산 tf.reduce_mean(tf.square(hypothesis - y_data))
3 기울기 계산 tape.gradient(cost, [W, b])
4 W, b 업데이트 W.assign_sub(learning_rate * W_grad)