随机优化 Stochastic Optimization
不同于前文所述的优化目标,在随机优化中,我们要最小化期望
当
在许多机器学习问题中,
随机梯度下降 Stochastic Gradient Descent
算法
类似于梯度下降法,随机梯度下降也是一种迭代算法,唯一的区别在于每次只随机选取一个样本来计算梯度,迭代步骤如下:
- 随机选取一个样本
,计算梯度
我们记
收敛性
在随机优化的情景下,我们无法直接使用在梯度下降法一章中证明 Vanilla Analysis 所使用的凸性
取而代之,我们需要证明上述不等式在期望上成立。首先我们有
因此
因此我们得到期望意义下的凸性
接下来仿照梯度下降法一章中的证明,我们可以得到,在光滑条件
下,选取
于是可得收敛率
SGD vs GD
可以看到,在收敛率证明上,SGD 和 GD 几乎是一致的,但是相同的迭代轮数下, GD 往往收敛速度要快于 SGD。这是因为在 Lipschitz Continuity 条件下,两者实质上约束不同
由 Jensen 不等式可知, 对于相同的优化目标有
限制方差
在上一节中,我们发现随机梯度带来的方差会抬高 Lipschitz Continuity 的系数,从而导致收敛速度变慢。mini-batch 是一个很好的办法,随着 batch size 增大,方差会减小,因此 SGD 的收敛速度会变快;但是同样计算量也会增大。有没有办法在不增加计算量的情况下减小方差呢?
SAG/SAGA
SAGA 的想法是,如果我们能用历史信息估计出全梯度,那么我们就可以用全梯度来代替随机梯度,从而减小方差。由光滑性我们知道,相距不远的两点他们的梯度值也应当相近,由此我们可以得到 SAGA 的算法思想:使用一个 cache 来记录每一个 batch 的梯度,在每轮迭代中,计算其中一个 batch 的梯度并更新 cache,然后用 cache 中的梯度的均值作为全梯度的估计。
算法如下:
- S1:随机初始化
- S2:初始化梯度 cache 列表
, 其中第 个元素为 - S3:随机选取
,计算梯度并更新 - S4:计算全梯度的估计
- S5:应用梯度下降
- S6:回到 S3 直到算法收敛
SVRG
SAG/SAGA 算法确实有着很好的效果,但缺点也很明显,需要大量的空间。目前来看,在数据驱动的大模型上,为每一个 batch 开辟一片空间储存梯度无疑是不可接受的。
SVRG 在此基础上去掉了 cache, 直接使用起点处的全梯度,加上当前位置的随机梯度与起点位置的随机梯度的差,来估计当前位置的全梯度。记录起点处的全梯度为
以及当前和起点位置的随机梯度差
于是我们有更新公式
需要说明的是,当
动量法
动量法思想是,利用动量使得充满噪声的随机梯度变得光滑。换言之,如果连续的随机梯度都指向同一个方向,那么我们就可以认为这个方向是一个较好的下降方向,此时出现一个相反的随机梯度很可能是噪声。因此,我们可以用一个变量
由于动量
随着计算进行,这一系数会趋近于
特征约束
考虑一个极端的例子
在此情况下,假设
对不同特征进行约束,这样就可以加速收敛。问题在于如何构造
AdaGrad
AdaGrad 迭代公式如下:
其中
AdaDelta
AdaGrad 中的
Adam
讲到这里, Adam 的出现就顺理成章了。Adam 无外乎 Momentum 和 AdaDelta 的结合,有如下迭代公式:
类似地,训练初期为了取得无偏估计,我们要再乘以一个修正量:
于是我们得到了目前最常用的随机梯度下降算法 adam。