朴素优化器
最朴素的思想就是将整个数据集计算出一个梯度,并进行更新。这就是Batch Gradient Descent
参数:W为权重,为学习率,g为当前梯度
缺点:一个数据集仅计算一次梯度,梯度没有变化,模型无法很好拟合数据
当然我们也可以每一个样本都更新一次,这就是Stochastic Gradient Descent(SGD)
参数:0<=t<M, M为数据集样本量
缺点:样本梯度方差大,容易受异常点影响,难以拟合
或者,每N个样本更新一次会不会更好?Mini-Batch Gradient Descent
参数:0<=t<M/bz, M为数据集样本量,bz为batch size
缺点:在鞍点处梯度为0,容易陷入局部最优解。针对不同的特征都更新相同的步长,对稀疏数据表现不好。
优化
本质上优化器的更新可以分为两个方面,第一个方面是针对容易陷入鞍点、局部最优解;第二个方面是针对不同的特征进行自适应优化。
动量家族-针对第一个方向
在Mini-Batch SGD(后简称SGD)上,加入动量概念。可以冲出鞍点,冲出局部最优,这就是Momentum
参数:是上一刻的参数更新向量
缺点:容易冲过头
本质:信任过去的梯度方向
既然过去的梯度方向值得信赖,那我直接按过去方向走一步再计算梯度岂不是更好?Nesterov Accelerated Gradient(NAG)
的计算:
参数:是按过去梯度方向走一步后的模型参数,仅用计算梯度值,并不真正更新模型
本质:信赖过去积累的梯度方向,相信在该方向上移动后计算的梯度会更加准确。
缺点:慢
自适应家族
既然担心一部分特征更新太频繁,那我计算一个值来抑制他们的更新不就行了?AdaGrad
方法:将梯度除以过去的平方和。
参数:是一个积累的平方和
缺点:显然随着训练过程的进行,会越来越大,导致后面模型更新得越来越慢
本质:出现更频繁或梯度更大的特征,积累的平方和就越大,因此这部分特征更新的就会越来越慢。通过抑制这部分特征的更新,让稀疏特征有更多机会贡献对模型参数的更新中。\
加个权重来控制平方和的积累 RMSProp
参数:是一个权重,控制平方和的衰减 本质:将累计改为移动指数平均,忽略太久之前的梯度的影响
动量和自适应结合
既然动量有效,自适应有效,为什么不都用起来?Adam
结合动量和自适应梯度,引入控制动量的积累,控制平方和的积累:
前期动量和平方和的积累都很小,因此需要根据训练过程纠正beta值,前期尽量少使用积累值:
最终的梯度更新公式为
参数: 控制动量积累, 控制平方和积累
本质:结合动量和自适应