优化器

GD&SGD&Mini-batch GD

  • GD
    • 用了全量样本,凸函数可以到全局最小值,非凸函数可以到局部最小值
    • 慢,不能在线serving
  • SGD
    • 损失函数震荡
  • Mini-batch GD
    • GD与SGD的结合:降低了参数更新时的方差,收敛较SGD更稳定
    • 速度较快:可以利用矩阵运算

两个问题

  • 收敛能力
    • lr太大,容易震荡,甚至偏离极小值;lr太小,收敛慢
    • 非凸函数,容易陷于局部最小值/鞍点
  • 自适应lr调节
    • SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
      Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)
      对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)

Momentum

  • 加上惯性,尝试解决容易陷入局部最小值/鞍点的问题
    • 使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡
      $ v{t-1} $上加梯度,可以认为是对 $ v{t-1} $ 的预判
  • 由Polyak提出,也叫Polyak动量
    Nesterov
  • 优化Polyak动量,“预判我的预判”
  • 从工程实现上,无法直接获得预判点的梯度,可得如下等价公式:

AdaGrad&RMSProp&Adam

AdaGrad

RMSPropV2

Adam

  • AdaGrad: Adaptive Gradient
    • 学习率的自适应调节:学习率 除以 梯度平方累积项,更新次数越多(高频特征)的更新步长减小,稀疏特征步长增大
    • 后期学不动
  • RMSProp:Root Mean Square Propogation,为了解决AdaGrad后期学不动的问题
    • 累积梯度时加上衰减系数,越早的梯度会逐渐衰减
  • Adam:Adaptive Moment Optimization,
    • RMSProp + Momentum

以下内容未解锁