[딥러닝 학습3] Gradient descent algorithm

제작된 모델이 아래와 같은 경우 유사한 결과를 도출한다고 보장받기 어렵다.

cost function 모양이 아래와 같은 convex function과 같아야 어디서 시작되던 비슷한 결과를 보장한다고 볼 수 있다.

Cost Function을 만들때 반드시 Convex Function과 같은 모양을 하고있는지 확인하여야 한다.

matplotlib 설치. http://matplotlib.org/users/installing.html
메뉴얼대로 했을때는 잘 안되서  아래와 같이 삭제하고 su 계정에서 설치하니 정상으로 설치되었다.

pip3 uninstall matplotlib
python3 -mpip uninstall matplotlib
sudo su
pip3 install matplotlib
python3 -mpip install -U matplotlib

 

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

W = tf.placeholder(tf.float32)
hypothesis = X * W

cost = tf.reduce_mean(tf.square(hypothesis - Y))
sess = tf.Session()

sess.run(tf.global_variables_initializer())

W_val = []
cost_val = []
for i in range(-30, 50):
    feed_W = i * 0.1 #-3 ~ 5까지 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)

plt.plot(W_val, cost_val)
plt.show()

이런 결과로, 최적의 W=1 을 찾았음.

수동으로 Gradient descent 알고리즘 구현하기

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)
hypothesis = X * W

cost = tf.reduce_mean(tf.square(hypothesis - Y))

#optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
#train = optimizer.minimize(cost)
#위와 아래는 같은 코드. 직접 미분으로 구현하는 코드.
learning_rate = 0.1
gradient = tf.reduce_mean((W * X - Y) * X)
descent = W - learning_rate * gradient
update = W.assign(descent)

#그라디언트 수정하고싶을떄??
#gvs = optimizer.compute_gradients(cost) #그라디언트 계산
#gvs = gvs-1 #그라디언트 수정
#apply_gradients = otimizer.apply_gradients(gvs)#그라디언트 적용


sess = tf.Session()

sess.run(tf.global_variables_initializer())

for step in range(20):
    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가 0에 가깝고 W가 1에 가깝게 수렴하는 것을 확인할 수 있다.

0 2.75116 [ 0.23218885]
1 0.782552 [ 0.59050071]
2 0.222593 [ 0.78160036]
3 0.0633152 [ 0.88352019]
4 0.0180097 [ 0.93787742]
5 0.00512274 [ 0.96686798]
6 0.00145713 [ 0.98232961]
7 0.000414473 [ 0.99057579]
8 0.000117892 [ 0.99497378]
9 3.35337e-05 [ 0.99731934]
10 9.5389e-06 [ 0.99857032]
11 2.71296e-06 [ 0.99923754]
12 7.715e-07 [ 0.99959338]
13 2.19523e-07 [ 0.9997831]
14 6.24761e-08 [ 0.99988431]
15 1.77528e-08 [ 0.99993831]
16 5.05179e-09 [ 0.9999671]
17 1.42888e-09 [ 0.99998248]
18 4.09781e-10 [ 0.99999064]
19 1.16984e-10 [ 0.99999499]

 

이 포스트는 김성훈 교수님의 ‘모두의 딥러닝’  강의를 학습하며 정리한 노트입니다.

You may also like...

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.