梯度下降法
梯度下降法(gradient descent)是一种常用的一阶(first-order)优化方法,是求解无约束优化问题最简单、最经典的方法之一。
步骤如下:
1.求解每个待优化参数对目标函数的梯度。
∂ ∂ θ i J ( θ 0 , θ 1 … , θ n ) \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1} \ldots, \theta_{n}\right) ∂θi∂J(θ0,θ1…,θn)
2.利用学习率与梯度更新参数。
θ i = θ i − α ∂ ∂ θ i J ( θ 0 , θ 1 … , θ n ) \theta_{i}=\theta_{i}-\alpha \frac{\partial}{\partial \theta_{i}} J\left(\theta_{0}, \theta_{1} \ldots, \theta_{n}\right) θi=θi−α∂θi∂J(θ0,θ1…,θn)
3.反复迭代1,2中的步骤,直至终止条件。
batch的选择
全量梯度下降法(Batch gradient descent)
全量梯度下降法每次学习都使用整个训练集,因此每次更新都会朝着正确的方向进行,最后能够保证收敛于极值点,凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点,缺陷就是学习时间太长,消耗大量内存。
随机梯度下降法(Stochastic Gradient Descent)
SGD一轮迭代只用一条随机选取的数据,尽管SGD的迭代次数比BGD大很多,但一次学习时间非常快。
SGD的缺点在于每次更新可能并不会按照正确的方向进行,参数更新具有高方差,从而导致损失函数剧烈波动。不过,如果目标函数有盆地区域,SGD会使优化的方向从当前的局部极小值点跳到另一个更好的局部极小值点,这样对于非凸函数,可能最终收敛于一个较好的局部极值点,甚至全局极值点。
小批量梯度下降法(Mini-Batch Gradient Descent)
SGD相比BGD收敛速度快,然而,它也的缺点,那就是收敛时浮动,不稳定,在最优解附近波动,难以判断是否已经收敛。这时折中的算法就是小批量梯度下降法。
如果Batch Size选择合理,不仅收敛速度比SGD更快、更稳定,而且在最优解附近的跳动也不会很大,甚至得到比Batch Gradient Descent 更好的解。这样就综合了SGD和Batch Gradient Descent 的优点,同时弱化了缺点。
动量梯度下降法(Gradient descent with Momentum)
由于梯度下降法本身是一个震荡逼近最小值的过程,为了减少不必要的震荡(如图中纵轴的震荡),加快学习效率(如图中水平方向的摆动),因此产生了动量梯度下降法:
当本次梯度下降方向与上次更新量的方向相同时,上次的更新量能够对本次的搜索起到一个正向加速的作用。
当本次梯度下降方向与上次更新量的方向相反时,上次的更新量能够对本次的搜索起到一个减速的作用。
数学表达式如下:
v d W = β v d W + ( 1 − β ) d W v d b = β v d b + ( 1 − β ) d b W = W − α v d W , b = b − α v d b \begin{array}{l} v_{d W}=\beta v_{d W}+(1-\beta) d W \\ v_{d b}=\beta v_{d b}+(1-\beta) d b \\ W=W-\alpha v_{d W}, b=b-\alpha v_{d b} \end{array} vdW=βvdW+(1−β)dWvdb=βvdb+(1−β)dbW=W−αv