Datawhale X 李宏毅苹果书 AI夏令营深度学习进阶Datawhile_task1.1局部极小值与鞍点task1.2_批量与动量

Datawhile

一、局部极小值与鞍点

1、临界点及其种类

用随机梯度下降法来优化参数,随着参数不断更新,经常会出现训练的损失不会再下降的情况,这时的损失仍然不是我们想要的损失。那么问题出在哪呢?

因为我们是用随机梯度下降法来优化参数,一个常见的猜想就是当我们的参数更新到某处时,在此处损失L对参数的偏导为0,梯度下降法就不能更新参数了,训练停止,损失也就不再下降。

梯度为0的地方我们第一个想到的可能就是局部极小值,但除了局部极小值外梯度还会在鞍点处为0.如图3.2,鞍点因形似马鞍而得名,鞍点在某一个方向上是极小值,但在另一个方向缺是极大值,因此损失还可以下降。

对梯度为0的点我们统称为临界点。

因此损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。

如果一个点的梯度真的很接近零,我们走到临界点的时候,这个临界点到底是局部极小值还是鞍点,是一个值得去探讨的问题。因为如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。

2、判断临界值种类的方法

判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。可是怎么知道损失函数的形状?网络本身很复杂,用复杂网络算出来的损失函数显然也很复杂。虽然无法完整知道整个损失函数的样子,但是如果给定某一组参数,比如\theta',在\theta'附近的损失函数是有办法写出来的——虽然L(\theta)完整的样子写不出来。\theta'附近L(\theta)可近似为

$$
L(\theta)\approx L(\theta')+(\theta-\theta')^Tg+\frac{1}{2}(\theta-\theta')^TH(\theta-\theta') \tag{1}
$$

式(1)为二阶泰勒近似,g代表梯度向量,也即\nabla L(\theta'),g_i 是向量g的第i个元素,就是L关于\theta的第i个元素的微分,即

$$
g_i=\frac{\partial L(\theta')}{\partial \theta_i} \tag{2}
$$

第三项跟海森矩阵有关.H里面放的是L的二次微分,它第i行,第j列的值H_{ij}就是把\theta的第i个元素对L(\theta')做微分,再把\theta的第j个元素对\frac{\partial L(\theta')}{\partial \theta_i}作微分后的结果

$$
H_{ij}=\frac{\partial^2 L(\theta')}{\partial \theta_i \partial \theta_j} \tag{3}
$$

在临界点,梯度g为0,因此(\theta-\theta')^Tg为0,所以在临界点的附近,损失函数可被近似为

$$
L(\theta)\approx L(\theta')+\frac{1}{2}(\theta-\theta')^TH(\theta-\theta') \tag{4}
$$

因此我们可以根据\frac{1}{2}(\theta-\theta')^TH(\theta-\theta')来判断L(\theta')是局部极大值、局部极小值还是鞍点,令v=\theta-\theta',有如下三种情况:

(1)如果对所有v,v^THv>0,这意味着对任意\theta,L(\theta)>L(\theta').只要\theta在\theta'附近,L(\theta)都大于L(\theta'),这代表L(\theta')是附近的一个最低点,即为局部极小值

(2)如果对所有v,v^THv<0,这意味着对任意\theta,L(\theta)<L(\theta').只要\theta在\theta'附近,L(\theta)都小于L(\theta'),这代表L(\theta')是附近的一个最高点,即为局部极大值

(3)如果对所有v,有时v^THv>0,有时v^THv<0,这意味着在\theta'附近,有时候L(\theta)>L(\theta'),有时候L(\theta)<L(\theta')这代表L(\theta')是鞍点。

如何判断\frac{1}{2}(\theta-\theta')^TH(\theta-\theta')的正负性呢?线性代数告诉我们:算出一个海森矩阵后,不需要把它跟所有的v都乘乘看,只要看H的特征值。若H的所有特征值都是正的,H为正定矩阵,则v^THv>0,临界点是局部极小值。若H的所有特征值都是负的,H为负定矩阵,则v^THv<0,临界点是局部极大值。若H的特征值有正有负,临界点是鞍点。

如果n阶对称矩阵A对于任意非零的n维向量x都有x^TAx>0,则称矩阵A为正定矩阵。如果n阶对称矩阵A,对于任意非零的n维向量x都有x^TAx<0,则称矩阵A为负定矩阵。

H不只可以帮助我们判断是不是在一个鞍点,还指出了参数可以更新的方向。之前我们参数更新的时候,都是看梯度g,但是我们走到某个地方以后发现g变成0了,就不能再看g,g不见了。但如果临界点是一个鞍点,还可以再看H,H怎么告诉我们怎么更新参数呢?

设\lambda为H的一个特征值,u为其对应的特征向量。对于我们的优化问题,可令u=\theta-\theta',则

$$
u^THu=u^H(\lambda u)=\lambda ||u||^2 \tag{5}
$$

若\lambda<0,则\lambda ||u||^2<0,所以\frac{1}{2}(\theta-\theta')^TH(\theta-\theta')<0.此时,L(\theta)<L(\theta'),且

$$
\theta=\theta'+u \tag{6}
$$

沿着u的方向更新\theta,损失就会变小。因为根据式 (5) 和式 (6),只\theta=\theta'+u,沿着特征向量u的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零,如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与\theta'相加,就可以找到一个损失更低的点。

从这个角度来看,鞍点似乎并没有那么可怕。但实际上,我们几乎不会真的把海森矩阵算出来,因为海森矩阵需要算二次微分,计算这个矩阵的运算量非常大,还要把它的特征值跟特征向量找出来,所以几乎没有人用这个方法来逃离鞍点。还有一些其他逃离鞍点的方法的运算量都比要算海森矩阵小很多。

3、逃离鞍点的方法

如图 3.5(a) 所示的一维空间中的误差表面,有一个局部极小值。但是在二维空间(如图3.5(b)所示),这个点就可能只是一个鞍点。常常会有人画类似图 3.5(c) 这样的图来告诉我们深度学习的训练是非常复杂的。如果我们移动某两个参数,误差表面的变化非常的复杂,有非常多局部极小值。低维度空间中的局部极小值点,在更高维的空间中,实际是鞍点。同样地,如果在二维的空间中没有路可以走,会不会在更高维的空间中,其实有路可以走?更高的维度难以视化它,但我们在训练一个网络的时候,参数数量动辄达百万千万级,所以误差表面其实有非常高的维度—— 参数的数量代表了误差表面的维度。既然维度这么高,会不会其实就有非常多的路可以走呢?既然有非常多的路可以走,会不会其实局部极小值就很少呢?而经验上,我们如果自己做一些实验,会发现实际情况也支持这个假说。图 3.6 是训练某不同神经网络的结果,每个点对应一个神经网络。纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失。我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。图 3.6 中,横轴代表最小值比例(minimum ratio),最小值比例定义为

$$
最小值比例 =\frac{正特征值数量}{总特征值数量} \tag{7}
$$

实际上,我们几乎找不到所有特征值都为正的临界点。在图 3.6 所示的例子中,最小值比例最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。虽然在这个图上,越靠近右侧代表临界点“看起来越像”局部极小值,但是这些点都不是真正的局部极小值。所以从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。

二、批量与动量

实际上在计算梯度的时候,并不是对所有数据的损失L计算梯度,而是把所有的数据分成一个一个的批量(batch),如图 3.7 所示。每个批量的大小是B,即带有B笔数据。每次在更新参数的时候,会去取出B笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。事实上,在把数据分为批量的时候,我们还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。

1.批量大小对梯度下降法的影响

大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。大的批量跟小的批量的对比结果如表 3.1 所示。在有并行计算的情况下,小的批量跟大的批量运算的时间并没有太大的差距。除非大的批量非常大,才会显示出差距。但是一个回合需要的时间,小的批量比较长,大的批量反而是比较快的,所以从一个回合需要的时间来看,大的批量是较有优势的。 而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。

2.动量法

动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。如图 3.14所示,假设误差表面就是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。 但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。 因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。

引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。 图 3.16 中红色虚线方向是梯度的反方向,蓝色虚线方向是前一次更新的方向,蓝色实线的方向是下一步要移动的方向。把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。如图 3.16 所示,初始的参数值为\theta_0 = 0,前一步的参数的更新量为m_0 = 0。接下来在\theta_0的地方,计算梯度的方向g_0。下一步的方向是梯度的方向加上前一步的方向,不过因为前一步正好是 0,所以更新的方向跟原来的梯度下降是相同的。但从第二步开始就不太一样了。从第二步开始,计算g_1,接下来更新的方向为m_2=\lambda m_1-\eta g_1,参数更新为 \theta_2,接下来就反复进行同样的过程。

每一步的移动都用m来表示.m其实可以写成之前所有计算的梯度的加权和。引入动量后,可以从两个角度来理解动量法。一个角度是动量是梯度的负反方向加上前一次移动的方向。另外一个 角度是当加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。

动量的简单例子如图 3.17 所示。红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值