본문 바로가기

인공지능/ML

인공지능 5. Multi Variable Linear Regression

이 글은 edwith - [부스트코스] 텐서플로우로 시작하는 딥러닝 기초의 개인적인 공부기록이므로 오류가 있을 수 있습니다!

여태까지는 x_data 하나, y_data 하나만을 가지고 기대값을 구했다.

그러나 이제는 여러 개의 x_data에서 cost를 최소화하는 W를 찾아가는 과정을 살펴보자.

 

x1 x2 x3 y
73 89 75 152
99 79 84 166
87 100 91 190
78 91 90 178
65 100 98 141

 

다음과 같은 x1, x2, x3 데이터와 y데이터가 있다.

이 데이터들을 행렬로 만들면 다음과 같다.

data = np.array([
    [73., 89., 75., 152.],
    [93., 79., 84., 166.],
    [87., 100., 91., 190.],
    [78., 91., 90., 178.],
    [65., 100., 98., 141.]
], dtype=np.float32)

X = data[:, :-1]
Y = data[:, [-1]]

 

X_data가 여러 개이기 때문에 W 또한 여러개가 존재한다.

즉, 이러한 Hypothesis가 성립한다. 

Multi Variable Regression Hypothesis

 

W값과 b값은 랜덤하게 만든다.

W = tf.Variable(tf.random.normal([3, 1]))
b = tf.Variable(tf.random.normal([1]))

X데이터 [x1[n], x2[n], x3[n]]의 형태를 가지고, [1, 3]의 행렬이다. 그 행렬과 연산을 하기 위해 W는 [3, 1]행렬이며, 값은 랜덤하다. b 또한 단일값을 랜덤값으로 선언했다. 

 

 

이제 learning_rate를 설정한 뒤 Gradient Descent를 시행해보자.

def predict(x_data):
    return tf.matmul(x_data, W) + b
    
learning_rate = 0.00001

for j in range(2000+1):
    with tf.GradientTape() as tape:
        cost = tf.reduce_mean((tf.square(predict(x_data) - y)))

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

    W.assign_sub(learning_rate * W_grad)
    b.assign_sub(learning_rate * b_grad)

    if j % 100 == 0:
        print("{:5} | {:10.4f}".format(j, cost.numpy()))

 

단일 변수 Regression Hypothesis는 Wx + b이고, x가 여러개이므로 위 사진과 같은 Multi Variable Regression Hypothesis를 작성해야 하지만, 우리의 데이터는 행렬로 작성되어 있기 때문에 행렬의 곱으로 간단하게 정의할 수 있다.

행렬의 곱은 *이나 multiply 메서드가 아닌 matmul 메서드를 이용하며, 그렇게 구현한 것이 predict 메서드이다.

 

반복문을 2001번 돌며 W값과 b값을 갱신하는데, 방법은 Simple Regression과 동일하다. 

tensorflow의 GradientTape 메서드를 이용해 cost를 갱신한 뒤, gradient 메서드로 미분한다.

그 후 learning rate에 따라 W와 b를 갱신하게 된다.