梯度下降优化算法

梯度下降优化算法

写这篇博客其实是为了记录所读的这篇论文的笔记An overview of gradient descent optimization algorithms

Batch gradient descent

图片
他每次为整个数据集计算梯度,然后进行一次更新。

for i in range(nb_epochs): 
    params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate * params_grad 

Stochastic gradient descent(SGD)

图片
他对于每个样本都会计算一次梯度,然后进行一次更新。

for i in range(nb_epochs):
  np.random.shuffle(data)
  for example in data:
    params_grad = evaluate_gradient(loss_function, example, params)
    params = params - learning_rate * params_grad

SGD 因为更新比较频繁,会造成 cost function 有严重的震荡
这里写图片描述

Mini-batch gradient descent

MBGD每一次梯度更新是作用于一小批样本n,n取50~256,收敛更稳定。
这里写图片描述

for i in range(nb_epochs):
  np.random.shuffle(data)
  for batch in get_batches(data, batch_size=50):
    params_grad = evaluate_gradient(loss_function, batch, params)
    params = params - learning_rate * params_grad

Momentum

在当前更新向量中加入了上一次梯度更新因子,γ(伽马)的值一般设为0.9左右.
加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。

这里写图片描述

Adagrad

g _t,i 为t 时刻参数 θ_i 的梯度
这里写图片描述
如果是普通的 SGD, 那么 θ_i 在每一时刻的梯度更新公式为:
这里写图片描述
对于每个参数、时间,都对应不同的学习率
这里写图片描述
G_t,ii是个对角矩阵,元素G_t,ii表示到t时刻为止参数 θ_i所有梯度的平方和,E(不好意思这个不知道怎么打也不知道怎么读[捂脸])是平滑参数,避免出现除0的情况。
其中 η 一般取 0.01。
Adagrad 的优点是减少了学习率的手动调节。它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。

RMSprop

RMSprop 是 Geoff Hinton 提出的一种自适应学习率方法。
RMSprop 为了解决 Adagrad 学习率急剧下降问题的。
这里写图片描述
Hinton 建议设定 γ 为 0.9, 学习率 η 为 0.001。

Adam

这个算法是另一种计算每个参数的自适应学习率的方法。
除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:
这里写图片描述
这里写图片描述
这里写图片描述
建议 β1 = 0.9,β2 = 0.999,ϵ = 10e−8
实践表明,Adam 比其他适应性学习方法效果要好。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章