TensorFlow 的學習效率的指數衰減法
阿新 • • 發佈:2017-12-08
fig ntop ron ria and span 圖形化 port 是什麽
train_step = tf.train.GradientDescentOptimizer(x)
在之前的幾個例子中都出現了如上代碼。
這個優化算法的參數就是學習效率。那麽這個學習效率是什麽意思,到底取什麽樣的值比較好呢?
之前已經講過,優化算法會反向修改函數中設置為Variable的變量值,使得誤差逐步縮小。而這裏的學習效率就是Variable更新變化的幅度。
如果幅度過大,參數就很可能跨過最優值,最後在最優值的兩側來回浮動。
如果幅度太小,又會大大的增加學習時間。
比較理想的做法是,在學習初期,將這個值設的大一些,當逐漸靠近最優解的時候,逐漸縮小學習效率使得獲得的值更加靠近最優值。
TensorFlow就為我們提供了這種方法:指數衰減法
tf.train.exponential_decay
它實現的功能類似如下代碼
decayed_learning_rate = learning_rate * decay_rate^(global_step/decay_steps)
- decayed_learning_rate: 優化後的每一輪的學習效率。
- learning_rate: 最初設置的學習效率。
- decay_rate: 衰減系數。
- decay_steps: 衰減速度。
將demo1的代碼稍作修改,加入今天我們講到的函數,並且以圖形化的方式輸出。
我們會看到,原來0.1的學習效率,所產生的線與我們正確線在有一段距離的地方開始上下浮動,不再靠近我們正確值的線段。
而給學習效率加上指數衰減算法後,很快我們的生成的線段就與正確值幾乎重合了。
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt x_data = np.random.rand(50).astype(np.float32) y_data = x_data * 0.1 + 0.3; ### Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0)) biases = tf.Variable(tf.zeros([1])) y = Weights*x_data + biases loss=tf.reduce_mean(tf.square(y-y_data)) global_step = tf.Variable(0) learning_rate = tf.train.exponential_decay(0.1,global_step,100,0.96,staircase=True) learning_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step) init = tf.global_variables_initializer() ### sess = tf.Session() sess.run(init) fig = plt.figure() ax = fig.add_subplot(1,1,1) plt.ion() plt.show() for step in range(300): sess.run(learning_step) if step % 20 == 0: y_value=sess.run(y) ax.scatter(x_data,y_data) ax.scatter(x_data,y_value) plt.pause(1)
TensorFlow 的學習效率的指數衰減法