我们知道,在有关深度学习的问题中,我们会定义损失函数(Loss Function)来衡量模型的表现程度,训练网络的目标就是找出使损失函数值最小化的参数,那如何使损失函数值达到最小化呢?通常我们使用优化算法来尝试最小化损失,所以损失函数被称为优化问题的目标函数(从优化的角度讲)。大部分优化算法关注的是最小化问题,如果我们需要最大化目标,只需要在目标函数前加上负号即可。
在这里尤其需要注意区分深度学习和优化二者之间的目标差异性,尽管优化为我们提供了一种最大限度地减少深度学习损失函数值的方法,但从本质上看:优化仅仅关注的是最小化目标(损失函数值),而深度学习关注的是在一定数据量下寻找符合问题的模型架构。(由于优化算法的目标函数通常是基于训练数据集的损失函数,因此可以理解为优化的目标是减少训练误差,而深度学习的目标是减少包括未知数据集在内的泛化误差。)
在优化的过程中我们通常会遇到一些常见的问题,比如非凸、局部最小值、鞍点、梯度消失等,针对不同类型的问题有对应的优化算法来进行优化。从优化过程中梯度的角度来看,目前流行的优化方法主要分为三类:以广泛使用的随机梯度方法为代表的一阶优化方法(First-Order Methods)、以牛顿法为典型代表的高阶优化方法(High-Order Methods)以及以坐标下降法为代表的启发式无导数优化方法(Derivative-Free Methods)。

局部最小值

鞍点

梯度消失
因为关于优化方法的内容纷繁多样,我们在这里主要介绍以广泛使用的随机梯度方法为代表的一阶优化方法,其它两类方法大家感兴趣的话可自行学习。
在深度学习的神经网络中,除了网络的结构图外,我们最熟悉的莫过于反向传播过程了,梯度下降(Gradient Descent)便是建立在反向传播的基础之上的。尽管现在的深度学习很少直接使用梯度下降来进行优化,但它是诸多其它常用方法的先验知识,所以我们有必要先来了解一下梯度下降及其几种简单的变体。
又名Vanilla Gradient Descent,它是最早和最常见的优化方法,其思想是参数在目标函数梯度的(相反)方向上迭代更新直至收敛到目标函数的最优值。批量梯度下降(BGD)通过计算整个训练集参数$θ$的梯度来进行参数更新,公式中的$\eta$代表学习率(Learning Rate),它决定了每次迭代的步长,进而影响达到最优值的迭代次数;$\nabla_\theta J(\theta)$代表所有训练数据的梯度,每次更新参数时都会使用整个训练集进行计算,所以我们称之为批量梯度下降。
$$ \theta^{'} = \theta - \eta \cdot \nabla_\theta J(\theta) $$
最陡下降算法(Steepest Descent Algorithm)也是一种广为人知的算法,它的思想是在每次迭代中选择合适的搜索方向来使目标函数的值以最快的速度最小化,但我们需要将它和批量梯度下降区分开来,因为负梯度的方向并不总是下降的最快。
对于**凸性问题(Convexity)$^{1}$我们可以保证批量梯度下降方法能够收敛至全局最小值,对于非凸问题则收敛至局部最小值,但是由于我们需要计算整个数据集的梯度才能执行一次参数更新,当数据集比较大时(情况往往是这样),批量梯度下降方法的更新速度会变得十分缓慢,并且它也不允许我们在线更新(Online Update)$^{2}$**参数。
1:凸函数具有“局部最小值即是全局最小值”这个性质。
2:在线更新指的是每次使用一个样本或小批量样本(mini-batch)来计算梯度并立即更新模型参数,而不是等所有样本的梯度都计算完之后才进行更新。
由于批量梯度下降在大规模数据的每次迭代中具有很高的计算复杂度并且不支持在线更新,于是随机梯度下降(SGD)应运而生。 公式中的$x^{(i)}$和$y^{(i)}$表示第$i$个样本的数据$x^{(i)}$和标签$y^{(i)}$,损失函数$J(\theta; x^{(i)}; y^{(i)})$是针对单个样本$(x^{(i)}, y^{(i)})$来进行计算的,这意味着$\nabla_\theta J(\theta; x^{(i)}; y^{(i)})$表示损失函数在单个样本上的梯度。
$$ \theta^{'} = \theta - \eta \cdot \nabla_\theta J(\theta; x^{(i)}; y^{(i)}) $$