Showing

[인공지능] 텐서플로로 선형 회귀 모델 학습하기: 경사 하강법을 이용한 최적화 본문

컴퓨터 공학, 전산학/인공지능,딥러닝

[인공지능] 텐서플로로 선형 회귀 모델 학습하기: 경사 하강법을 이용한 최적화

RabbitCode 2024. 10. 30. 17:45

이 글에서는 TensorFlow를 이용해 간단한 선형 회귀 모델을 구현하고 학습시키는 과정을 설명한다.

TensorFlow v1.x의 기초적인 활용법과 경사 하강법의 개념을 익히는 예제를 다룬다.

 

경사 하강법을 사용하여 RMSE 값을 최소화하면서 최적의 기울기와 절편을 찾는 방법을 취한다.

TensorFlow v1.x를 사용하여 구현하는 예제로, TensorFlow v2.x 환경에서는 compat.v1 모듈을 통해 v1.x 코드를 사용할 수 있다.


전체 코드

#import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.compat.v1.disable_v2_behavior()

# x, y의 데이터 값
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x_data = [x_row[0] for x_row in data]
y_data = [y_row[1] for y_row in data]

# 기울기 a와 y 절편 b의 값을 임의로 정한다.
# 단, 기울기의 범위는 0 ~ 10 사이이며, y 절편은 0 ~ 100 사이에서 변하게 한다.
a = tf.Variable(tf.random_uniform([1], 0, 10, dtype = tf.float64, seed = 0))
b = tf.Variable(tf.random_uniform([1], 0, 100, dtype = tf.float64, seed = 0))

# y에 대한 일차 방정식 ax+b의 식을 세운다.
y = a * x_data + b
# 텐서플로 RMSE 함수
rmse = tf.sqrt(tf.reduce_mean(tf.square(y - y_data )))

# 학습률 값
learning_rate = 0.1

# RMSE 값을 최소로 하는 값 찾기
gradient_decent = tf.train.GradientDescentOptimizer(learning_rate).minimize(rmse)

# 텐서플로를 이용한 학습
with tf.Session() as sess:
    # 변수 초기화
    sess.run(tf.global_variables_initializer())
    # 2001번 실행(0번째를 포함하므로)
    for step in range(2001):
        sess.run(gradient_decent)
        # 100번마다 결과 출력
        if step % 100 == 0:
            print("Epoch: %.f, RMSE = %.04f, 기울기 a = %.4f, y 절편 b = %.4f" %
                  (step, sess.run(rmse), sess.run(a), sess.run(b)))

1. 텐서플로 설정 및 데이터 준비

 

먼저 TensorFlow v1.x 환경을 사용하기 위해 tensorflow.compat.v1 모듈을 import하고, v2 버전을 비활성화한다.

 
import tensorflow.compat.v1 as tf
tf.compat.v1.disable_v2_behavior()
 
 

이제 선형 회귀 모델을 학습시킬 데이터를 준비한다. 데이터는 입력 변수 x와 출력 변수 y로 이루어진 리스트 형태로 구성되어 있다.

 
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x_data = [x_row[0] for x_row in data]
y_data = [y_row[1] for y_row in data]

2. 기울기와 절편 변수 초기화

경사 하강법을 통해 최적의 기울기 와 절편 값을 찾기 위해, 각각의 값을 임의로 초기화한다.

기울기의 초기 범위는 0에서 10 사이로, 절편의 초기 범위는 0에서 100 사이로 설정한다.

 
a = tf.Variable(tf.random_uniform([1], 0, 10, dtype = tf.float64, seed = 0))
b = tf.Variable(tf.random_uniform([1], 0, 100, dtype = tf.float64, seed = 0))
 

3. 선형 회귀 식 정의

y=ax+b의 형태로 일차 방정식을 정의하여 y 값을 계산한다.

 
y = a * x_data + b

4. 손실 함수 정의: RMSE

평균 제곱근 오차(RMSE, Root Mean Square Error)를 사용하여 모델의 오차를 계산한다. RMSE는 모델 예측값과 실제값 간의 차이를 측정하는 지표로, 값이 작을수록 모델의 예측 정확도가 높음을 의미한다.

rmse = tf.sqrt(tf.reduce_mean(tf.square(y - y_data )))

5. 최적화 함수 설정: 경사 하강법

TensorFlow의 GradientDescentOptimizer를 이용하여 RMSE 값을 최소화하는 방향으로 학습을 진행한다. 학습률(learning rate)은 0.1로 설정한다.

learning_rate = 0.1
gradient_decent = tf.train.GradientDescentOptimizer(learning_rate).minimize(rmse)

6. 모델 학습 수행

TensorFlow 세션을 열고, 변수를 초기화한 후 2001번 반복하여 경사 하강법을 통해 모델을 학습시킨다. 100번마다 RMSE 값과 현재 기울기 , 절편 b 값을 출력하여 학습 과정을 확인한다.

 
with tf.Session() as sess:
    # 변수 초기화
    sess.run(tf.global_variables_initializer())
    # 2001번 실행
    for step in range(2001):
        sess.run(gradient_decent)
        # 100번마다 결과 출력
        if step % 100 == 0:
            print("Epoch: %.f, RMSE = %.04f, 기울기 a = %.4f, y 절편 b = %.4f" %
                  (step, sess.run(rmse), sess.run(a), sess.run(b)))

7. 결과 해석

학습이 완료되면, 최적의 기울기와 절편 값이 도출된다. 출력되는 Epoch와 RMSE 값을 통해 모델이 어떻게 수렴하는지 확인할 수 있다. 최종적으로 출력된 기울기와 절편 값은 주어진 데이터에 가장 잘 맞는 선형 회귀 모델을 나타낸다.


위 코드를 통해 선형 회귀 모델을 경사 하강법으로 학습시키는 방법을 이해할 수 있다.