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
- 走錯方向
- 衝過頭
所以要調整它。負號是給它正確的方向,L=0.01是叫它慢慢學習:
△w = -L * △w
(各位可以試者把L=0.5,會發現它永遠學不會)
(各位可以試者把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
沒有留言:
張貼留言