1.局部极小值与鞍点
1.1 临界点及其种类
神经网络训练时,不管怎么更新参数,损失都有可能降不下来。
这个情况发生在对参数的微分为0,梯度下降法就没有办法更新参数,损失就不会下降。
提到梯度为0,我们最先想到的可能是局部极小值:
局部极小值是指损失函数在参数空间中的一个局部区域内最小的点,即梯度为零且二阶导数正定的位置。而局部极大值是指损失函数在参数空间中的一个局部区域内最大的点,即梯度为零且二阶导数负定的位置。
但其实损失不是只在局部极小值的梯度是零,还有其他可能会让梯度是零的点,比如鞍点。鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点。
如上图所示,红色的点在 y 轴方向是比较高的,在 x 轴方向是比较低的,这就是一个鞍点。鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。
临界点:梯度为零的点。
局部极小值与鞍点的区别:局部极小值的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。
1.2 判断临界值种类的方法
判断一个点是局部极小值还是鞍点需要分析损失函数的海森矩阵(二阶导数矩阵)的特征值。若海森矩阵的所有特征值都为正,则该点为局部极小值;若有正有负,则为鞍点。
形象一点的说法就是可以通过海森矩阵得到这个函数图像的地貌,显而易见下面两种点虽然在各个维度上梯度都为0,但地貌明显不一样。鞍点很明显在两个正交的方向上,一个向上U,一个向下U。而极值点的四周,U均朝上或朝下。
分析海森矩阵可以找到负特征值对应的特征向量,沿着这个方向更新参数可以逃离鞍点。但计算量较大,几乎不使用。
实际上,对于深层次的神经网络,几乎不存在完全的局部极小值点,由于参数量非常大(训练的维度多),可能有几个维度到达它的极小值,但其他维度未达到,仍然可以获得有效梯度并继续降低损失。如果真的训练缓慢时,往往只是遇到了鞍点。所以逃离鞍点就是接下来的优化手段。
1.3 逃离鞍点的方法
如下图所示,一维空间中的误差表面有一个局部极小值。但是在二维空间这个点就可能只是一个鞍点。
参数的数量代表了误差表面的维度。
如上图所示,是训练某不同神经网络的结果,每个点对应一个神经网络。纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失。我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。图中,横轴代表最小值比例,最小值比例定义为
2.批量和动量
实际计算梯度,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分成一个一个的批量(batch),如下图所示。
每个批量的大小是 B ,即带有 B 笔数据。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。【大语言模型微调,一般只需要一个epoch】
事实上,在把数据分为批量的时候,我们还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。
使用全批量的数据来更新参数的方法叫做批量梯度下降法(BGD),在下降的梯度上引入随机噪声,叫做随机梯度下降法(SGD)。
相对而言,大的批量更新比较稳定,小的批量梯度方向存在一定的噪声,有噪声的梯度反而可以帮助训练。
2.1 批量大小对梯度下降法的影响
2.2 动量法
如果一个球从高处滚下来,由于惯性它会继续往前走,如果动量足够大,甚至可以翻越小坡继续走。这就是动量。简单些理解,在高处下落的球在滑落到局部最低的坡之后会继续往高处越,假如当前的高处有一个小坡,球还是可以越过这个小坡到达下一个最低点。