1.局部极小值与鞍点
1.1局部极小值(local minimum)
局部极小值(local minimum)是指在参数空间中存在的一种情况,其中某个点的损失函数值比其周围任何其他点的损失函数值都要低,但这个点并不是全局最小值。换句话说,局部极小值是在某个特定的区域内,损失函数达到了一个局部最小值,但在整个参数空间中可能存在更低的全局最小值。
在深度学习的优化过程中,如果优化算法停留在局部极小值附近,而不是找到全局最小值,那么模型的性能可能会受到影响,导致训练结果不理想。为了克服这个挑战,研究人员和工程师们开发了各种优化算法和技术,如随机初始化、自适应学习率调整、参数初始化策略、正则化技术等,来帮助优化算法更好地逃离局部极小值并达到全局最优解。
1.2鞍点(saddle point)
鞍点(saddle point)
鞍点是指函数在某一点处既不是极大值也不是极小值的情况。在深度学习中,鞍点通常指的是损失函数在某一点处的局部极小值,但不同于传统的局部极小值,鞍点附近的Hessian矩阵是不定的(即其行列式小于0,有正有负的特征值)。鞍点其实就是梯度是零且区别于局部极小值和局部极大值(localmaximum)的点
鞍点问题对深度学习模型的训练构成了显著挑战。首先,由于鞍点的存在,模型可能会陷入局部极小值,并难以跳出,导致模型收敛速度变慢,训练时间延长。其次,当模型陷入鞍点时,梯度下降算法可能会出现震荡或停滞现象,导致模型无法继续优化。此外,鞍点问题还可能导致模型学习到错误的特征表示,进而影响模型的性能。
为了应对鞍点问题,可以采取多种策略。例如,通过合适的参数初始化策略来降低模型陷入鞍点的概率;使用自适应学习率算法(如Adam、Adagrad)来自动调整学习率,帮助模型跳出鞍点;以及采用SGD的变种算法(如Momentum、Nesterov Momentum)来提高模型在鞍点附近的学习速度。
1.3判断临界值种类的方法
在深度学习中,判断临界值(即梯度为零的点,也称为临界点(critical point))的种类,主要涉及到局部极小值、局部极大值和鞍点的区分。这些临界点的区分通常基于损失函数在临界点附近的性质,特别是通过泰勒级数近似和Hessian矩阵的特征值来进行判断。
泰勒级数近似
在临界点θ'附近,损失函数L(θ)可以通过泰勒级数近似表示为:
由于临界点的梯度为0,即g=0,上式可以进一步简化为:
Hessian矩阵的特征值
接下来,我们需要考虑Hessian矩阵H的特征值。Hessian矩阵是一个二阶导数矩阵,它描述了损失函数在临界点附近的曲率。我们可以根据 1/2(θ − θ′)^T* H(θ − θ)′来判断在 θ′ 附近的误差表面(error surface)到底长什么样子。
- 局部极小值:当Hessian矩阵H的所有特征值都为正时,即H是正定矩阵,那么θ'是局部极小值点。这是因为此时损失函数在θ'的所有方向上都是凸的,所以θ'是周围领域中对应L(θ)值最小的点。
- 局部极大值:当Hessian矩阵H的所有特征值都为负时,即H是负定矩阵,那么θ'是局部极大值点。
- 鞍点:当Hessian矩阵H的特征值有正有负时,θ'是鞍点。这意味着在某些方向上,损失函数是凸的(对应正特征值),而在其他方向上则是凹的(对应负特征值)。
2.批量和动量
用简单的话来说,批量(Batch)在深度学习中就是指一次性处理的数据集合的大小。当我们训练一个深度学习模型时,不会一次性把所有数据都喂给模型,因为这样做可能会非常慢且消耗大量资源。相反,我们会将数据分成多个小部分,每个小部分就是一个批量。
例如,假设我们有一个包含1000张图片的数据集,用于训练一个图像识别模型。我们可以选择每次处理64张图片作为一个批量,那么整个数据集就会被分成16个批量(因为1000除以64等于15余40,但通常我们会选择最接近的、能被批量大小整除的批次数,或者对剩余的数据进行特殊处理)。
在训练过程中,模型会依次处理这些批量,每次处理完一个批量后,都会根据这个批量的数据来更新模型的参数,以期望模型能够更好地适应数据。这个过程会重复进行,直到所有的批量都被处理过,这被称为一个训练周期(Epoch)。在把数据分为批量的时候,还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。
2.1批量大小对梯度下降法的影响
假设我们有1000张图片数据,用两种极端的形式来划分批量。
第一种以1000为大小的批量,需要一次把1000个数据全部处理完才能计算损失、更新一次参数,这种使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD);
第二种,将1000张图片分为1000个批量,每个批量大小为1,每处理一个数据就能计算损失、更新一次参数,一回合更新1000次,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。
由于cpu的并行运算能力,批量梯度下降花费的时间不一定更长;对于比较大的批量,计算损失和梯度花费的时间不一定比使用小批量的计算时间长 。
以MNIST为例批量大小与运行时间的关系图大致如下:
虽然适当的增大批量大小可以节省时间并且消除噪声,但是较大的批量大小和低噪声往往会降低模型预测的准确率,如以MNIST和CIFAR-10为例进行不同批量大小实验得到以下结果:
我们可以看到用大的批量大小低噪声来训练得到的准确率反而降低了。
总结下来,小的批量也对测试有帮助,原因可能是小的批量大小能有更大的可能性找到真正的局部最小值,从而减小损失增加准确率。
2.2动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。它的基本思想是在梯度下降的基础上,加入了一个“惯性”因素。打个比方就是:一个物体在运动时,由于惯性的作用,它会保持原来的运动方向并继续前行,除非受到外力的强烈作用才会改变方向。在深度学习中,这个“惯性”因素就是动量,它使得模型在更新参数时,不仅考虑当前梯度的方向,还考虑之前梯度的累积效果。在物理学的角度打比方就如下图
具体来说,动量法在每次迭代时,会将当前迭代的梯度与之前的梯度进行相加,得到一个“平均梯度”。然后,算法会沿着这个平均梯度的方向来更新模型参数。当梯度在同一方向变化时,平均梯度会变得更大,从而加速参数的更新;而当梯度在相反的方向变化时,平均梯度会变小,从而在一定程度上抑制了参数的更新,避免了模型在训练过程中的震荡,并有助于模型跳出局部最小值,找到全局最优值。