북극곰의 개발일기

모두를 위한 딥러닝 lecture 3 - How to minimize cost (실습)





posted by purplebeen on Wed Jan 23 2019 23:48:57 GMT+0900 (KST) in AI


simple hypothesis

수식

파이썬 코드를 이용하여 cost function을 그래프로 나타내보았다.

import tensorflow as tf
import matplotlib.pyplot as plt
X = [1, 2, 3]
Y = [1, 2, 3]

W = tf.placeholder(tf.float32)

# Our hypothesis for linear model X * W
hypothesis = X * W

# cost / loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
#Launch the graph in a session
sess = tf.Session()
#Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())
#Variables for plotting cost function
W_val = []
cost_val = []

for i in range(-30, 50):
    feed_W = i * 0.1
    curr_cost, curr_W = sess.run([cost, W], feed_dict={W: feed_W})
    W_val.append(curr_W)
    cost_val.append(curr_cost)
		
#show the cost function
plt.plot(W_val, cost_val)
plt.show()

그래프

결론적으로, cost를 최소화 시키기 위해서는 저 수식을 따라 가게 만들면 된다. 이때 사용되는 것이 Gradient descent Algorithm 이다.

Gradient descent Algorithm

import tensorflow as tf
x_data = [1, 2, 3]
y_data = [1, 2, 3]

W = tf.Variable(tf.random_normal([1]), name='weight')
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

# Our hypothesis for linear model X * W
hypothesis = X * W

# cost / loss function
cost = tf.reduce_sum(tf.square(hypothesis - Y))

#Minimize : Gradient Descent using derivative: W -= learning_rate * derivative
learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * Y)
descent = W - learning_rate * gradient
update = W.assign(descent)

#Launch the graph in a session
sess = tf.Session()
#Initializes global variables in the graph.
sess.run(tf.global_variables_initializer())
for step in range(21):
    sess.run(update, feed_dict={X: x_data, Y:y_data})
    print(step, sess.run(cost, feed_dict={X:x_data, Y:y_data}), sess.run(W))

실행 하게 되면 결론적으로 cost가 1에 가깝게 줄어든 것을 알 수 있다.

결과1

물론 이 방법으로도 충분히 구할 수 는 있지만, 우리는 tensorfow를 이용해서 보다 간편하게 결과를 구할 수 있다.

import tensorflow as tf

#tf Graph Input
X = [1, 2, 3]
Y = [1, 2, 3]

# Set wrong model weight
W = tf.Variable(-3.0)
#linear model
hypothesis = X * W
# cost / loss function
cost = tf.reduce_mean(tf.square(hypothesis - Y))
#Minimize : Gradient Descent Magic
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1)
train = optimizer.minimize(cost)

#Laungch the graph in a session
sess = tf.Session()
#Initializes global variables in the graph
sess.run(tf.global_variables_initializer())

for step in range(100):
    print(step, sess.run(W))
    sess.run(train)

결론적으로 처음에 weight를 -3.0이라는 잘못된 값을 주었지만,

#Minimize : Gradient Descent Magic
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1)
train = optimizer.minimize(cost)

이부분에서 cost의 값을 minimize 시켜서
결과가 1.0으로 최소의 cost를 받아내는 것을 알 수 있다.

결과2