优化器
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,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
- SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。
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
以下内容未解锁