2017年4月23日 星期日

TensorFlow & Gradient Descent

TensorFlow的官網,有教我們Gradient Descent的用法。
https://www.tensorflow.org/get_started/get_started

Gradient Descent的好處是,用比暴力破解更好的方法,去猜w和b的值。暴力破解法,請參考:
TensorFlow & Linear Regression

本文探討TensorFlow採用Gradient Descent背後的原理。當然,首先,我們簡化官網的問題。簡化成下圖:


原來官網的問題:
y = w*x + b

簡化後的問題:
y = w*x

而且只考慮兩組(x, y, t):(0, 0, 0)和(3, 0.9, -3)。

用數學式子描述我們的問題:


我們希望調整w,直到找到最小的E為止。

將上面的數學式子,寫成下面的Python程式,並且使用TensorFlow的Gradient Descent,去解這個問題:

import tensorflow as tf

w = tf.Variable ([0.3], tf.float32)
x = tf.placeholder (tf.float32)
y = w * x

sess = tf.Session ()
init = tf.global_variables_initializer()
sess.run (init)

t = tf.placeholder (tf.float32)
squared_deltas = tf.square (y-t)
E = tf.reduce_sum (squared_deltas)

optimizer = tf.train.GradientDescentOptimizer (0.01)
train = optimizer.minimize (E)

x_train = [0, 3]
t_train = [0, -3]

[[w_value]] = sess.run ([w])
print ("w = %s" % w_value)

sess.run (init)
for i in range (10):
    sess.run (train, {x: x_train, t: t_train})
    [[w_value]] = sess.run ([w])
    print ("w = %s" % w_value)

結果如下:


問題是,到底TensorFlow的Gradient Descent做了什麼事情?

我們將這個問題,轉換成一個Neural Node,比較好理解:


這個問題,和上一篇類似,如何計算Neural Network的Error Function的斜率?。但更簡單,因為沒有sigmoid function。

比較上一篇:
y = sigmoid (w * x)

本篇:
y = w * x

回到我們的問題:調整w,找到最小的E為止。所以對E做w的微分:



這個公式,比上一篇簡單。我們用它來計算:
△w = -2 * (-3-0.9) * 3 = 23.4

還記得Learning Rate嗎?
Training A Simple Classifier - Learning Rate
Learning Rate在Neural Network的作用

我們不希望△w

  1. 走錯方向
  2. 衝過頭
所以要調整它。負號是給它正確的方向,L=0.01是叫它慢慢學習:
△w = -L * △w

(各位可以試者把L=0.5,會發現它永遠學不會)

於是:
△w = -0.01 * 23.4 = -0.234

調整後的w:
w = w + △w = 0.3 - 0.234 = 0.066

這就是我們在跑TensorFlow Python這支程式時,所看到的第二行 w = 0.066 的由來。

本篇,理論結合實作,希望能幫助各位了解Gradient Descent的原理。

-Count

沒有留言:

張貼留言