在神经网络的训练中,其本质就是找到合适的参数,使得loss function最小。然而这个最小值实在是太难求了,因为参数太多了。为了解决这个问题,目前有几种常见的最优化方法。
这是最最最经典的一个算法,也是比较常用的方法。相比于随机搜素,这个方法已经非常优秀了,但是仍然存在着一些不足。
由于梯度的性质,决定了其很难在部分地方能够改进,但是对于步长这个超参也可以有优化。
一种比较普遍的方法就是步长衰减,最开始的步长比较大,因为这个时候一般与最优解还相差比较远,可以多走些,以提高训练速度。随着训练的继续,步长不断衰减,因为此时已经更加接近最优解了,如果步长太大可能错过最优解或者无法收敛。
衰减参数一般与已经训练过的梯度有关
h
←
h
+
∂
L
∂
W
⋅
∂
L
∂
W
W
←
W
−
η
1
h
⋅
∂
L
∂
W
h\leftarrow h + \frac{\partial L}{\partial W}\cdot\frac{\partial L}{\partial W} \newline W\leftarrow W - \eta\frac{1}{\sqrt{h}}\cdot\frac{\partial L}{\partial W}
h←h+∂W∂L⋅∂W∂LW←W−ηh1⋅∂W∂L
这个单词的解释是动量,根据物理中的定义
F
⋅
t
=
m
⋅
v
F\cdot t = m\cdot v
F⋅t=m⋅v。
为了更加生动地理解这种方法,不妨考虑一个三维空间中的一个曲面,上面有一个球,需要滚到最低点。
为了方便计算,部分把球的质量视作单位1,则对该式子求时间的导数:
d
F
d
t
⋅
d
t
=
m
⋅
d
v
d
t
⇒
d
F
=
m
⋅
d
v
d
t
\frac{dF}{dt}\cdot dt=m\cdot\frac{dv}{dt} \Rightarrow dF=m\cdot\frac{dv}{dt}
dtdF⋅dt=m⋅dtdv⇒dF=m⋅dtdv。
考虑这个小球受到的“力”:当前位置倾斜所带来的重力的分力(梯度),阻碍运动的摩擦力(在无梯度时候速度会衰减)。
那么就可以很轻松地写出小球下一时刻的速度与位置了:
v
←
α
⋅
v
−
∂
F
∂
W
w
←
w
+
v
v\leftarrow\alpha\cdot v - \frac{\partial F}{\partial W} \newline w\leftarrow w + v
v←α⋅v−∂W∂Fw←w+v
这种方法能够很好接近梯度不指向最优解的问题,即便是一个梯度不指向最优解,但是只有它存在的向最优解的速度,那么它就可以继续向最优解靠近。