将各类型优化方法总结下方便查阅,大体分为:一阶梯度依赖的,二阶梯度依赖的;不依赖梯度的优化方法。
1)一阶梯度依赖的优化方法
1.1)GD:Gradient Descent
这个很好理解,根据梯度
▽wf(w)
▽
w
f
(
w
)
来指导下一步优化方向。
梯度来源于
f
f
沿着某方向的方向导数:
∂f∂w|l=⟨∂f∂w,l⟩
∂
f
∂
w
|
l
=
⟨
∂
f
∂
w
,
l
⟩
.
其中变化(增长)最快的方向及导数值称为梯度:
▽wf(w)=(∂f∂w0,∂f∂w1,..,∂f∂wi)
▽
w
f
(
w
)
=
(
∂
f
∂
w
0
,
∂
f
∂
w
1
,
.
.
,
∂
f
∂
w
i
)
1.2)Moment GD
[带有动量的GD](On the momentum term in gradient descent learning algorithms),其基本思路是,设想如果当前的梯度方向与历史累积的方向相同,是不是可以加大这个方向上的步幅,以加快收敛速度;若震荡的梯度,则是不是可以互相抵消,避免多走弯路,以加快收敛速度。[同向累计,反向抵消]如下,
γ=0.9
γ
=
0.9
另外一种更新方式如下(需要见证下,来自安德鲁的课程):
[ bias correct ]
假设一个时间变量 vt v t ,如果
得到 vt v t 的期望值是 ▽tw ▽ w t 的期望的指数衰减值。
1.3) NAG
NAG:Nesterov accelerated gradient [A method for unconstrained convex minimization problem with the rate of convergence o(1/k2)]
基本想法是,提前预知下一步的位置是上坡,则减小步幅,提前预支下一步的位置是下坡,则增大步幅。
1.4) RMSprop
RMSprop GD :root mean square
是Hitton提出的,基本思路是Bias-correct,不过是利用
E[v]
E
[
v
]
与
▽2w
▽
w
2
的正相关关系,找到梯度的期望来指导当前的参数更新。
假设
vt=γvt−1+(1−γ)▽2w
v
t
=
γ
v
t
−
1
+
(
1
−
γ
)
▽
w
2
则
→E[v]=E[▽2w](1−γ)+ϵ
→
E
[
v
]
=
E
[
▽
w
2
]
(
1
−
γ
)
+
ϵ
1.5) Adam
Adam GD:adaptive moment estimation [2015-Adam, A Method for Stochastic Optimization]
结合了moment和RMSP的两者优点,如下:
并且在online-learning时,Adam也是收敛的。
1.6) AdaGrad
AdaGrad Descent [ Adaptive Subgradient Methods for Online Learning
and Stochastic Optimization]
基本思路: 自适应学习率,能够对频繁更新的参数采取更小的步幅;对更新不频繁的参数采取更大的步幅。非常适合稀疏数据的学习。其中
Gi
G
i
表示到update当时为止,所有已计算的梯度的平方和。
1.7) AdaDelt
AdaDelt GD [ An Adaptive Learning Rate Method]
AdaGrad存在问题:平方和的累和会一直增加下去,导致分母部分无限大,梯度被削弱至非常小,参数不再更新。而AdaDelt则刚好为解决这问题而诞生,借助指数衰减平均
E[▽2w]t=γE[▽2w]t−1+(1−γ)▽2wt
E
[
▽
w
2
]
t
=
γ
E
[
▽
w
2
]
t
−
1
+
(
1
−
γ
)
▽
w
t
2
的思路来避免所有历史梯度^2的平均加和。
首先参数的增量值
△xt,i
△
x
t
,
i
用梯度的期望来表示为:
△xt,i=−ηE[▽2wi]t+ϵ√▽wt,i
△
x
t
,
i
=
−
η
E
[
▽
w
i
2
]
t
+
ϵ
▽
w
t
,
i
然后增量值的期望值也用指数衰减平均表示
E[△2x]t=γE[△2x]t−1+(1−γ)△2xt
E
[
△
x
2
]
t
=
γ
E
[
△
x
2
]
t
−
1
+
(
1
−
γ
)
△
x
t
2
用梯度的期望,增量值的期望估计(当次的不知道,用前一次的来估计),以及当前梯度来指导学习的方向。
作者在原文里解释,是用一阶导数去估计二阶导数Hassion矩阵。
补充阅读
AdaMax
Nadam:Nesterov Momentum into Adam
DFP
DFBS
AdamW
估计函数的二阶导数,其实好多方法都是对二阶导数的估计得来的,比如DFP/DFBS/AdaDelt。
2)二阶梯度依赖的优化方法
各种适应性,在有道云笔记上有部分内容。
牛顿下降法
求解
argminxf(x)
a
r
g
m
i
n
x
f
(
x
)
,等价于找到
f′(x)=0
f
′
(
x
)
=
0
对应的
x∗
x
∗
值。
要想找到函数的零值点,可以根据其泰勒展开
f(x)=f(xk)+(x−xk)f′(xk)
f
(
x
)
=
f
(
x
k
)
+
(
x
−
x
k
)
f
′
(
x
k
)
作近似逼近,另f=0,得到
xk+1=xk−f(xk)f′(xk)
x
k
+
1
=
x
k
−
f
(
x
k
)
f
′
(
x
k
)
,由于导数是描述增幅的,那么对应的
xk+1
x
k
+
1
就相应的比
xk
x
k
要更靠近零值点,如下图。

那么回到等价问题上,找到函数 f′(x) f ′ ( x ) 的零值点,我们对 f′(x) f ′ ( x ) 在某处 xk x k 做一阶展开 f′(x)=f′(xk)+(x−xk)f′′(xk) f ′ ( x ) = f ′ ( x k ) + ( x − x k ) f ″ ( x k ) ,于是得到迭代关系 xk+1=xk−f′(xk)f′′(xk) x k + 1 = x k − f ′ ( x k ) f ″ ( x k ) 可以不断逼近 f′(x) f ′ ( x ) 的零值点。
3)不依赖梯度的优化方法
3.1)Gradient Boost
Gradient Boost的梯度方向是由最终label与当前的预测label之间的差距给出的,详细见GB
3.2)Constractive Divergence
对比散度类方法,主要是根据条件随机场的收敛性,可以根据下次采样比当前状态更靠近稳定最优解,来给出优化方向,详细见RBM。
梯度相关的trick
1) ReLU等激活函数的各种类型。
2) Gradient Clip,常用在RNN类方法中。
3) Batch Normalize,对所有网络都使用。(Group Normalization, Switchable Normalization等改进的方法)
4) 正则化方法及各种变形改进。(DIN里面有个根据数据对梯度作约束的正则,非常有意思)
未完待续
后续会补充能查到的资料,并且会讲解如何在TF里面实现自定义的Gradient Optimize Operation。