本篇博客简要总结关于梯度的一些优化方法[1]

常见的三种基于梯度的优化框架

batch gradient

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

一次迭代对所有的data进行更新

缺点

  1. 数据量大,有时候根本无法将所有data丢进内存
  2. 会对重复的sample做冗余计算

好处:

对于convex function 可以保证一定能到 global opt,non-convex 能到 local opt

sgd

一次只2针对一个sample

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

缺点

  1. 震荡(每个样本更新带来的方差大)

好处

  1. online learning
  2. faster

mini-batch gradient

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
  1. 可以减小sgd带来的震荡问题(batch 会使样本方差变小,观察了多个样本)
  2. 高效计算,更容易并行,会让硬件的吞吐量变大

一些问题:

  1. 如何选择合适的learning rate
  2. learning rate调度?优化过程中希望动态的调整learning rate
  3. 每个参数都用同样的learning rate?-> 稀疏数据
  4. local opt or saddle point

梯度迭代策略

momentum

对过往的速度做一个移动平均,减少震荡

$$ \begin{align} v_t &= \gamma v_{t-1} + \eta \nabla_\theta J(\theta)\\\
\theta &= \theta - v_t \end{align} $$

nesterov accelerate gradient

在 momentum 的基础上,更新梯度并非相对于 $\theta$, 而是 $\theta - \gamma v_{t-1}$ 因为根据之前的信息,你已经知道了 $\theta$ 要往前走了,那我们可以先往前走一步在算法梯度

$$ v_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta - \gamma v_{t-1}) $$

adagrad

前面两种迭代策略都是在调整步幅,后面的方法在解决参数学习率同质化的问题

这个方法希望对那些很少被更新的参数走一个大的步幅,而对于经常更新的走一个小的步幅

$$ \begin{align} \theta_{t+1,i} &= \theta_{t,i} - \frac{\eta}{\sqrt{G_{t,ii} + \epsilon}} g_{t,i}\\\
i, & is\ the\ ith\ param\ of\ \theta \\\
G_{t,ii}&=\sum_k^t g_{k,i}^2 \end{align} $$

缺点 一个致命的问题是,$G_t$ 每次加的都是一个正数,因此随着迭代的进行,很容易变得非常大,导致learning rate 很小,以至于梯度不会被更新

adam

也是一种自适应的learning raate的方式

它估计了迭代过程中的梯度的均值和方差

$$ \begin{align} m_t&=\beta_1 m_{t-1} + (1-\beta_1) g_t\\
v_t&=\beta_2 v_{t-1} + (1 - \beta_2) g_t^2\\\
\hat{m_t}&=\frac{m_t}{1 - \beta_1^t} \\
\hat{v_t}&=\frac{v_t}{1- \beta_2^t} \\\
\theta_t&= \theta_{t-1} - \frac{\eta}{\sqrt{\hat{v_t}} + \epsilon} \hat{m_t} \end{align} $$

其中作者发现又有的估计会有bias 所以除以了一个修正项

参考文献

  1. An overview of gradient descent optimization algorithms

版权声明

本作品为作者原创文章,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

作者: taotao

仅允许非商业转载,转载请保留此版权声明,并注明出处