优化方法总结比较(SGD,Momentum,Nesterov,Adagrad,Adadelta,RMSprop,Adam,Adamax,Nadam,DFP,BFGS)

随机梯度下降法

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=μmk1+gkΔθk=ηmk 其中, μ \mu μ是动量因子

优点

  • 前后梯度方向一致时,能够加速学习
  • 前后梯度方向不一致时,能够抑制震荡
  • 下降中后期时,在局部最小值来回震荡的时候, gradient → 0 \text {gradient} \rightarrow 0 gradient0 μ \mu μ 使得更新幅度增大,有一定摆脱局部最优的能力

Nesterov

Nesterov项是momentum的改进,在梯度更新时做一个校正,让之前的动量直接影响当前的动量,避免前进太快,同时提高灵敏度。
Momentum梯度更新展开为 Δ θ k = − η ∗ μ ∗ m k − 1 − η ∗ g k \Delta \theta_{k}=-\eta * \mu * m_{k-1}-\eta * g_{k} Δθk=ημmk1η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ημmk1ηgk可以看出, m k − 1 m_{k-1} mk1并没有直接改变当前梯度 g k g_{k} gk。Nesterov可将 θ k − η ∗ μ ∗ m k − 1 \theta_{k}-\eta * \mu * m_{k-1} θkημmk1看做当前优化的一个“展望”项,对该项进行求导,让之前的动量直接影响当前梯度 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ημmk1)mk=μmk1+gkΔθk=ηmk
Nesterov momentum v.s. momentum
缺点

  • 人工设置的学习率非常生硬

自适应学习率优化法

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=nk1+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基本思想是用一阶的方法,近似模拟二阶牛顿法。

  1. Accumulate Over Window
    Adagrad会累加之前所有的梯度平方,而Adadelta只在一个窗口w中对梯度进行累加,这样不会让梯度被惩罚至0。
    由于计算 E [ g k − w : k ] E[g_{k}−w:k] E[gkw: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=νnk1+(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]k1+(1ν)gk2相当于历史梯度信息的 E [ g 2 ] k − 1 E\left[g^{2}\right]_{k-1} E[g2]k1累计乘上一个衰减系数 ν \nu ν,然后用 ( 1 − ν ) (1-\nu) (1ν)作为当前梯度的平方加权系数相加。
    在此处Adadelta其实还是依赖于全局学习率 η \eta η,因此采用近似牛顿迭代法继续改进:
  2. 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} Δxgxfx1 Δ 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 ΔxH1gx22fxfx1z1x1x Δ x \Delta x Δx 可以正比到Hessian逆矩阵 H − 1 ⋅ g H^{-1}\cdot g H1g问题,再正比到二阶导数。而 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=xkf(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}}} Δxx22fxf进而又有: ∂ 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} x22fxf=x22f1xf=x22f1gk简单收束变形一下, 然后用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}} z22f1=xfΔxRMS[g]kRMS[Δx]k1
    最后,一阶完整近似式:
    Δ 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]k1gkxk+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]k1+(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=RMSgkη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=μmk1+(1μ)gknk=νnk1+(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| Egk E ∣ g k 2 ∣ E\left|g^2_{k}\right| Egk2的估计; 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(νnk1,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=μkmk1+(1μk)gkm^k=1Πi=1k+1μimknk=νnk1+(1ν)gk2nk^=1νknkmˉk=(1μk)g^k+μk+1m^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=Hk1gk 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)}) Hk1=H1(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+11(f(xk+1)f(xk))=xk+1xk该式即为“拟牛顿条件”。记 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+1gk=f(xk+1)f(xk)δk=xk+1xk H k H_{k} Hk为正定以保证牛顿法沿下降方向搜索,因此 G k G_{k} Gk需满足

  1. 替代矩阵 G k G_{k} Gk正定,只有正定才能保证牛顿法的搜索方向是向下搜索的;
  2. 替代矩阵 G k G_{k} Gk满足拟牛顿条件, G k + 1 ⋅ y k = δ k G_{k+1}\cdot y_k=\delta_k Gk+1yk=δ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} Hk1,则有 δ 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+1ykDk+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+1yk=Dkyk+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+1ykDkyk=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+1ykDkyk=δkDkyk则令 u = δ k u=\delta_k u=δk v = D k ⋅ y k v=D_k\cdot y_k v=Dkyk α 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=δkTyk1β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δkTykTDkykDkykykTDkT优点

  • 时间复杂度为 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+11yk在迭代过程中,引入两次 Sherman-Morrison 公式替代传统通过求解 B k + 1 − 1 B_{k+1}^{-1} Bk+11的方式。
Sherman-Morrison 公式为设 A ∈ R n A \in \mathbb{R}^{n} ARn为非奇导方阵, u , v ∈ R n \mathbf{u}, \mathbf{v} \in \mathbb{R}^{n} u,vRn,若 1 + v T A − 1 u ≠ 0 1+\mathbf{v}^{T} A^{-1} \mathbf{u} \neq 0 1+vTA1u=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=A11+vTA1uA1uvTA1 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+11=(IykTδkδkykT)Bk1(IykTδkykδkT)+ykTδkδkδkT优点

  • 不需求解线性方程组,矩阵-向量运算即可完成。初始矩阵一般设为单位矩阵。

缺点

  • 当优化问题规模很大时,矩阵的存储和计算将变得不可行

L-BFGS

L-BFGS为限制内存BFGS算法(Limited memory BFGS),基本思想是只保存最近的m次迭代信息,从而大大减少数据的存储空间。

优化方法选择经验

  • 对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值。
  • SGD通常训练时间更长,但在好的初始化和学习率调度方案的情况下,结果更可靠。
  • 如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
  • Adadelta,RMSprop,Adam比较相近,在相似的情况下表现差不多。
  • 在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。

SGD optimization on loss surface contours
SGD optimization on saddle point
参考文献

  1. 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)
  2. 优化算法Optimizer比较和总结
  3. 优化方法总结:SGD,Momentum,AdaGrad,RMSProp,Adam
  4. 自适应学习率调整:AdaDelta
  5. AdaDelta算法
  6. 深度学习笔记:优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对使用SGDMomentumAdaGradAdam优化算法来进行优化的问题,我可以给出如下回答: (1)SGD(随机梯度下降):SGD是最基本的优化算法,其每次迭代只使用一个样本更新参数。由于每次迭代只使用一个样本,SGD在训练过程中的收敛速度相对较慢,而且容易陷入局部最优解。但是SGD的计算量较小,在对大规模数据进行训练时,SGD是一种较为常用的优化算法。 (2)Momentum(动量法):Momentum算法是在SGD算法的基础上引入了动量项,用于加速收敛速度。Momentum算法能够有效地解决SGD算法在参数更新中出现的震荡现象,使得参数更新更加平滑。Momentum算法的核心思想是在参数更新时加入上一次更新的动量,避免梯度方向变化过快导致的震荡现象。 (3)AdaGrad(自适应梯度算法):AdaGrad算法是一种自适应学习率算法,其主要思想是对每个参数的学习率进行自适应调整。AdaGrad算法能够根据不同参数的梯度大小自动调整学习率,使得梯度较大的参数学习率较小,梯度较小的参数学习率较大。这样能够有效地解决SGD算法在训练过程中学习率过大或过小的问题。 (4)Adam(自适应矩估计算法):Adam算法是一种自适应学习率算法,其主要思想是基于梯度的一阶矩估计和二阶矩估计来更新参数。Adam算法能够自适应地调整每个参数的学习率,并且具有较好的收敛性能。相比于AdaGrad算法Adam算法能够更加准确地估计每个参数的梯度,从而更加有效地调整学习率。 以上就是使用SGDMomentumAdaGradAdam优化算法来进行优化的回答,希望能够对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值