TyranitarX Connect.

梯度下降问题处理以及算法优化

Word count: 386Reading time: 1 min
2019/07/05 Share

一、普通梯度下降训练优化

  • 每次都在整个数据及上计算Loss和梯度

    • 计算量大
    • 可能内存承载不住
  • 梯度方向确定的时候,仍然是每次都走一个单位步长

    • 太慢
      那么应当怎么样优化呢? 这里提出了两种方法供使用。
  • ####①. 随机梯度下降
    每次只使用一个样本
  • ####②. Mini-Batch梯度下降
    每次使用小部分数据进行训练,同时对数据进行shuffle加快模型收敛,并防止过拟合问题的出现。

利用Mini-Batch梯度下降算法同样是存在问题的,如下图所示的震荡问题。

同样,由于普通的梯度下降算法中学习率*当前位置导数的算式,在当梯度下降过程中遇到局部极值点或者鞍点(saddle point)时,该点导数为0。则不论参数α为何值,梯度下降的参数恒为0。这样使得梯度下降无法继续进行下去而停留在当前点上。

二、动量梯度下降算法

  • 普通梯度下降 SGD

    1
    2
    3
    while True:
    dx = compute_gradient(x)
    x += learning_rate * dx
  • 动量梯度下降 SGD+Momentum

    将每次的梯度乘上一个参数,进行每次梯度的积累。

    1
    2
    3
    4
    5
    vx = 0
    while True:
    dx = compute_gradient(x)
    vx = rho * vx + dx
    x += learning_rate * vx

    ####特点:

    • 开始训练时,积累动量,加速训练
    • 局部极值附近震荡时,梯度为0,由于动量,跳出陷阱
    • 梯度改变方向的时候,动量缓解震荡
CATALOG
  1. 1. 一、普通梯度下降训练优化
    1. 1.1. 每次都在整个数据及上计算Loss和梯度
    2. 1.2. 梯度方向确定的时候,仍然是每次都走一个单位步长
  2. 2. 二、动量梯度下降算法
    1. 2.1. 普通梯度下降 SGD
    2. 2.2. 动量梯度下降 SGD+Momentum