深度学习笔记——优化方法

深度模型中的优化

用于深度模型训练的优化算法与传统的优化算法有几个方面有所不同:

学习纯优化
间接优化目标函数,以降低泛化误差(通常目标函数不可解,或者是NP难问题)直接最小化目标函数本身
训练算法通常不会停止在局部极小点终止在导数较小的地方
训练算法的目标函数通常可以分解为训练样本上的求和(批量算法和小批量算法)整个样本集

在传统的机器学习问题中,我们会小心设计目标函数和约束,以确保优化问题是凸的。但是即使是凸优化也会遇到问题,何况在训练神经网络是会遇到很多非凸问题。所以,在神经网络优化中会出先很多的挑战:
(1)病态问题:对数据中的小扰动反映特别敏感。在神经网络训练中,会体现在随机梯度下降会“卡”在某些情况,此时即使很小的更新步长也会增加代价函数。
(2)局部极小值:模型可辨识性问题
(3)鞍点剧增:在低维空间中,局部极小值很普遍,在高维空间中,局部极小点很罕见但鞍点很常见。其中,鞍点和局部极小值的数量比率期望会随着维数n指数级增长。高维空间中鞍点的激增或许就解释了在神经网络训练中为什么二阶方法无法成功取代梯度下降的原因
(4)悬崖和梯度爆炸:悬崖的产生是因为几个较大权重相乘导致的。遇到斜率极大的悬崖结构时,梯度更新会很大程度改变参数值,可能使大量已经完成的优化工作称为无用功。
(5)长期依赖问题:由于变深的结构使模型丧失了学习到先前信息的能力,让优化变得困难。 这个问题在循环网络中更严重,因为循环网络要在很长时间序列的各个时刻重复应用相同操作来构建非常深的计算图,并且模型参数共享。
(6)非精确梯度: 在优化时,我们需要精确的梯度或Hessian矩阵,但在实际中,当目标函数不可解时,通常梯度是很难处理的,这时,我们只能近似梯度。
(7)局部和全局结构间的弱对应:目前在求解具有困难全局结构问题时,旨在寻求良好的初始点,而不是开发非局部范围更新的算法。

优化算法

1、梯度下降类方法

  • 梯度下降算法 : 在每一次迭代中,梯度下降使用整个训练数据集来计算梯度,因此它有时也被称为批量梯度下降。
  • 随机梯度下降(SGD) :

SGD在第 k 个训练迭代的更新过程如下:

初始化学习率 ε k \varepsilon_k εk,参数 θ \theta θ
while 停机准则 do:
       \space\space\space\space\space\space       从训练集中随机抽取包含m个样本{ x 1 , x 2 , . . , x m x_1,x_2,..,x_m x1,x2,..,xm}的小批量,其中 x i x_i xi对应的目标为 y i y_i yi
       \space\space\space\space\space\space       计算梯度估计: g ^ = + 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) \hat g=+\frac{1}{m}\bigtriangledown_\theta\sum_iL(f(x_i;\theta),y_i) g^=+m1θiL(f(xi;θ),yi)
       \space\space\space\space\space\space       应用更新: θ = θ − ε g ^ \theta=\theta-\varepsilon\hat g θ=θεg^
end while

之前我们用的都是固定的学习率,在实践中,是有必要随着时间的推移逐渐降低学习率的,常使用线性衰减学习率直到 τ \tau τ次迭代: ε k = ( 1 − α ) ε 0 + α ε τ \varepsilon_k=(1-\alpha)\varepsilon_0+\alpha\varepsilon_\tau εk=(1α)ε0+αετ其中 α = k τ \alpha=\frac{k}{\tau} α=τk。在 τ \tau τ步迭代后,一般使学习率为常数。一般地, 设为的 1%, τ \tau τ被设为需要反复遍历训练集几百次的迭代次数。现在关键是如何设置 ε 0 \varepsilon_0 ε0 ε 0 \varepsilon_0 ε0太大的 ,学习曲线会剧烈震荡,代价函数值通常会明显增加,如果太小,学习过程会很缓慢,初始学习率太低,那么学习可能会卡在一个相当高的代价值。通常,最好是检测最早的几轮迭代,选择一个比在效果上表现最佳的学习率更大的学习率,但也不能导致太大的震荡。

(1)SGD的优点是:收敛快
(2)缺点:需要手动选取合适的学习率和初始参数,易被困局部最优。

  • Mini-batch Gradient Descent :小批量梯度下降算法,是折中方案,选取训练集中一个小批量样本计算,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。

2、动量

动量算法积累了之前梯度指数级衰减的移动平均,并且继续沿着该方向移动。
动量在物理学定义为质量乘以速度,这里,假设是单位质量。参数更新规则如下: v = α v − ε ▽ θ ( 1 m ∑ i L ( f ( x i ; θ ) , y i ) ) v=\alpha v-\varepsilon\bigtriangledown_\theta(\frac{1}{m}\sum_iL(f(x_i;\theta),y_i)) v=αvεθ(m1iL(f(xi;θ),yi)) θ = θ + v \theta=\theta+v θ=θ+v α ∈ [ 0 , 1 ) \alpha\in[0,1) α[0,1),实际运用中, α \alpha α一般取值0.5,0.9,0.99。速度v积累了梯度,相对于 ε , α \varepsilon,\alpha εα越大,之前梯度对现在方向的影响也越大。

使用动量的SGD:

初始化学习率 ε \varepsilon ε,参数 θ \theta θ,动量参数 α \alpha α,初始速度 v
while 停机准则 do:
       \space\space\space\space\space\space       从训练集中随机抽取包含m个样本{ x 1 , x 2 , . . , x m x_1,x_2,..,x_m x1,x2,..,xm}的小批量,其中 x i x_i xi对应的目标为 y i y_i yi
       \space\space\space\space\space\space       计算梯度估计: g ^ = 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) \hat g=\frac{1}{m}\bigtriangledown_\theta\sum_iL(f(x_i;\theta),y_i) g^=m1θiL(f(xi;θ),yi)
       \space\space\space\space\space\space       计算速度估计: v = α v − ε g ^ v=\alpha v-\varepsilon\hat g v=αvεg^
       \space\space\space\space\space\space       应用更新: θ = θ + v \theta=\theta+v θ=θ+v
end while

  • 优点:解决了两个问题:Hessian矩阵的病态条件和随机梯度的方差;收敛速度较快。

  • 代价是引入了另一个超参数速度 v

  • Nesterov 动量
    Nesterov 动量是动量算法的一个变种,参数变化规则如下:: v = α v − ε ▽ θ ( 1 m ∑ i L ( f ( x i ; θ + α v ) , y i ) ) v=\alpha v-\varepsilon\bigtriangledown_\theta(\frac{1}{m}\sum_iL(f(x_i;\theta+\alpha v),y_i)) v=αvεθ(m1iL(f(xi;θ+αv),yi)) θ = θ + v \theta=\theta+v θ=θ+v
    在凸批量梯度情况下,收敛速度明显改善;但是在随机梯度下,并没有效果。

3、自适应学习率算法

(1)Delta-bar-delta : 早期的一种启发式方法,思想是,若损失对于某个给定模型参数的偏导保持相同符号,则学习率保持增加,反之,减少。(这种方法只能用于全批量优化中)
(2)AdaGrad :
参数更新规则: 累 计 梯 度 平 方 : r = r + g ^ ⊙ g ^ 累计梯度平方:r=r+\hat g\odot\hat g r=r+g^g^ Δ θ = − ϵ δ + r ⊙ g ^ \Delta\theta =- \frac{\epsilon}{\delta+\sqrt{r}} \odot \hat g Δθ=δ+r ϵg^ θ = θ + Δ θ \theta=\theta+\Delta\theta θ=θ+Δθ 常数 δ \delta δ一般设置为 1 0 − 7 10^{-7} 107保证分母是非零的很小的数。

  • Adagrad 算法在具有最大偏导的参数相应地有一个快速下降的学习率,而在具有较小偏导的参数在学习率上有相对较小的下降。
  • 缺点:依赖手工设置一个全局学习率;Adagrad 在迭代中后期,分母梯度平方的累加将会越来越大,使梯度趋向于0,训练提前结束。
    (3)RMSProp :
  • RMSProp是Adagrad 的一次改进,相对Adagrad 在非凸条件下更好;
  • Adagrad 会加上之前所有的梯度,而 RMSProp会丢弃之前的一部分值,从而能更快的收敛。
  • RMSProp会引入一个新超参数衰减速率 ρ \rho ρ,以控制移动平均的长度范围。
    累 计 梯 度 平 方 : r = ρ r + ( 1 − ρ ) g ^ ⊙ g ^ 累计梯度平方:r=\rho r+(1-\rho)\hat g\odot\hat g r=ρr+(1ρ)g^g^ Δ θ = − ϵ δ + r ⊙ g ^ \Delta\theta =- \frac{\epsilon}{\delta+\sqrt{r}} \odot \hat g Δθ=δ+r ϵg^ θ = θ + Δ θ \theta=\theta+\Delta\theta θ=θ+Δθ

(4)Adam
Adam本质上是带动量的RMSProp,其特点如下:

  • Adam梯度经过偏置矫正后,每一次迭代学习率都有一个固定的范围,它利用梯度的一阶矩估计和 二阶矩估计动态调整每个参数的学习率,使得参数比较平稳;
  • 结合了Adgard处理稀疏梯度和RMSProp处理非平稳目标的优点
  • 为不同的参数计算不同的学习率
  • Adam也适用于大多数非凸优化问题,也适用于大数据集和高维空间。
    参数更新规则:
    更 新 有 偏 的 一 阶 矩 估 计 : s = ρ 1 s + ( 1 − ρ 1 ) g ^ 更新有偏的一阶矩估计:s=\rho_1 s+(1-\rho_1)\hat g s=ρ1s+(1ρ1)g^ 更 新 有 偏 的 二 阶 矩 估 计 : r = ρ 2 r + ( 1 − ρ 2 ) g ^ ⊙ g ^ 更新有偏的二阶矩估计:r=\rho_2 r+(1-\rho_2)\hat g\odot\hat g r=ρ2r+(1ρ2)g^g^ 修 正 一 阶 矩 的 偏 差 s ^ = s 1 − ρ 1 t 修正一阶矩的偏差\hat s = \frac{s}{1-\rho_{1}^{t}} s^=1ρ1ts 修 正 二 阶 矩 的 偏 差 r ^ = r 1 − ρ 2 t 修正二阶矩的偏差\hat r = \frac{r}{1-\rho_{2}^{t}} r^=1ρ2tr Δ θ = − s ^ t ^ + δ \Delta\theta=-\frac{\hat s}{\sqrt{\hat t}+\delta} Δθ=t^ +δs^ θ = θ + Δ θ \theta=\theta+\Delta\theta θ=θ+Δθ

4、二阶近似方法

二阶方法主要是使用二阶导数改进了优化。
(1)牛顿法
Δ θ = − H − 1 g \Delta\theta=-H^{-1}g Δθ=H1g
最大的缺点就是需要计算Hessian矩阵(只能是正定的)。对于出现鞍点的情况,可以使用带正则的牛顿法。
(2)共轭梯度法(CG)
共轭梯度法是一种通过迭代下降的共轭方向以避免Hessian矩阵求逆计算的方法。在共轭梯度法中,我们寻求一个和先前搜索方向共轭的方向,即它不会撤销该方向的发展。

  • 计算梯度 g ^ t \hat g_t g^t
  • 计算系数 β t \beta_t βt,用于控制沿先前搜索方向 d t − 1 d_{t-1} dt1加回多少到当前搜索方向 d t d_t dt上(计算方式有 F l e t c h e r − R e e v e s Fletcher-Reeves FletcherReeves P o l a k − R i b i e ˋ r e Polak-Ribi\grave{e}re PolakRibieˋre,对于非线性共轭梯度,视情况置为0)
  • 计算搜索方向: d t = − g ^ t + β t d t − 1 d_t=-\hat g_t+\beta_td_{t-1} dt=g^t+βtdt1
  • 执行线性搜索: ϵ ∗ = arg ⁡ min ⁡ ϵ 1 m ∑ i m L ( f ( x i ; θ t + ϵ d t ) , y i ) \epsilon^*=\arg\min_\epsilon\frac{1}{m}\sum_i^mL(f(x_i;\theta_t+\epsilon d_t),y_i) ϵ=argminϵm1imL(f(xi;θt+ϵdt),yi)
  • 更新: θ t + 1 = θ t + ϵ ∗ d t \theta_{t+1}=\theta_t+\epsilon^* d_t θt+1=θt+ϵdt
    (3)拟牛顿方法
    拟牛顿方法是构造一个矩阵近似Hessian的逆,避免了直接求解复杂的逆运算和Hessian非正定的情况。有DFP 、BFGS和L-BFGS。
    https://blog.csdn.net/qq_31827399/article/details/97893761

[1] 当然,每个算法都难逃初始化参数。如果参数初始化不合理,则会导致收敛太慢,甚至不收敛等。这篇文章讲了一些初始化策略 https://www.jianshu.com/p/e817b2bcab63

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值