지난 포스트에서 선형 회귀의 개념을 알아봤습니다.
이번엔 실제로 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 = x 즉 W=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) |
'AI > ML' 카테고리의 다른 글
| Multi-variable Linear Regression 코드로 구현해보기 (TensorFlow) (0) | 2026.03.07 |
|---|---|
| Multi-variable Linear Regression : 여러 변수로 예측 정확도 높이기 (0) | 2026.03.06 |
| 경사 하강법(Gradient Descent) 코드로 구현해보기 (TensorFlow) (0) | 2026.03.05 |
| 경사 하강법(Gradient Descent) 으로 최적의 W 찾기 (0) | 2026.03.04 |
| 머신러닝 : 선형 회귀(Linear Regression) (0) | 2026.03.02 |