本文内容
随机梯度下降法
Batch Gradient Descent
在每一轮的训练过程中,BGD算法用整个训练集的数据计算loss的梯度,并用该梯度对模型参数进行更新:
θ
k
+
1
=
θ
k
+
Δ
θ
,
Δ
θ
=
−
η
∗
g
k
\theta_{k+1}=\theta_{k}+\Delta\theta, \Delta\theta=-\eta * g_{k}
θk+1=θk+Δθ,Δθ=−η∗gk 优点
- loss若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值
缺点
- 由于每轮迭代都需要在整个数据集上计算一次,批量梯度下降可能非常慢(每轮会计算很多相似样本的梯度, 这部分是冗余的)
- 训练数较多时,需要较大内存
- 批量梯度下降不允许在线更新模型,例如新增实例
Stochastic Gradient Descent
SGD是相对于BGD而生的。与BGD相反,SGD算法每读入一个数据,便立刻计算loss的梯度来更新参数:
θ
k
+
1
=
θ
k
+
Δ
θ
,
Δ
θ
=
−
η
∗
g
k
,
i
\theta_{k+1}=\theta_{k}+\Delta\theta, \Delta\theta=-\eta * g_{k,i}
θk+1=θk+Δθ,Δθ=−η∗gk,i 优点
- 算法收敛速度快
- 可以在线更新
- 有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优
缺点
- 容易收敛到局部最优,并且容易被困在鞍点
Mini-batch Gradient Descent
最初的使用的SGD,每次正反向传播,只计算一个样本,串行太明显,硬件利用率不高。后续SGD衍生出Mini-Batch Gradient Descent,介于BGD和SGD之间,每次从所有训练数据中取出100个样本(一个mini-batch)用于计算梯度:
θ
k
+
1
=
θ
k
+
Δ
θ
,
Δ
θ
=
−
η
∗
g
k
,
i
:
i
+
n
\theta_{k+1}=\theta_{k}+\Delta\theta, \Delta\theta=-\eta * g_{k,i:i+n}
θk+1=θk+Δθ,Δθ=−η∗gk,i:i+n现在,SGD通常是指Mini-Batch方法,而不是早期的单样本SGD方法。
优点
- 在每轮迭代中仅仅计算一个mini-batch的梯度,不仅计算效率高,而且收敛较为稳定
缺点 (三种随机梯度下降法均存在)
- 选择合适的learning rate比较困难,学习率太低会收敛缓慢,学习率过高会使收敛时的波动过大
- 对所有的参数更新使用同样的learning rate。如果训练数据是稀疏的,并且不同特征的出现频率差异较大,比较合理的做法是对于出现频率低的特征设置较大的学习速率,对于出现频率较大的特征数据设置较小的学习速率。
- SGD容易收敛到局部最优,并且在某些情况下可能被困在鞍点。近期的的研究表明,深层神经网络之所以比较难训练,并不是因为容易进入local minimum。相反,由于网络结构非常复杂,在绝大多数情况下即使是 local minimum 也可以得到非常好的结果。而之所以难训练是因为学习过程容易陷入到马鞍面中,即在坡面上,一部分点是上升的,一部分点是下降的。但在合适的初始化和step size的情况下,鞍点的影响并没这么大。
动量优化法
Momentum
Momentum算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。Momentum算法观察历史梯度,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。
m
k
=
μ
∗
m
k
−
1
+
g
k
Δ
θ
k
=
−
η
∗
m
k
\begin{aligned} &m_{k}=\mu * m_{k-1}+g_{k}\\ &\Delta \theta_{k}=-\eta * m_{k} \end{aligned}
mk=μ∗mk−1+gkΔθk=−η∗mk 其中,
μ
\mu
μ是动量因子
优点
- 前后梯度方向一致时,能够加速学习
- 前后梯度方向不一致时,能够抑制震荡
- 下降中后期时,在局部最小值来回震荡的时候, gradient → 0 \text {gradient} \rightarrow 0 gradient→0, μ \mu μ 使得更新幅度增大,有一定摆脱局部最优的能力
Nesterov
Nesterov项是momentum的改进,在梯度更新时做一个校正,让之前的动量直接影响当前的动量,避免前进太快,同时提高灵敏度。
Momentum梯度更新展开为
Δ
θ
k
=
−
η
∗
μ
∗
m
k
−
1
−
η
∗
g
k
\Delta \theta_{k}=-\eta * \mu * m_{k-1}-\eta * g_{k}
Δθk=−η∗μ∗mk−1−η∗gk当前梯度
θ
\theta
θ为
θ
k
+
1
=
θ
k
−
η
∗
μ
∗
m
k
−
1
−
η
∗
g
k
\theta_{k+1}=\theta_{k}-\eta * \mu * m_{k-1}-\eta * g_{k}
θk+1=θk−η∗μ∗mk−1−η∗gk可以看出,
m
k
−
1
m_{k-1}
mk−1并没有直接改变当前梯度
g
k
g_{k}
gk。Nesterov可将
θ
k
−
η
∗
μ
∗
m
k
−
1
\theta_{k}-\eta * \mu * m_{k-1}
θk−η∗μ∗mk−1看做当前优化的一个“展望”项,对该项进行求导,让之前的动量直接影响当前梯度
g
k
g_{k}
gk。
g
k
=
∇
θ
k
f
(
θ
k
−
η
∗
μ
∗
m
k
−
1
)
m
k
=
μ
∗
m
k
−
1
+
g
k
Δ
θ
k
=
−
η
∗
m
k
\begin{aligned} &g_{k}=\nabla_{\theta_{k}} f\left(\theta_{k}-\eta * \mu * m_{k-1}\right)\\ &m_{k}=\mu * m_{k-1}+g_{k}\\ &\Delta \theta_{k}=-\eta * m_{k} \end{aligned}
gk=∇θkf(θk−η∗μ∗mk−1)mk=μ∗mk−1+gkΔθk=−η∗mk
缺点
- 人工设置的学习率非常生硬
自适应学习率优化法
Adagrad
AdaGrad思路基本是借鉴L2 Regularizer,不过此时调节的不是W,而是Gradient:
n
k
=
n
k
−
1
+
g
k
2
Δ
θ
k
=
−
η
n
k
+
ϵ
∗
g
k
\begin{aligned} &n_{k}=n_{k-1}+g_{k}^{2}\\ &\Delta \theta_{k}=-\frac{\eta}{\sqrt{n_{k}+\epsilon}} * g_{k} \end{aligned}
nk=nk−1+gk2Δθk=−nk+ϵη∗gkAdaGrad过程,是一个递推过程,每次对
g
k
g_{k}
gk从1到
k
k
k,把沿路的Gradient的平方根作为一个约束项Regularizer,
−
1
∑
r
=
1
k
(
g
r
)
2
+
ϵ
-\frac{1}{\sqrt{\sum_{r=1}^{k}\left(g_{r}\right)^{2}+\epsilon}}
−∑r=1k(gr)2+ϵ1
ϵ
\epsilon
ϵ是平滑项,用于避免分母为0,一般取值1e−8。
Adagrad算法对学习率进行了一个约束,能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的梯度更新;相反,对于出现频率较高的参数采用较小的梯度更新。
优点
- 由于Regularizer是专门针对Gradient的,所以有利于解决Gradient Vanish/Expoloding问题
- 能够实现学习率的自动更改,前期梯度较小的时候, regularizer较大,能够放大梯度,后期梯度较大的时候,regularizer较小,能够约束梯度
- 非常适合处理稀疏数据
缺点
- 仍需要手动设置一个全局学习率 , 如果learning rate设置过大的话,会使regularizer过于敏感,对梯度的调节太大
- 训练到中后期,分母中对历史梯度一直累加,学习率将逐渐下降至0,使得训练提前结束
- 初始化W影响初始化梯度,如果初始梯度很大的话,会导致整个训练过程的学习率很小,导致学习时间变长
Adadelta
AdaDelta基本思想是用一阶的方法,近似模拟二阶牛顿法。
- Accumulate Over Window
Adagrad会累加之前所有的梯度平方,而Adadelta只在一个窗口w中对梯度进行累加,这样不会让梯度被惩罚至0。
由于计算 E [ g k − w : k ] E[g_{k}−w:k] E[gk−w:k],需要存储前w个状态,比较麻烦。AdaDelta使用了类似动量因子的平均方法:
n k = ν ∗ n k − 1 + ( 1 − ν ) ∗ g k 2 Δ θ k = − η n k + ϵ ∗ g k \begin{aligned} &n_{k}=\nu * n_{k-1}+(1-\nu) * g_{k}^{2}\\ &\Delta \theta_{k}=-\frac{\eta}{\sqrt{n_{k}+\epsilon}} * g_{k} \end{aligned} nk=ν∗nk−1+(1−ν)∗gk2Δθk=−nk+ϵη∗gk其中 n k = E [ g 2 ] k n_{k}=E\left[g^{2}\right]_{k} nk=E[g2]k,即 E [ g 2 ] k = ν E [ g 2 ] k − 1 + ( 1 − ν ) g k 2 E\left[g^{2}\right]_{k}=\nu E\left[g^{2}\right]_{k-1}+(1-\nu) g_{k}^{2} E[g2]k=νE[g2]k−1+(1−ν)gk2相当于历史梯度信息的 E [ g 2 ] k − 1 E\left[g^{2}\right]_{k-1} E[g2]k−1累计乘上一个衰减系数 ν \nu ν,然后用 ( 1 − ν ) (1-\nu) (1−ν)作为当前梯度的平方加权系数相加。
在此处Adadelta其实还是依赖于全局学习率 η \eta η,因此采用近似牛顿迭代法继续改进: - Correct Units with Hessian Approximation
在SGD和动量法中, Δ x ∝ g ∝ ∂ f ∂ x ∝ 1 x \Delta x \propto g \propto \frac{\partial f}{\partial x} \propto \frac{1}{x} Δx∝g∝∂x∂f∝x1 Δ x \Delta x Δx 可以正比到梯度 g g g问题,再正比到一阶导数。而 l o g log log一阶导又可正比于 1 x \frac{1}{x} x1;
对二阶导Hessian矩阵法, Δ x ∝ H − 1 g ∝ ∂ f ∂ x ∂ 2 f ∂ x 2 ∝ 1 x 1 x ∗ 1 z ∝ x \Delta x \propto H^{-1} g \propto \frac{\frac{\partial f}{\partial x}}{\frac{\partial^{2} f}{\partial x^{2}}} \propto \frac{\frac{1}{x}}{\frac{1}{x} * \frac{1}{z}} \propto x Δx∝H−1g∝∂x2∂2f∂x∂f∝x1∗z1x1∝x Δ x \Delta x Δx 可以正比到Hessian逆矩阵 H − 1 ⋅ g H^{-1}\cdot g H−1⋅g问题,再正比到二阶导数。而 l o g log log一阶导又可正比于 x x x。可以看到,一阶方法最终正比于 1 x \frac{1}{x} x1,即与参数逆相关:参数逐渐变大的时候,梯度反而成倍缩小。
而二阶方法最终正比于 x x x,即与参数正相关:参数逐渐变大的时候,梯度不受影响。
因此,Hessian方法得到了Correct Units(正确的更新单元)。
通过牛顿法可以知道,牛顿法迭代步长是 f ′ ′ ( x ) f^{\prime \prime}(x) f′′(x),一阶牛顿迭代公式为: x k + 1 = x k − f ′ ( x ) f ′ ′ ( x ) x_{k+1}=x_{k}-\frac{f^{\prime}(x)}{f^{\prime \prime}(x)} xk+1=xk−f′′(x)f′(x)可以看出牛顿算法的迭代步长是二阶近似的解析解,不需要我们手动指定学习率。而高阶的牛顿法迭代的步长为Hessian矩阵。AdaDelta算法采用Hessian矩阵的对角线近似Hessian矩阵,则有: Δ x ≈ ∂ f ∂ x ∂ 2 f ∂ x 2 \Delta x \approx \frac{\frac{\partial f}{\partial x}}{\frac{\partial^{2} f}{\partial x^{2}}} Δx≈∂x2∂2f∂x∂f进而又有: ∂ f ∂ x ∂ 2 f ∂ x 2 = 1 ∂ 2 f ∂ x 2 ⋅ ∂ f ∂ x = 1 ∂ 2 f ∂ x 2 ⋅ g k \frac{\frac{\partial f}{\partial x}}{\frac{\partial^{2} f}{\partial x^{2}}}=\frac{1}{\frac{\partial^{2} f}{\partial x^{2}}} \cdot \frac{\partial f}{\partial x}=\frac{1}{\frac{\partial^{2} f}{\partial x^{2}}} \cdot g_{k} ∂x2∂2f∂x∂f=∂x2∂2f1⋅∂x∂f=∂x2∂2f1⋅gk简单收束变形一下, 然后用RMS来近似: 1 ∂ 2 f ∂ z 2 = Δ x ∂ f ∂ x ≈ − R M S [ Δ x ] k − 1 R M S [ g ] k \frac{1}{\frac{\partial^{2} f}{\partial z^{2}}}=\frac{\Delta x}{\frac{\partial f}{\partial x}} \approx-\frac{R M S[\Delta x]_{k-1}}{R M S[g]_{k}} ∂z2∂2f1=∂x∂fΔx≈−RMS[g]kRMS[Δx]k−1
最后,一阶完整近似式:
Δ x = − R M S [ Δ x ] k − 1 R M S [ g ] k ⋅ g k x k + 1 = x k − Δ x \begin{aligned} &\Delta x=-\frac{RMS[\Delta x]_{k-1}}{RMS[g]_{k}} \cdot g_{k} \\ &x_{k+1}=x_{k}-\Delta x \end{aligned} Δx=−RMS[g]kRMS[Δx]k−1⋅gkxk+1=xk−Δx
优点
- 训练初中期,加速效果很快。由于RMS永远为正,所以能保证更新的方向一直为梯度的负方向。
- 分子作为一个加速项,作为动量在时间窗口w上积累先前的梯度。
缺点 - 训练后期,进入局部最小值雷区之后,反复在局部最小值附近抖动,脱离不了局部最小值吸引盆
RMSprop
RMSprop可以算作Adadelta的一个特例:
当
ν
=
0.5
\nu=0.5
ν=0.5时,
E
[
g
2
]
k
=
ν
E
[
g
2
]
k
−
1
+
(
1
−
ν
)
g
k
2
E\left[g^{2}\right]_{k}=\nu E\left[g^{2}\right]_{k-1}+(1-\nu) g_{k}^{2}
E[g2]k=νE[g2]k−1+(1−ν)gk2就变为了求梯度平方和的平均数。若再求根的话,就变成了RMS(均方根):
R
M
S
[
g
]
k
=
E
[
g
2
]
k
+
ϵ
R M S[g]_{k}=\sqrt{E\left[g^{2}\right]_{k}+\epsilon}
RMS[g]k=E[g2]k+ϵ再将RMS作为梯度的Regularizer:
Δ
x
k
=
−
η
R
M
S
∣
g
∣
k
∗
g
k
\Delta x_{k}=-\frac{\eta}{R M S|g|_{k}} * g_{k}
Δxk=−RMS∣g∣kη∗gk
优点
- 解决了对历史梯度一直累加而导致学习率一直下降的问题
- 适合处理非平稳目标
- 对于RNN效果很好
缺点
- RMSprop依然依赖于手动选择全局学习率
Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
m
k
=
μ
∗
m
k
−
1
+
(
1
−
μ
)
∗
g
k
n
k
=
ν
∗
n
k
−
1
+
(
1
−
ν
)
∗
g
k
2
m
^
k
=
m
k
1
−
μ
k
n
^
k
=
n
k
1
−
ν
k
Δ
θ
k
=
−
m
^
k
n
^
k
+
ϵ
∗
η
\begin{aligned} &m_{k}=\mu * m_{k-1}+(1-\mu) * g_{k}\\ &n_{k}=\nu * n_{k-1}+(1-\nu) * g_{k}^{2}\\ &\begin{aligned} \hat{m}_{k} &=\frac{m_{k}}{1-\mu^{k}} \\ \hat{n}_{k} &=\frac{n_{k}}{1-\nu^{k}} \end{aligned}\\ &\Delta \theta_{k}=-\frac{\hat{m}_{k}}{\sqrt{\hat{n}_{k}}+\epsilon} * \eta \end{aligned}
mk=μ∗mk−1+(1−μ)∗gknk=ν∗nk−1+(1−ν)∗gk2m^kn^k=1−μkmk=1−νknkΔθk=−n^k+ϵm^k∗η
其中,
m
k
m_{k}
mk,
n
k
n_{k}
nk分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望
E
∣
g
k
∣
E\left|g_{k}\right|
E∣gk∣,
E
∣
g
k
2
∣
E\left|g^2_{k}\right|
E∣∣gk2∣∣的估计;
m
^
k
\hat{m}_{k}
m^k,
n
^
k
\hat{n}_{k}
n^k是对
m
k
m_{k}
mk,
n
k
n_{k}
nk的校正,这样可以近似为对期望的无偏估计。 可以看出,直接对梯度的矩估计对内存没有额外的要求,而且可以根据梯度进行动态调整,而
−
m
k
^
n
^
k
+
ϵ
-\frac{\hat{m_{k}}}{\sqrt{\hat{n}_{k}}+\epsilon}
−n^k+ϵmk^对学习率形成一个动态约束,而且有明确的范围。
优点
- 结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点
- 对内存需求较小
- 为不同的参数计算不同的自适应学习率
- 也适用于大多非凸优化
- 适用于大数据集和高维空间
Adamax
Adamax是Adam的一种变体,此方法对学习率的上限提供了一个更简单的范围。公式上的变化如下:
n
k
=
max
(
ν
∗
n
k
−
1
,
∣
g
k
∣
)
Δ
x
=
−
m
^
k
n
k
+
ϵ
∗
η
\begin{aligned} &n_{k}=\max \left(\nu * n_{k-1},\left|g_{k}\right|\right)\\ &\Delta x=-\frac{\hat{m}_{k}}{n_{k}+\epsilon} * \eta \end{aligned}
nk=max(ν∗nk−1,∣gk∣)Δx=−nk+ϵm^k∗η
优点
- Adamax学习率的边界范围更简单
Nadam
Nadam类似于带有Nesterov动量项的Adam。公式如下:
g
^
k
=
g
k
1
−
Π
i
=
1
k
μ
i
m
k
=
μ
k
∗
m
k
−
1
+
(
1
−
μ
k
)
∗
g
k
m
^
k
=
m
k
1
−
Π
i
=
1
k
+
1
μ
i
n
k
=
ν
∗
n
k
−
1
+
(
1
−
ν
)
∗
g
k
2
n
k
^
=
n
k
1
−
ν
k
m
ˉ
k
=
(
1
−
μ
k
)
∗
g
^
k
+
μ
k
+
1
∗
m
^
k
Δ
θ
k
=
−
η
∗
m
ˉ
k
n
^
k
+
ϵ
\begin{aligned} &\hat{g}_{k}=\frac{g_{k}}{1-\Pi_{i=1}^{k} \mu_{i}}\\ &m_{k}=\mu_{k} * m_{k-1}+\left(1-\mu_{k}\right) * g_{k}\\ &\hat{m}_{k}=\frac{m_{k}}{1-\Pi_{i=1}^{k+1} \mu_{i}}\\ &n_{k}=\nu * n_{k-1}+(1-\nu) * g_{k}^{2}\\ &\hat{n_{k}}=\frac{n_{k}}{1-\nu^{k}} \bar{m}_{k}=\left(1-\mu_{k}\right) * \hat{g}_{k}+\mu_{k+1} * \hat{m}_{k}\\ &\Delta \theta_{k}=-\eta * \frac{\bar{m}_{k}}{\sqrt{\hat{n}_{k}}+\epsilon} \end{aligned}
g^k=1−Πi=1kμigkmk=μk∗mk−1+(1−μk)∗gkm^k=1−Πi=1k+1μimknk=ν∗nk−1+(1−ν)∗gk2nk^=1−νknkmˉk=(1−μk)∗g^k+μk+1∗m^kΔθk=−η∗n^k+ϵmˉk
优点
- Nadam对学习率有了更强的约束,同时对梯度的更新也有更直接的影响。一般而言,在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
牛顿法
牛顿法用二阶的Hessian矩阵的逆矩阵求解替换梯度更新:
Δ
θ
k
=
−
H
k
−
1
⋅
g
k
\Delta\theta_{k}=-H_{k}^{-1} \cdot g_{k}
Δθk=−Hk−1⋅gk
H
H
H为参数的二阶导矩阵,称为Hessian矩阵。
Δ
θ
k
\Delta\theta_{k}
Δθk为牛顿方向。
优点
- 牛顿法用Hessian矩阵替代人工设置的学习率,在梯度下降的时候,收敛更快,迭代次数更少
缺点
- 每次迭代时间长。求逆矩阵的时间复杂度近似 O ( n 3 ) O\left(n^{3}\right) O(n3),计算代价太高,不适合大数据
- 牛顿法是局部收敛的,当初始点选择不当时,往往导致不收敛
- Hessian矩阵必须正定。当二阶Hessian矩阵非正定时,不能保证产生方向是下降方向
拟牛顿法
由于牛顿法需要计算二阶Hessian矩阵的逆矩阵,拟牛顿法将Hessian矩阵用一个一阶矩阵
G
k
=
G
(
x
(
k
)
)
G_{k}=G(x^{(k)})
Gk=G(x(k))来近似代替
H
k
−
1
=
H
−
1
(
x
(
k
)
)
H_{k}^{-1}=H^{-1}(x^{(k)})
Hk−1=H−1(x(k))。
根据牛顿法中
H
k
H_{k}
Hk满足的条件:
H
k
+
1
−
1
⋅
(
∇
f
(
x
k
+
1
)
−
∇
f
(
x
k
)
)
=
x
k
+
1
−
x
k
H_{k+1}^{-1} \cdot\left(\nabla f\left(x_{k+1}\right)-\nabla f\left(x_{k}\right)\right)=x_{k+1}-x_{k}
Hk+1−1⋅(∇f(xk+1)−∇f(xk))=xk+1−xk该式即为“拟牛顿条件”。记
y
k
=
g
k
+
1
−
g
k
=
∇
f
(
x
k
+
1
)
−
∇
f
(
x
k
)
δ
k
=
x
k
+
1
−
x
k
\begin{array}{l} y_{k}=g_{k+1}-g_{k}=\nabla f\left(x_{k+1}\right)-\nabla f\left(x_{k}\right) \\ \delta_{k}=x_{k+1}-x_{k} \end{array}
yk=gk+1−gk=∇f(xk+1)−∇f(xk)δk=xk+1−xk且
H
k
H_{k}
Hk为正定以保证牛顿法沿下降方向搜索,因此
G
k
G_{k}
Gk需满足
- 替代矩阵 G k G_{k} Gk正定,只有正定才能保证牛顿法的搜索方向是向下搜索的;
- 替代矩阵 G k G_{k} Gk满足拟牛顿条件, G k + 1 ⋅ y k = δ k G_{k+1}\cdot y_k=\delta_k Gk+1⋅yk=δk
每次迭代更新替代矩阵 G k G_{k} Gk, G k + 1 = G k + Δ G k G_{k+1}=G_k+\Delta G_k Gk+1=Gk+ΔGk。
DFP
用矩阵 D k D_k Dk替代 H k − 1 H_k^{-1} Hk−1,则有 δ k = D k + 1 ⋅ y k D k + 1 = D k + Δ D k \begin{array}{l} \delta_k=D_{k+1}\cdot y_k \\ D_{k+1}=D_k+\Delta D_k \end{array} δk=Dk+1⋅ykDk+1=Dk+ΔDk设 Δ D k = α u u T + β v v T \Delta D_{k}=\alpha uu^T+\beta vv^T ΔDk=αuuT+βvvT,则 D k + 1 ⋅ y k = D k ⋅ y k + u ( α u T y k ) + v ( β v T y k ) D_{k+1}\cdot y_k=D_k\cdot y_k+u(\alpha u^Ty_k)+v(\beta v^Ty_k) Dk+1⋅yk=Dk⋅yk+u(αuTyk)+v(βvTyk)则 D k + 1 ⋅ y k − D k ⋅ y k = u ( α u T y k ) + v ( β v T y k ) D_{k+1}\cdot y_k-D_k\cdot y_k=u(\alpha u^Ty_k)+v(\beta v^Ty_k) Dk+1⋅yk−Dk⋅yk=u(αuTyk)+v(βvTyk)又 D k + 1 ⋅ y k − D k ⋅ y k = δ k − D k ⋅ y k D_{k+1}\cdot y_k-D_k\cdot y_k=\delta_k-D_k\cdot y_k Dk+1⋅yk−Dk⋅yk=δk−Dk⋅yk则令 u = δ k u=\delta_k u=δk, v = D k ⋅ y k v=D_k\cdot y_k v=Dk⋅yk, α u T y k = 1 \alpha u^Ty_k=1 αuTyk=1, β v T y k = − 1 \beta v^Ty_k=-1 βvTyk=−1 可满足上式。则有 α k = 1 δ k T ⋅ y k β t = 1 y k T D k y k \begin{array}{c} \alpha_{k}=\frac{1}{\delta _k^{T}\cdot y_k} \\ \beta_{t}=\frac{1}{y_k^{T} D_{k}y_{k}} \end{array} αk=δkT⋅yk1βt=ykTDkyk1 Δ D k = δ k δ k T δ k T y k − D k y k y k T D k T y k T D k y k \Delta D_{k}=\frac{\delta_{k}\delta_{k}^T}{\delta _k^{T} y_k}-\frac{D_{k}y_{k}y_{k}^TD_{k}^T}{y_k^{T} D_{k}y_{k}} ΔDk=δkTykδkδkT−ykTDkykDkykykTDkT优点
- 时间复杂度为 O ( n 2 ) O\left(n^{2}\right) O(n2),比起普通牛顿迭代矩阵求逆,时间复杂度大大降低
BFGS
与DFP相反,BFGS将
H
k
H_{k}
Hk用替代矩阵
B
k
B_{k}
Bk表示,即
y
k
=
B
k
+
1
δ
k
B
k
+
1
=
B
k
+
Δ
B
k
\begin{array}{l} y_{k}=B_{k+1}\delta_{k} \\ B_{k+1}=B_k+\Delta B_k \end{array}
yk=Bk+1δkBk+1=Bk+ΔBk
Δ
B
k
=
y
k
y
k
T
y
k
T
δ
k
−
B
k
δ
k
δ
k
T
B
k
T
δ
k
T
B
k
δ
k
\Delta B_{k}=\frac{y_{k}y_{k}^T}{y_k^{T} \delta_k}-\frac{B_{k}\delta_{k}\delta_{k}^TB_{k}^T}{\delta_k^{T} B_{k}\delta_{k}}
ΔBk=ykTδkykykT−δkTBkδkBkδkδkTBkT
δ
k
=
B
k
+
1
−
1
⋅
y
k
\delta_k=B_{k+1}^{-1}\cdot y_{k}
δk=Bk+1−1⋅yk在迭代过程中,引入两次 Sherman-Morrison 公式替代传统通过求解
B
k
+
1
−
1
B_{k+1}^{-1}
Bk+1−1的方式。
Sherman-Morrison 公式为设
A
∈
R
n
A \in \mathbb{R}^{n}
A∈Rn为非奇导方阵,
u
,
v
∈
R
n
\mathbf{u}, \mathbf{v} \in \mathbb{R}^{n}
u,v∈Rn,若
1
+
v
T
A
−
1
u
≠
0
1+\mathbf{v}^{T} A^{-1} \mathbf{u} \neq 0
1+vTA−1u=0,则有
(
A
+
u
v
T
)
−
1
=
A
−
1
−
A
−
1
u
v
T
A
−
1
1
+
v
T
A
−
1
u
\left(A+\mathbf{u v}^{T}\right)^{-1}=A^{-1}-\frac{A^{-1} \mathbf{u v}^{T} A^{-1}}{1+\mathbf{v}^{T} A^{-1} \mathbf{u}}
(A+uvT)−1=A−1−1+vTA−1uA−1uvTA−1则
B
k
+
1
−
1
=
(
I
−
δ
k
y
k
T
y
k
T
δ
k
)
B
k
−
1
(
I
−
y
k
δ
k
T
y
k
T
δ
k
)
+
δ
k
δ
k
T
y
k
T
δ
k
B_{k+1}^{-1}=\left(I-\frac{\mathbf{\delta}_{k} \mathbf{y}_{k}^{T}}{\mathbf{y}_{k}^{T} \mathbf{\delta}_{k}}\right) B_{k}^{-1}\left(I-\frac{\mathbf{y}_{k} \mathbf{\delta}_{k}^{T}}{\mathbf{y}_{k}^{T} \mathbf{\delta}_{k}}\right)+\frac{\mathbf{\delta}_{k} \mathbf{\delta}_{k}^{T}}{\mathbf{y}_{k}^{T} \mathbf{\delta}_{k}}
Bk+1−1=(I−ykTδkδkykT)Bk−1(I−ykTδkykδkT)+ykTδkδkδkT优点
- 不需求解线性方程组,矩阵-向量运算即可完成。初始矩阵一般设为单位矩阵。
缺点
- 当优化问题规模很大时,矩阵的存储和计算将变得不可行
L-BFGS
L-BFGS为限制内存BFGS算法(Limited memory BFGS),基本思想是只保存最近的m次迭代信息,从而大大减少数据的存储空间。
优化方法选择经验
- 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值。
- SGD通常训练时间更长,但在好的初始化和学习率调度方案的情况下,结果更可靠。
- 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
- Adadelta,RMSprop,Adam比较相近,在相似的情况下表现差不多。
- 在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
参考文献