<一年前看的,有的懂了有的没懂,但是没有做记录,现在什么也不记得了。今天同学问我是否有了解,原来我只记得这些算法的名字了。时刻提醒我好记性不如烂笔头,我要好好记录总结。>
梯度下降算法
模型参数
θ
\theta
θ
目标函数
J
(
θ
)
J(\theta)
J(θ)
学习率
α
\alpha
α
梯度
g
t
=
∇
θ
J
t
(
θ
)
g_t =\nabla_{\theta} J_t (\theta)
gt=∇θJt(θ)
对于一个待求解的问题,给定待优化的模型参数 θ \theta θ 和目标函数 J ( θ ) J(\theta) J(θ),算法通过沿着梯度 ∇ θ J ( θ ) \nabla_\theta J(\theta) ∇θJ(θ)的相反方向来更新 θ \theta θ来最小化 J ( θ ) J(\theta) J(θ)。学习率 α \alpha α决定了每一个时刻更新的步长。
模型参数更新就是:
θ t = θ t − 1 − α ∇ θ J t ( θ ) \theta_t = \theta_{t-1} - \alpha \nabla_{\theta} J_t (\theta) θt=θt−1−α∇θJt(θ)
每一次迭代都会使用所有的样本进行梯度的更新,也被称作批量梯度下降。BGD (Batch Gradient Descent) ,缺点就是:当样本数目 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
梯度下降算法相应的变种还有随即梯度下降 SGD,和小批量梯度下降。
随机梯度下降法不同于批量梯度下降,随机梯度下降是每次迭代随机采样一个样本来对参数进行更新,计算开销从O(n) 下降到O(1),使得训练速度加快。随机梯度下降,虽然提高了计算效率,但是由于随机性比较大,所以下降过程非常曲折。如何理解随即梯度下降
小批量梯度下降,是对批量梯度下降以及随机梯度下降的一个折中办法,我们选取一定数量的样本组成一个小批量样本,然后用这个小批量样本更新梯度。不仅可以减少计算开销,还能提高算法稳定性。batcha_size的选择带来的影响:
(1)在合理地范围内,增大batch_size的好处:
a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
(2)盲目增大batch_size的坏处:
a. 内存利用率提高了,但是内存容量可能撑不住了。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
参考: BGD,SGD,MBDGD的理解
Momentum
γ
\gamma
γ 动量项参数,表示上一时刻的动量保留程度,一般设为0.9。
η
\eta
η学习率,(此处学习率符号换成
η
\eta
η,是为了跟文章一致)
Momentum的引入为了解决SGD中容易陷入震荡的问题。用作者的话说就是加速SGD在正确的方向下降,并抑制震荡。
m
t
=
γ
m
t
−
1
+
η
∇
θ
J
(
θ
)
θ
t
=
θ
t
−
1
−
m
t
\begin{aligned} m_{t} &=\gamma m_{t-1}+\eta \nabla_{\theta} J(\theta) \\ \theta_t &=\theta_{t-1}-m_{t} \end{aligned}
mtθt=γmt−1+η∇θJ(θ)=θt−1−mt
SGD-M的方法,实际上表明,参数的更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。
Adagrad
待补充
Adadelta
Adadelta 是Adagrad的延伸。
RMSprop
RMSprop是Hinton在课堂是提供的一种适应性学习速率方法,没有被发表过。Lecture 6e of his Coursera Class
为了进一步优化损失函数在更新中存在摆动幅度过大的问题,并且进一步加快函数的收敛速度,RMSProp算法也同样为了解决消失的学习率。学习速率
η
\eta
η除了梯度平方的指数衰减均值。
E
[
g
2
]
t
=
0.9
E
[
g
2
]
t
−
1
+
0.1
g
t
2
θ
t
+
1
=
θ
t
−
η
E
[
g
2
]
t
+
ϵ
g
t
\begin{aligned} E\left[g^{2}\right]_{t} &=0.9 E\left[g^{2}\right]_{t-1}+0.1 g_{t}^{2} \\ \theta_{t+1} &=\theta_{t}-\frac{\eta}{\sqrt{E\left[g^{2}\right]_{t}+\epsilon}} g_{t} \end{aligned}
E[g2]tθt+1=0.9E[g2]t−1+0.1gt2=θt−E[g2]t+ϵηgt
NAG
待补充
Adam算法
算法全称为:Adaptive moment estimation。学习之前,先总结下即将出现的参数:
g
t
g_t
gt梯度
g
t
=
∇
θ
J
t
(
θ
)
g_t =\nabla_{\theta} J_t (\theta)
gt=∇θJt(θ)
β
1
\beta_1
β1,
β
2
\beta_2
β2超参数,用于控制衰减速率
β
1
,
β
2
∈
[
0
,
1
)
\beta_1,\beta_2 \in [0,1)
β1,β2∈[0,1)
m
t
m_t
mt, 梯度的指数移动平均,又可以称为一阶矩估计.
v
t
v_t
vt,平方梯度的指数移动平均,又可以称为二阶矩估计。
α
\alpha
α,学习速率,或者称为步长因子,控制更新速度。
在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
超参数
β
1
,
β
2
\beta_1, \beta_2
β1,β2取值很接近1。作者推荐值,一阶动量的衰减率
β
1
=
0.9
\beta_1=0.9
β1=0.9,二阶动量的衰减率
β
2
=
0.99
\beta_2=0.99
β2=0.99。第0步时,都使用0进行初始化。因此初始阶段,动量相当于偏向了0,因此,加入了一个偏置校正(bias-corrected)。注意,下式分母中,参数t,为
β
1
,
β
2
\beta_1, \beta_2
β1,β2的t次方。
m
^
t
=
m
t
1
−
β
1
t
\hat{m}_t = \frac{m_t}{1- \beta_1^t}
m^t=1−β1tmt
v
^
t
=
v
t
1
−
β
2
t
\hat{v}_t = \frac{v_t}{1-\beta_2^t}
v^t=1−β2tvt
之后,再更新参数:
θ
t
=
θ
t
−
1
−
α
m
^
t
v
^
t
+
ϵ
\theta_{t} = \theta_{t-1} - \alpha \frac{\hat{m}_t} { \sqrt{\hat{v}_t} + \epsilon}
θt=θt−1−αv^t+ϵm^t
自己实现这个算法的时候,可以不直接使用上面的伪代码顺序。作者特意提到,可以通过如下的方式,提升算法的效率。本质上代入后是等价的。
α
t
=
α
⋅
1
−
β
2
t
/
(
1
−
β
1
t
)
θ
t
←
θ
t
−
1
−
α
t
⋅
m
t
/
(
v
t
+
ϵ
^
)
\begin{array}{c}\alpha_{t}=\alpha \cdot \sqrt{1-\beta_{2}^{t}} /\left(1-\beta_{1}^{t}\right) \\ \theta_{t} \leftarrow \theta_{t-1}-\alpha_{t} \cdot m_{t} /(\sqrt{v_{t}}+\hat{\epsilon})\end{array}
αt=α⋅1−β2t/(1−β1t)θt←θt−1−αt⋅mt/(vt+ϵ^)
优势总结:
1.直截了当地实现
2.高效的计算
3.所需内存少
4.梯度对角缩放的不变性(第二部分将给予证明)
5.适合解决含大规模数据和参数的优化问题
6.适用于非稳态(non-stationary)目标
7.适用于解决包含很高噪声或稀疏梯度的问题
8.超参数可以很直观地解释,并且基本上只需极少量的调参
参考:Adam论文
博客:深度学习最常用的学习算法:Adam优化算法
An overview of gradient descent optimization algorithms