Tensorflow 学习速率的设置|学习速率的指数下降

随着学习的进行,深度学习的学习速率逐步下降  为什么比  固定的学习速率 得到的结果更加准确?

Tensorflow 学习速率的设置|学习速率的指数下降_第1张图片

如上图所示,曲线代表损失值,小球一开始位于(1)处,假设学习速率设置为 △ v,那么根据梯度下降,损失值将在(1)  (2)之间来回移动,无法到达最小值(3)处。要想到达(3),只能降低学习速率。


下面介绍 学习速率指数下降 公式:

Tensorflow 学习速率的设置|学习速率的指数下降_第2张图片

公式中,learning_rate: 当前的学习速率
start_rate:最初的学习速率
decay_rate:每轮学习的衰减率,0
global_step:当前的学习步数,等同于我们将 batch 放入学习器的次数
decay_steps:每轮学习的步数,decay_steps = sample_size/batch  即样本总数除以每个batch的大小

import tensorflow as tf
from numpy.random import RandomState
w1 = tf.Variable(tf.truncated_normal([2,3],seed=1))
w2 = tf.Variable(tf.truncated_normal([3,1],seed=1))

x = tf.placeholder(dtype=tf.float32,shape=[None,2])
y_real = tf.placeholder(dtype=tf.float32,shape=[None,1])

a = tf.nn.relu(tf.matmul(x,w1))  #神经元的激活函数为 relu
y_pre = tf.nn.relu(tf.matmul(a,w2))

sample_size = 20000 #训练样本总数
batch = 500 # 使用mini-batch(批梯度下降),每个batch的大小。

rds = RandomState(0)
X = rds.rand(sample_size,2)
Y = [[int(20*x1+30*x2)]+rds.rand(1) for (x1,x2) in X]

global_step = tf.Variable(0)
#--------------学习速率的设置(学习速率呈指数下降)--------------------- #将 global_step/decay_steps 强制转换为整数
learning_rate = tf.train.exponential_decay(1e-2,global_step,decay_steps=sample_size/batch,decay_rate=0.98,staircase=True)    
MSE = tf.reduce_mean(tf.square(y_real-y_pre)) # 使用均方误差(MSE)作为损失函数
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(MSE,global_step=global_step)

step = 20000 #训练的总次数
start = 0
end = batch

sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(step):
    sess.run(train_step,feed_dict={x:X[start:end],y_real:Y[start:end]})
    if not i%20:
        H = sess.run(MSE,feed_dict={x:X[start:end],y_real:Y[start:end]})
        lr = sess.run(learning_rate)
        print ("MSE: ",H,"\t","learning_rate: ",lr)
        if H<1e-1:  #采用stop early 的方法防止过拟合,节省训练时间。
            break
    strat = end if end


你可能感兴趣的:(Tensorflow 学习速率的设置|学习速率的指数下降)