根据我前面两篇博客Softmax Regression 实现手写数字识别和简单神经网络 实现手写数字识别的结果,使用单层的Softmax Regression进行手写数字识别的准确率约为92%,而加了一层隐层之后,准确率只有80%左右,令人感到意外,因为一般网络越深,分类效果应该越好才对。不过简单分析一下,原因可能就是加了一层隐层之后参数数量变大,容易产生过拟合等。单层的Softmax Regression网络其参数个数为784*10+10=7850,而增加一层15个神经元的隐层之后,参数个数变为(784*15+15)+(15*10+10)=11935。
为了挖掘单隐层神经网络的潜力,加入了一些神经网络的优化策略,包括指数衰减学习率和正则化,下面加以介绍,并在最后给出了代码和优化结果。
一、指数衰减学习率
学习率是指每次参数更新的幅度,如下。
学习率设置的过小则参数更新太慢,学习效率低;学习率设置的太大,则后期容易产生振荡,难以收敛。但在参数更新前期,参数距离最优参数较远,希望学习率设置的大些;而在参数更新后期,参数距离最优参数较近,为了避免产生振荡,希望参数设置的小些。由此可见,学习率设置成固定值并不是最好的。
指数衰减学习率是根据运行的轮数动态调整学习率的一种方法,在TensorFlow中表示如下:
tf.train.exponential_decay(
learning_rate, # 学习率初始值
global_step, # 当前训练总轮数(不能为负)
decay_steps, # 衰减步长(必须为正),即多少轮更新一次学习率
decay_rate, # 衰减率,一般取值范围为(0,1)
staircase=False, # True:阶梯型衰减, False:平滑衰减
name=None # 操作的可选名称,默认为'ExponentialDecay'
)
学习率的计算公式为:
decayed_learning_rate = learning_rate *
decay_rate ^ (global_step / decay_steps)
注意当staircase为Ture时,global_step / decay_steps是一个整数,衰减率为阶梯函数 ,如下。
应用示例:
...
global_step = tf.Variable(0, trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step, 100000, 0.96, staircase=True)
# Passing global_step to min