Batch Gradient Descent(批量梯度下降)
在每一轮的训练过程中, B a t c h Batch Batch G r a d i e n t Gradient Gradient D e s c e n t Descent Descent 算法用整个训练集的数据计算 c o s t cost cost f u c t i o n fuction fuction 的梯度,并用该梯度对模型参数进行更新:
Θ = Θ − α ⋅ ▽ Θ J ( Θ ) \Theta = \Theta - \alpha \cdot \triangledown _{\Theta} J(\Theta) Θ=Θ−α⋅▽ΘJ(Θ)
优点:
- c o s t cost cost f u c t i o n fuction fuction 若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值.
缺点:
- 由于每轮迭代都需要在整个数据集上计算一次,所以批量梯度下降可能非常慢
- 训练数较多时,需要较大内存
- 批量梯度下降不允许在线更新模型,例如新增实例
Stochastic Gradient Descent(随机梯度下降)
和批梯度下降算法相反, S t o c h a s t i c Stochastic Stochastic g r a d i e n t gradient gradient d e s c e n t descent descent 算法每读入一个数据,便立刻计算 c o s t cost cost f u c t i o n fuction fuction 的梯度来更新参数:
Θ = Θ − α ⋅ ▽ Θ J ( Θ ; x ( i ) , y ( i ) ) \Theta = \Theta - \alpha \cdot \triangledown _{\Theta} J(\Theta; x^{(i)}, y^{(i)}) Θ=Θ−α⋅▽ΘJ(Θ;x(i),y(i))
优点:
- 算法收敛速度快(在 B a t c h Batch Batch G r a d i e n t Gradient Gradient D e s c e n t Descent Descent 算法中, 每轮会计算很多相似样本的梯度, 这部分是冗余的)
- 可以在线更新
- 有几率跳出一个比较差的局部最优而收敛到一个更好的局部最优甚至是全局最优
缺点:
- 容易收敛到局部最优,并且容易被困在鞍点
Mini-batch Gradient Descent(小批量梯度下降)
m i n i − b a t c h mini-batch mini−batch G r a d i e n t Gradient Gradient D e s c e n t Descent Descent 的方法是在上述两个方法中取折衷, 每次从所有训练数据中取一个子集 ( m i n i − b a t c h ) (mini-batch) (mini−batch) 用于计算梯度:
Θ = Θ − α ⋅ ▽ Θ J ( Θ ; x ( i : i + n ) , y ( i : i + n ) ) \Theta = \Theta - \alpha \cdot \triangledown _{\Theta} J(\Theta; x^{(i:i+n)}, y^{(i:i+n)}) Θ=Θ−α⋅▽ΘJ(Θ;x(i:i+n),y(i:i+n))
M i n i − b a t c h Mini-batch Mini−batch G r a d i e n t Gradient Gradient D e s c e n t Descent Descent 在每轮迭代中仅仅计算一个 m i n i − b a t c h mini-batch mini−batch 的梯度,不仅计算效率高,而且收敛较为稳定。该方法是目前深度学训练中的主流方法
上述三个方法面临的主要挑战如下:
- 选择适当的学习率 α \alpha α 较为困难。太小的学习率会导致收敛缓慢,而学习速度太块会造成较大波动,妨碍收敛。
- 目前可采用的方法是在训练过程中调整学习率大小,例如模拟退火算法:预先定义一个迭代次数 m m m,每执行完 m m m 次训练便减小学习率,或者当 c o s t f u n c t i o n cost function costfunction 的值低于一个阈值时减小学习率。然而迭代次数和阈值必须事先定义,因此无法适应数据集的特点。
- 上述方法中, 每个参数的 l e a r n i n g learning learning r a t e rate rate 都是相同的,这种做法是不合理的:如果训练数据是稀疏的,并且不同特征的出现频率差异较大,那么比较合理的做法是对于出现频率低的特征设置较大的学习速率,对于出现频率较大的特征数据设置较小的学习速率。
- 近期的的研究表明,深层神经网络之所以比较难训练,并不是因为容易进入 l o c a l local local m i n i m u m minimum minimum。相反,由于网络结构非常复杂,在绝大多数情况下即使是 l o c a l local local m i n i m u m minimum minimum 也可以得到非常好的结果。而之所以难训练是因为学习过程容易陷入到马鞍面中,即在坡面上,一部分点是上升的,一部分点是下降的。而这种情况比较容易出现在平坦区域,在这种区域中,所有方向的梯度值都几乎是 0。
S G D SGD SGD 方法的一个缺点是其更新方向完全依赖于当前 b a t c h batch batch 计算出的梯度,因而十分不稳定。 M o m e n t u m Momentum Momentum 算法借用了物理中的动量概念,它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前 b a t c h batch batch 的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力:
v t = γ ⋅ v t − 1 + α ⋅ ▽ Θ J ( Θ ) v_{t} = \gamma \cdot v_{t-1} + \alpha \cdot \triangledown _{\Theta}J(\Theta) vt=γ⋅vt−1+α⋅▽ΘJ(Θ)
Θ = Θ − v t \Theta = \Theta - v_{t} Θ=Θ−vt
M o m e n t u m Momentum Momentum 算法会观察历史梯度 v t − 1 v_{t-1} vt−1,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。**一种形象的解释是:**我们把一个球推下山,球在下坡时积聚动量,在途中变得越来越快,γ可视为空气阻力,若球的方向发生变化,则动量会衰减。
在小球向下滚动的过程中,我们希望小球能够提前知道在哪些地方坡面会上升,这样在遇到上升坡面之前,小球就开始减速。这方法就是 N e s t e r o v Nesterov Nesterov M o m e n t u m Momentum Momentum,其在凸优化中有较强的理论保证收敛。并且,在实践中 N e s t e r o v Nesterov Nesterov M o m e n t u m Momentum Momentum 也比单纯的 M o m e n t u m Momentum Momentum 的效果好:
v t = γ ⋅ v t − 1 + α ⋅ ▽ Θ J ( Θ − γ v t − 1 ) v_{t} = \gamma \cdot v_{t-1} + \alpha \cdot \triangledown _{\Theta}J(\Theta - \gamma v_{t-1}) vt=γ⋅vt−1+α⋅▽ΘJ(Θ−γvt−1)
Θ = Θ − v t \Theta = \Theta - v_{t} Θ=Θ−vt
其核心思想是:注意到 m o m e n t u m momentum momentum 方法,如果只看 γ ⋅ γ \gamma \cdot \gamma γ⋅γ 项,那么当前的 θ \theta θ 经过 m o m e n t u m momentum momentum 的作用会变成 θ − γ ⋅ γ \theta -\gamma \cdot \gamma θ−γ⋅γ。因此可以把 θ − γ ⋅ γ \theta - \gamma \cdot \gamma θ−γ⋅γ 这个位置看做是当前优化的一个”展望”位置。所以,可以在 θ − γ ⋅ v \theta -\gamma \cdot v θ−γ⋅v 求导, 而不是原始的 θ \theta θ 。
上述方法中,对于每一个参数 θ i \theta_{i} θi 的训练都使用了相同的学习率 α \alpha α 。 A d a g r a d Adagrad Adagrad 算法能够在训练中自动的对 l e a r n i n g learning learning r a t e rate rate 进行调整,对于出现频率较低参数采用较大的α更新;相反,对于出现频率较高的参数采用较小的α更新。因此, A d a g r a d Adagrad Adagrad 非常适合处理稀疏数据。
我们设 g t , i g_{t,i} gt,i 为第 t t t 轮第 i i i 个参数的梯度,即 g t , i = ▽ Θ J ( Θ i ) g_{t,i} = \triangledown_{\Theta}J(\Theta_{i}) gt,i=▽ΘJ(Θi) 。因此, S G D SGD SGD 中参数更新的过程可写为:
Θ t + 1 , i = Θ t , i − α ⋅ g t , i \Theta_{t+1,i} = \Theta_{t,i} - \alpha \cdot g_{t,i} Θt+1,i=Θt,i−α⋅gt,i
A d a g r a d Adagrad Adagrad 在每轮训练中对每个参数 θ i \theta_{i} θi 的学习率进行更新,参数更新公式如下:
Θ t + 1 , i = Θ t , i − α G t , i i + ϵ ⋅ g t , i \Theta_{t+1,i} = \Theta_{t,i} - \frac{\alpha}{\sqrt{G_{t,ii} + \epsilon}} \cdot g_{t,i} Θt+1,i=Θt,i−Gt,ii+ϵα⋅gt,i
其中, G t ∈ R d × d G_{t} \in \mathbb{R}^{d \times d} Gt∈Rd×d 为对角矩阵,每个对角线位置 i i i , i i i 为对应参数 θ i \theta_{i} θi 从第 1 1 1 轮到第 t t t 轮梯度的平方和。 ϵ \epsilon ϵ 是平滑项,用于避免分母为 0 0 0 ,一般取值 1 e − 8 1e−8 1e−8 。 A d a g r a d Adagrad Adagrad 的缺点是在训练的中后期,分母上梯度平方的累加将会越来越大,从而梯度趋近于 0 0 0 ,使得训练提前结束。
R M S p r o p RMSprop RMSprop 是 G e o f f Geoff Geoff H i n t o n Hinton Hinton 提出的一种自适应学习率方法。 A d a g r a d Adagrad Adagrad 会累加之前所有的梯度平方,而 R M S p r o p RMSprop RMSprop 仅仅是计算对应的平均值,因此可缓解 A d a g r a d Adagrad Adagrad 算法学习率下降较快的问题。
E [ g 2 ] t = 0.9 ⋅ E [ g 2 ] t − 1 + 0.1 ⋅ g t 2 E[g^{2}]_{t} = 0.9 \cdot E[g^{2}]_{t-1} + 0.1 \cdot g_{t}^{2} E[g2]t=0.9⋅E[g2]t−1+0.1⋅gt2
Θ t + 1 = Θ t − α E [ g 2 ] t + ϵ ⋅ g t \Theta_{t+1} = \Theta_{t} - \frac{\alpha}{\sqrt{E[g^{2}]_{t} + \epsilon }{}} \cdot g_{t} Θt+1=Θt−E[g2]t+ϵα⋅gt
A d a m ( A d a p t i v e Adam(Adaptive Adam(Adaptive M o m e n t Moment Moment E s t i m a t i o n ) Estimation) Estimation) 是另一种自适应学习率的方法。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。 A d a m Adam Adam 的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。公式如下:
m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_{t} = \beta_{1} m_{t-1} + (1-\beta_{1})g_{t} mt=β1mt−1+(1−β1)gt
v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_{t} = \beta_{2} v_{t-1} + (1-\beta_{2})g_{t}^{2} vt=β2vt−1+(1−β2)gt2
m t ^ = m t 1 − β 1 t \hat{m_{t}} = \frac{m_{t}}{1-\beta_{1}^{t}} mt^=1−β1tmt
v t ^ = v t 1 − β 2 t \hat{v_{t}} = \frac{v_{t}}{1-\beta_{2}^{t}} vt^=1−β2tvt
Θ t + 1 = Θ t − α v t ^ + ϵ ⋅ m t ^ \Theta_{t+1} = \Theta_{t} - \frac{\alpha}{\sqrt{\hat{v_{t}}} + \epsilon} \cdot \hat{m_{t}} Θt+1=Θt−vt^+ϵα⋅mt^
其中, m t m_{t} mt 、 v t v_{t} vt分别是对梯度的一阶矩估计和二阶矩估计,可以看作对期望 E [ g t ] E[g_{t}] E[gt] , E [ g t 2 ] E[g_{t}^{2}] E[gt2] 的近似; m t ^ \hat{m_{t}} mt^,
v t v_{t} vt 是对 m t m_{t} mt, v t v_{t} vt 的校正,这样可以近似为对期望的无偏估计。 A d a m Adam Adam 算法的提出者建议 β 1 \beta_{1} β1 的默认值为 0.9 0.9 0.9 , β 2 \beta_{2} β2 的默认值为 0.999 0.999 0.999 , ϵ \epsilon ϵ 默认为 10 − 8 10−8 10−8 。
另外,在数据比较稀疏的时候, a d a p t i v e adaptive adaptive 的方法能得到更好的效果,例如 A d a g r a d Adagrad Adagrad, R M S p r o p RMSprop RMSprop, A d a m Adam Adam 等。 A d a m Adam Adam 方法也会比 R M S p r o p RMSprop RMSprop 方法收敛的结果要好一些, 所以在实际应用中 , A d a m Adam Adam 为最常用的方法,可以比较快地得到一个预估结果。
最后两张动图从直观上展现了算法的优化过程。第一张图为不同算法在损失平面等高线上随时间的变化情况,第二张图为不同算法在鞍点处的行为比较。
- An overview of gradient descent optimization algorithms