模型的优化对于传统机器学习和深度学习都是很重要的,尤其是深度学习,在训练过中很可能需要解决一些更加困难的挑战。目前来说,流行且使用较广泛的优化算法有随机梯度下降,具动量的随机梯度下降,RMSProp算法,具动量的RMSProp,AdaDelta和Adam等,以下会选择几种进行具体说明,大部分抄自《深度学习》和tensorflow官方文档。如有错漏欢迎指正。
随机梯度下降(SGD)可能是应用最多的优化算法了,随机梯度下降算法如下所示:
输入:学习率 ϵ ϵ , 初始参数 θ θ |
---|
while 停止准则未满足 do |
从训练集中采包含m个样本的小批量{ x(1),…,x(m) x ( 1 ) , … , x ( m ) },其中 x(i)对应目标为y(i) x ( i ) 对 应 目 标 为 y ( i ) 。 |
计算梯度估计: gˆ←+1m▽θ∑iL(f(x(i);θ),y(i)) g ^ ← + 1 m ▽ θ ∑ i L ( f ( x ( i ) ; θ ) , y ( i ) ) |
应用更新: θ←θ−ϵgˆ θ ← θ − ϵ g ^ |
end while |
tensorflow中并没有专门的SGD的实现,要实现SGD可以借助tensorflow提供的简单梯度下降tf.train.GradientDescentOptimizer
,在运行Session时将随机选取的小批量数据喂给模型即可。
tf.train.GradientDescentOptimizer类的init()函数参数如下所示:
__init__(
learning_rate,
use_locking=False,
name='GradientDescent'
)
learning_rate指定学习率,use_locking指定是否为更新operation加锁,这里主要针对并发读写问题。
从算法和init函数都可以看出,SGD中学习率是固定的,然而固定的学习率并不能很好服务于模型,到训练后期可能导致学习曲线的剧烈震荡。因此往往需要随着时间的推移逐渐降低学习率。tensorflow提供了多种decay函数来实现学习率的衰减,以tf.train.exponential_decay()为例:
exponential_decay(
learning_rate,
global_step,
decay_steps,
decay_rate,
staircase=False,
name=None
)
这个函数返回的decayed_learning_rate就是在输入的learning_rate基础上进行衰减。
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
其中global_step表示当前次数,decay_steps表示衰减步长,staircase为True时,global_step / decay_steps取整数,返回的学习率呈阶梯形衰减,而若staircase为False,学习率呈线性衰减。返回的decayed_learning_rate可以直接用来。
AdaGrad算法是一种自适应学习率算法,它独立地适应所有模型参数的学习率。算法维护一个累积平方梯度向量,即对模型的每个参数,累积其历史平方值的总和,以其反比作为权重更新参数,具体规则如下:
tensorflow中Adagrad类的init()如下:
tf.train.AdagradOptimizer.__init__(
learning_rate,
initial_accumulator_value=0.1,
use_locking=False,
name='Adagrad'
)
其中initial_accumulator_value对应算法中的 δ δ 。
AdaGrad算法虽然具有一些令人满意的理论性质,然而从经验上说,从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。在某些模型上AdaGrad效果不错,但不是全部。
从形式上看,动量算法引入了变量v充当速度角色。使用动量的随机梯度下降算法更新规则在原随机梯度下降基础上改进如下:
使用动量的随机梯度下降的tensorflow中的init()函数为:
tf.train.MomentumOptimizer.__init__(
learning_rate,
momentum,
use_locking=False,
name='Momentum'
)
其中参数momentum对应于算法中的动量参数 α α