0%

各类优化方法总结

各类优化方法总结

机器学习的优化方法多种多样, 但在大数据场景下, 使用最多的还是基于 SGD 的一系列方法. 在 Angel 中目前只实现了少量的最优化方法, 如下:

  • 基于随机梯度下降的方法
    • SDG: 这里指 mini-batch SGD (小批量随机梯度下降)
    • Momentum: 带动量的 SGD
    • AdaGrad: 带 Hessian 对角近似的 SGD
    • AdaDelta:
    • Adam: 带动量与对角 Hessian 近似的 SGD
  • 在线学习方法
    • FTRL: Follow The Regularized Leader, 一种在线学习方法

1. SGD

SGD 的更新公式如下:

model

其中, 是学习率. 使用 SGD 可以带正则, 实际优化采用的是 PGD(proximal gradient descent).

json 方式表达有两种, 如下:

1
2
3
4
5
6
7
"optimizer": "sgd",

"optimizer": {
"type": "sgd",
"reg1": 0.01,
"reg2": 0.02
}

2. Momentum

Momentum 的更新公式如下:

model

其中, 是动量因子, 是学习率. 另外, Momentum 也是可以带正则的. Angel 中默认的最优化方法为 Momentum.

json 方式表达有两种, 如下:

1
2
3
4
5
6
7
"optimizer": "momentum",

"optimizer": {
"type": "momentum",
"momentum": 0.9,
"reg2": 0.01
}

3. AdaGrad

AdaGrad(这里用的是指数平滑版, 即 RMSprop)的更新公式如下:

modelg_{t}^2>)

model

其中, 是平滑因子, 是学习率. 另外, AdaGrad 也是可以带正则的.

json 方式表达有两种, 如下:

1
2
3
4
5
6
7
8
"optimizer": "adagrad",

"optimizer": {
"type": "adagrad",
"beta": 0.9,
"reg1": 0.01,
"reg2": 0.01
}

4. AdaDelta

AdaDelta 的更新公式如下:

modelg_{t}^2>)

model

model\Delta%20\theta_{t}^2>)

其中, 是平滑因子. AdaDelta 也是可以带正则的.

json 方式表达有两种, 如下:

1
2
3
4
5
6
7
8
9
"optimizer": "adadelta",

"optimizer": {
"type": "adadelta",
"alpha": 0.9,
"beta": 0.9,
"reg1": 0.01,
"reg2": 0.01
}

5. Adam

Adam 是一种效果较好的最优化方法, 更新公式为:

model\Delta\bold{x}t\bold{v}_t&=\gamma\bold{v}{t-1}+(1-\gamma)\Delta\bold{x}^2t\bold{x}_t&=\gamma\bold{x}{t-1}-\eta\frac{\sqrt{1-\gamma^t}}{1-\beta^t}\frac{\bold{m}_t}{\sqrt{\bold{v}_t}+\epsilon}%20\end{array}>)

其中, 是梯度的指数平滑, 即动量, 是梯度的指数平滑, 可以看作 Hessian 的对角近似. 默认情况下, 记

model=\frac{\sqrt{1-\gamma^t}}{1-\beta^t}>)

>)是一个初值为 1, 极限为 1 的函数, 中间过程先减后增, 如下图所示:
adam系数

即在优化的初始阶段, 梯度较大, 适当地减小学习率, 让梯度下降缓和平滑; 在优化的最后阶段, 梯度很小, 适当地增加学习率有助于跳出局部最优.

json 方式表达有两种, 如下:

1
2
3
4
5
6
7
8
"optimizer": "adam",

"optimizer": {
"type": "adam",
"beta": 0.9,
"gamma": 0.99,
"reg2": 0.01
}

4. FTRL

FTRL 是一种在线学习算法, 它的目标是优化 regret bound, 在一定的学习率衰减条件下, 可以证明它是有效的.

FTRL 的另一个特点是可以得到非常稀疏的解, 表现上比 PGD(proximal gradient descent)好, 也优于其它在线学习算法, 如 FOBOS, RDA 等.

FTRL 的算法流程如下:

FTRL

json 方式表达有两种, 如下:

1
2
3
4
5
6
7
8
9
"optimizer": "ftrl",

"optimizer": {
"type": "ftrl",
"alpha": 0.1,
"beta": 1.0,
"reg1": 0.01,
"reg2": 0.01
}

注: 是正则化常数, 对应 json 中的”reg1, reg2”

一些经验:

对于 deep and wide 算法, 原则上要保证两边收敛速度相差不要太大.

  • wide 部分优化器用 FTRL, 因为 FTRL 收敛相对较慢, 这样有深度那边训练.
  • deep 部分优化器用 Adam, 因为 Adam 收敛相对较快. 虽然 deep 侧用的是快速收敛优化器, 但他的参数多

对于 FTRL 优化器, 它为在线学习设计, 为了保证模型的稳定性, 每次更新的副度都非常小. 在在线学习环境下, 数据是一条一条或一小批一小批, 在理论上也不应让小量数据较多地修改模型. 所以在用 FTRL 算法是, batch size 不能太大, 最好小于 10000 条数据.

不同的优化器收敛速度关系: FTRL < SGD < Momentum < AdaGrad ~ AdaDelta < Adam

由于 AdaGrad, AdaDelta, Adam 引入了 Hessian 对角近似, 它们可以有较大的 batch, 以保证梯度与 Hessian 对角矩阵的精度. 而对于 FTRL, SGD, Momentum 等较为简单的一阶优化器, 它们则需要更多的迭代次数, 因些 batch size 不能太大. 所以有:
BatchSize(FTRL) < BatchSize(SGD) < BatchSize(Momentum) < BatchSize(AdaGrad) ~ BatchSize(AdaDelta) < BatchSize(Adam)

关于学习率, 可以从 1.0 开始, 以指数的方式(2 或 0.5 为底)增加或减少. 可以用 learning curve 进行 early stop. 但有如下原则: SGD, Momentum 可以用相对较大的学习率, AdaGrad, AdaDelta, Adam 对学习率较敏感, 一般讲比 SGD, Momentum 小, 可从 SGD, Momentum 学习率的一半开始调

关于 Decay, 如果 epoch 较少, decay 不宜过大. 一般用标准的 decay, AdaGrad, AdaDelta, Adam 用 WarnRestarts

关于正则化. 目前 FTRL, SGD, AdaGrad, AdaDelta 支持 L1/L2 正则, Momentum, Adam 只支持 L2 正则. 推荐从不用正则开始, 然后再加正则.

关于加 L1 正则的推导, 请参考optimizer