一、临界点和鞍点
在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意或者有时模型一开始就训练不起来,不管我们怎么更新参数,损失都降不下去。
过去常见的一个猜想是我们优化到某个地方,这个地方参数对损失的微分为零。图中的两条曲线对应两个神经网络训练的过程。当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
1.临界点及其种类
梯度为零的点统称为临界点(critical point),有局部极小值(local minimum)和鞍点(saddle point)。
2.判断临界点的种类
2.1某点损失函数的近似表示
如果给定某一组参数,比如 θ′,在 θ′ 附近的损失函数是有办法写出来的——虽然 L(θ) 完整的样子写不出来。θ′ 附近的 L(θ) 可用泰勒级数近似为
第一项表示当 θ 跟 θ′ 很近的时候,L(θ) 应该跟 L(θ′) 还蛮靠近的。
第二项 (θ − θ′)Tg 中,g 代表梯度,它是一个向量,可以弥补 L(θ′) 跟 L(θ) 之间的差距。有时候梯度 g 会写成 ∇L(θ′)。gi 是向量 g 的第 i 个元素,就是 L 关于 θ 的第 i 个元素的微分即。
第三项跟海森矩阵(Hessian matrix)H 有关。H 里面放的是 L 的二次微分,它第 i 行,第 j 列的值Hij 就是把 θ 的第 i 个元素对 (Lθ′)作微分,再把 θ 的第 j 个元素对 ∂L(θ′)/∂θi 作微分后的结果即。
2.2鞍点的判断
在临界点,梯度 g 为零,因此 (θ − θ′)Tg 为零。我们可以根据 1/2(θ − θ′)T H(θ − θ′)来判断在 θ′ 附近的误差表面(error surface)。
- 如果这一项大于零,则只要 θ 在 θ′ 附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
- 如果这一项小于零,则只要 θ 在 θ′ 附近,L(θ) 都小于 L(θ′). 这代表 L(θ′) 是附近的一个最高点,所以它是局部极大值。
- 如果这一项有时候大于零,有时候小于零。这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
只需看H的特征值即可判断该项正负
若 H 的所有特征值都是正的,H 为正定矩阵,则 该项 大于 0,临界点是局部极小值。若 H 的所有特征值都是负的,H 为负定矩阵,则 该项 小于0,临界点是局部极大值。若 H 的特征值有正有负,临界点是鞍点。
2.3鞍点的移动方向
可以使用海森矩阵H负特征值对应的特征向量来判断鞍点的移动方向,但是计算量太大,我们一般不使用这个方法
3.鞍点和局部极小值出现的频率
实际上,因为神经网络训练时参数很多,导致维度很高,有很多条路可以走,我们几乎找不到所有特征值都为正的临界点,即鞍点出现的概率要远大于极小值点,因此不必害怕鞍点。
最小值比例 =正特征值数量/总特征值数量.
二、批量和动量
1.批量
实际上在计算梯度的时候,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分成一个一个的批量(batch),如图所示。
每个批量的大小是 B ,即带有 B 笔数据。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。事实上,在把数据分为批量的时候,我们还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。
- 批量梯度下降法(Batch Gradient Descent,BGD):此时模型必须把所有训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
- 随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。只要取出批量大小的数据即可计算损失、更新一次参数。
批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降更容易逃离局部最小值。
实际上,考虑并行运算,批量梯度下降花费的时间不一定更长。因为有并行计算的能力,因此实际上当批量大小小的时候,要“跑”完一个回合,花的时间是比大的。。因此在有考虑并行计算的时候,大的批量大小反而是较有效率的,一个回合大的批量花的时间反而是比较少的。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有噪声的的梯度反而可以帮助训练,如果拿不同的批量来训练模型来做图像识别问题,批量大小越大,验证集准确率越差。但这不是过拟合,因为批量大小越大,训练准确率也是越低。因为用的是同一个模型,所以这不是模型偏见的问题。 但大的批量大小往往在训练的时候,结果比较差。这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
一个可能的解释如图所示,大批量会卡住,小批量因为不同批量的损失不同,不一定会卡住。
其实小的批量也对测试有帮助,在训练的时候结果差不多,测试的时候,大的批量比小的批量差,代表过拟合。一个解释如下图所示,平坦的最小值要由于尖锐的最小值,而小批量更容易跳出尖锐的最小值。
2.动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。参考了物理中的惯性。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。
每一步的移动都用 m 来表示。m 其实可以写成之前所有计算的梯度的加权和,如
m0 = 0
m1 = −ηg0
m2 = −ληg0 − ηg1
其中 η 是学习率,λ 是前一个方向的权重参数,也是需要调的。
下图为动量的好处,可能越过小山丘。