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


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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM