本篇的主要内容有:
- 动态衰减法设置可变学习率
- 为损失函数添加正则项
- 滑动平均模型介绍
为了让MNIST数字识别模型更准确,学习几种常用的模型优化手段:
学习率的优化
学习率的设置一定程度上也会影响模型的训练,如果学习率过小,那么将会经过很长时间才会收敛到想要的结果,反之,学习率过大则可能会导致不收敛的结果,比如:优化 J(x) = x^{2}, 如果设置学习率为 1,那么整个过程:
可以看到整个过程不管迭代多少次,都不会改变参数值了。这里多提醒一句,我前几天刚刚接触到线性模型也遇到了这个问题,之前处理数据,我使用的学习率都是0.2, 当时遇到的数据集是这样的:
train_x = np.array([3.3, 4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
7.042,10.791,5.313,7.997,5.654,9.27,3.1])
train_y = np.array([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
2.827,3.465,1.65,2.904,2.42,2.94,1.3])
结果使用0.2 的学习率的使用就出问题了,模型无法收敛到一个正确的范围,当时纠结了好一会才意识到是学习率设置错了,毕竟数据的范围就已经很小了,再使用0.2就相对大了,所以一定要根据具体的数据进行设置学习率!
言归正传,在TensorFlow中,为了解决固定学习率的这种弊端,提供了一种很灵活的学习率设置方法–指数衰减法,使用这个方法可以先用较大的学习率得到一个比较好的位置(也就是图像上由比较“陡峭”的地方快速来到比较“平缓”的位置),随着迭代的过程,学习率会逐渐减小,从而使模型变得更稳定。
TensorFlow中实现了指数衰减法的函数是 tf.train.exponential_decay
,这个函数可以指数级地减小学习率,实现功能如下:
decay_learning_rate = learning_rate * decay_rate ^(global_step / decay_steps)
参数:
decayed_learning_rate: 每一轮结束后更新地学习率
learning_rate: 最初设置地学习率
decay_rate: 衰减系数
decay_steps: 衰减速度
样例
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=globalstep)
我们应用指数衰减法解决一个简单地线性回归问题:
首先在没有动态设置学习率的时候:
# 线性回归模型
import tensorflow as tf
import numpy as np
x_data = np.random.rand(100)
noise = np.random.normal(0.0, 0.02, x_data.shape)
y_data = 1.5 * x_data + 2.3 + noise # 定义 w: 1.5 b: 2.3
# 定义线性模型
k = tf.Variable(np.random.rand(1))
b = tf.Variable(np.random.rand(1))
y = k * x_data + b
# 损失函数以及优化器定义
learning_rate = 0.2
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf