1. 程式人生 > >TensorFlow 的學習效率的指數衰減法

TensorFlow 的學習效率的指數衰減法

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 的學習效率的指數衰減法