系列文章目录
3. 深度学习基础
需要理解深度学习中优化神经网络会涉及的概念。
3.1 局部极小值与鞍点
- 往往在做优化时会发现
- 随着参数不断更新,训练的损失不会再下降,但是这个损失并不让人满意;把 deep network、linear model 和 shallow network 作比较,可以发现深层网络的优化是有问题的并没有释放完全的潜力。
- 有时,模型从一开始就训练不起来,不管怎么更新参数,损失都降不下去。
3.1.1 临界点及其种类
梯度为零的点统称为临界点 critical point。
- 对于上面现象,过去常见的一个猜想是优化到某个地方,这个地方参数对损失的微分=0,如下图所示。
- 当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
3.1.1.1 局部最小值和鞍点
- 提到梯度为零时,最先想到的可能就是局部最小值 local minimum
- 但其实还有其他可能会让梯度是零的点,比如鞍点 saddle point,鞍点的梯度为零,但它不是局部极小值
鞍点,其实就是梯度是零且区别于局部极小值和局部极大值 local maximum 的点。
鞍点的叫法是因为其形状像马鞍。
- 损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。
3.1.1.2 如何分辨局部最小值和鞍点
- 但是如果一个点的梯度真的很接近零,当走到临界点的时候,这个临界点到底是局部极小值还是鞍点?
为什么要分辨局部极小值和鞍点
因为如果损失收敛在局部极小值,我们所在的位 置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问 题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。
3.1.2 判断临界值种类的方法
3.1.2.1 需要先知道损失函数的形状
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。
- 网络本身太复杂,用复杂网络算出来的损失函数显然也太复杂,很难完整知道整个损失函数的样子。
- 但是如果给定某一组参数,比如 θ ′ \theta' θ′ ,在 θ ′ \theta' θ′ 附近的损失函数是有办法写出来的,虽然 L ( θ ) L(\theta) L(θ) 完整的样子写不出来,但可以近似为 L ( θ ) ≈ L ( θ ′ ) + ( θ − θ ′ ) T g + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(\theta) \approx L(\theta') + (\theta - \theta')^Tg + \frac{1}{2}(\theta - \theta')^T H(\theta-\theta') L(θ)≈L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′),这个就是泰勒奇数近似
3.1.2.2 已知近似损失函数,如何理解?
式子第一项说明
- 当 θ \theta θ 跟 θ ′ \theta' θ′ 很近的时候, L ( θ ) L(\theta) L(θ) 应该跟 L ( θ ′ ) L(\theta') L(θ′) 也很靠近;
式子第二项说明
- ( θ − θ ′ ) T g (\theta - \theta')^Tg (θ−θ′)Tg 中 g g g 代表梯度,它是一个向量,可以弥补 L ( θ ′ ) L(\theta') L(θ′) 和 L ( θ ) L(\theta) L(θ) 之间的差距;
- 有时候,梯度 g g g 会写成 ∇ L ( θ ′ ) \nabla L(\theta') ∇L(θ′), g i g_i gi 是向量 g g g 的第 i i i 个元素,就是 L L L 关于 θ \theta θ 的第 i i i 个元素的微分,即 g i = ∂ L ( θ ′ ) ∂ θ i g_i = \frac{\partial L(\theta')}{\partial \theta_i} gi=∂θi∂L(θ′)
式子第三项说明
- 只观察 g g g 是没有办法完整地描述 L ( θ ) L(\theta) L(θ);
- 式子第三项跟 海森矩阵 Hessian matrix H H H 有关; H H H 里面有 L L L 的二次微分, H i j H_{ij} Hij 就是把 θ \theta θ 的第 i i i 个元素对 L ( θ ′ ) L(\theta') L(θ′) 作微分,再把 θ \theta θ 的第 j j j 个元素对 ∂ L ( θ ′ ) ∂ θ i \frac{\partial L(\theta')}{\partial \theta_i} ∂θi∂L(θ′) 作微分后的结果,即 H i j = ∂ 2 ∂ θ i ∂ θ j L ( θ ′ ) H_{ij} = \frac{\partial^2}{\partial \theta_i \partial \theta_j} L(\theta') Hij=∂θi∂θj∂2L(θ′)
小结
-
损失函数 L ( θ ) L(θ) L(θ) 在 θ ′ θ ′ θ′ 附近可近似为上式,上式跟梯度和海森矩阵有关,梯度就是一次微分,海森矩阵里面有二次微分的项。
-
在临界点,梯度 g g g 为零,因此 ( θ − θ ′ ) T g (\theta - \theta')^Tg (θ−θ′)Tg 为零。所以在临界点的附近,损失函数可被近似为 L ( θ ) ≈ L ( θ ′ ) + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(\theta) \approx L(\theta') + \frac{1}{2}(\theta - \theta')^T H(\theta-\theta') L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
-
因此,可以根据 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) \frac{1}{2}(\theta - \theta')^T H(\theta-\theta') 21(θ−θ′)TH(θ−θ′) 来判断在 θ ′ \theta' θ′ 附近的 误差表面 error surface 到底是什么样的。
-
然后就可以判断 L ( θ ) ′ L(\theta)' L(θ)′ 的种类。
3.1.2.3 判断临界点的种类
- 为了符号简洁,我们用向量 v v v 来表示 θ − θ ′ θ − θ ′ θ−θ′, ( θ − θ ′ ) T H ( θ − θ ′ ) (\theta - \theta')^T H(\theta-\theta') (θ−θ′)TH(θ−θ′) 可改写为 v T H v v^THv vTHv,有如下三种情况:
- 如果对于所有的 v v v,都有 v T H v > 0 v^THv > 0 vTHv>0 ,这意味着对任意 θ \theta θ 存在 L ( θ ) > L ( θ ) ′ L(\theta) > L(\theta)' L(θ)>L(θ)′。只要 θ \theta θ 在 θ ′ \theta' θ′ 附近, L ( θ ) L(\theta) L(θ) 都大于 L ( θ ) ′ L(\theta)' L(θ)′。这代表 L ( θ ) ′ L(\theta)' L(θ)′ 是附近的一个最低点,所以它是局部极小值;
- 如果对于所有的 v v v,都有 v T H v < 0 v^THv < 0 vTHv<0 ,跟上面同理可推,所以它是局部极大值;
- 如果对于 v v v ,有时 v T H v < 0 v^THv < 0 vTHv<0 有时 v T H v > 0 v^THv > 0 vTHv>0 。这意味着在 θ ′ \theta' θ′ 附近,有时候 L ( θ ) < L ( θ ) ′ L(\theta) < L(\theta)' L(θ)<L(θ)′ 有时候 L ( θ ) > L ( θ ) ′ L(\theta) > L(\theta)' L(θ)>L(θ)′ 。因此它是鞍点;
还有一点
- 通过 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) \frac{1}{2}(\theta - \theta')^T H(\theta-\theta') 21(θ−θ′)TH(θ−θ′) 判断临界点的种类,需要代入所有的 θ \theta θ。
- 有没有更简便的方法?
- 有,在算出一个海森矩阵后,无需把它跟所有的 v v v 都乘乘看,只要看 H H H 的特征值。
- 若 H H H 的所有特征值都是正的, H H H 为正定矩阵,则 v T H v > 0 v^THv > 0 vTHv>0,临界点是局部极小值;
- 若 H H H 的所有特征值都是负的, H H H 为负定矩阵,则 v T H v < 0 v^THv < 0 vTHv<0,临界点是局部极大值;
- 若 H H H 的所有特征值有正有负,临界点鞍点;
3.1.3 逃离鞍点的方法
3.1.3.1 鞍点和局部极小值谁更常见?
- 低维度空间中的局部极小值点,但在更高维的空间中,实际是鞍点。同样地,如果在二维空间中没有路可以走,会不会在更高维的空间中,其实有路可以走?
3.2 批量和动量
3.2.1 批量 batch 和回合epoch
- 在计算梯度的时候,实际上并不是对所有数据的损失
L
L
L 计算梯度,而是把所有的数据分成一个一个的批量 batch。
- 如下图,每个批量的大小是 B B B ,那就说明在每次更新参数的时候,会取出 B B B 个数据用来计算出损失和梯度更新参数。
- 遍历所有批量的过程成为一个回合 epoch。
3.2.1.1 如何把数据分为批量
- 需要进行随机打乱 shuffle,shuffle 有很多不同的做法:一个常见的做法是在每一个回合开始之前重新划分批量。
3.2.2 批量大小对梯度下降法的影响
- 假设现在有20笔的数据,按照两个极端情况来分析
- 上图a中,使用全批量 full batch 的数据来更新参数的方法,即批量梯度下降法 Batch Gradient Descent, BGD; 此时模型必须把 20笔数据都看完,才能够计算损失和梯度,参数才能够更新一次;
- 上图b中,批量 batch = 1,此时使用的方法是随机梯度下降法 Stochastic Gradient Descent,SGD,也叫增量梯度下降法。batch = 1 说明只要取出一笔数据即可计算损失、更新一次参数。在这里有20笔数据,就说明在每一个回合epoch里,参数会更新20次。可以看出其更新方向在图上是曲曲折折的,这时因为用一笔数据算出来的损失相对带有更多噪声;
3.2.2.1 比较一下BGD和SGD
- 每次迭代的计算量: 批量梯度下降 BGD 比随机梯度下降 SGD更大,因为要把所有的数据都看过以便,才能够更新一次参数;
- 每次更新稳定和准确性: BGD > SGD,也是因为BGD要看过所有的数据;
- 谁更容易逃离局部最小值: BGD < SGD,因为 SGD 的梯度上引入了随机噪声,因此在非凸优化问题中,更容易逃离局部最小值;
3.2.2.2 BGD 和 mini BGD
考虑批量梯度下降法和小批量梯度下降法。
小批量梯度下降:结合BGD和SGD,即在每次迭代时,都会从训练集中,随机的选择一组小批量的样本,来计算梯度,更新模型。
- 在实际训练中,因为有 GPU 做并行计算,计算损失和梯度花费的时间不一定比使用小批量的计算时间长。
- 在使用 Tesla V100 GPU 对 MNIST 数据集得到的实验结果:批量大小从1到1000,需要耗费的时间几乎是一样的;当批量大小增加到10000、甚至60000的时候,GPU计算梯度并更新参数所耗费的时间确实随着批量大小的增加而逐渐增长。但是在考虑并行计算的时候,大的批量大小反而是更有效率的,一个回合有大的批量花的时间反而是比较少的。
- 还有,大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声 noisy,但在实际训练中有噪声的梯度反而可以帮助训练。
3.2.2.3 小结
3.2.3 动量法
- 动量法 Momentum method 是另外一个可以对抗鞍点或局部最小值的方法。
3.2.3.1 形象讲解动量
- 在物理的世界中,一个球如果从高处滚下来,如果使用梯度下降,球走到局部最小值或鞍点会因为惯性继续向前走。如果球的动量最够大,甚至会翻过小坡继续走。将这个原理应用到梯度下降中,就是动量。
3.2.3.2 讲解动量更新参数的过程
- 我们由一般的梯度下降 vanilla gradient descent 引申开来,如上图所示。
- 初始参数为 θ 0 \theta_0 θ0;
- 计算梯度
- 往梯度的反方向去更新参数 θ 1 = θ 0 − η g 0 \theta_1 = \theta_0 - \eta g_0 θ1=θ0−ηg0
- 有了新参数 θ 1 \theta_1 θ1后,再计算一次梯度,再往梯度的反方向,再更新一次参数;
- 到了新位置后再计算一次梯度,再往梯度的反方向去更新参数…
- 引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定最终的移动方向。
- 按照上图,红色虚线的方向是梯度的反方向,蓝色虚线的方面爱那是前一次参数更新的方向,蓝色实线的方向是下一步要移动的方向,即把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。
- 图中步骤如下:
- 初始的参数值 θ 0 = 0 \theta_0 = 0 θ0=0,前一步参数的更新量为 m 0 = 0 m_0 = 0 m0=0
- 在 θ 0 \theta_0 θ0 的地方,计算梯度的方向 g 0 g_0 g0
- 下一步的方向 = 梯度的反方向 + 前一步的方向,因为这里前一步 = 0,所以更新的方向就是梯度的反方向;
- 下面计算在 θ 1 \theta_1 θ1 新的梯度 g 1 g_1 g1
- 接下来更新的方向为 m 2 = λ m 1 − η g 1 m_2 = \lambda m_1- \eta g_1 m2=λm1−ηg1,参数更新为 θ 2 \theta_2 θ2 …
- 因为每一步的移动都是用
m
m
m 来表示,那它可以写成之前所有计算的梯度的加权和;
m 0 = 0 m 1 = − η g 0 m 2 = − λ η g 0 − η g 1 . . . . \begin{aligned} & m_0 = 0 \\ & m_1 = -\eta g_0 \\ & m_2=-\lambda\eta g_0 - \eta g_1 \\ &.... \end{aligned} m0=0m1=−ηg0m2=−ληg0−ηg1.... - 其中 η \eta η 是学习率, λ \lambda λ 是前一个方向的权重参数、它是需要调的。
3.2.3.3 两个角度理解动量
- 一个角度是:动量是梯度的负反方向 + 前一次移动的方向
- 另一个角度是: 当加上动量后,更新得方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。
3.3 自适应学习率
- 临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。
3.3.1 AdaGrad
Adaptive Gradient 是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。
- AdaGrad的功能就是做到梯度比较大的时候,学习率就减小;梯度比较小的时候,学习率就放大;
总结
- 本章属于深度学习入门,介绍一些深度学习中的基础概念;
- 首先介绍临界点,着重介绍临界点中的局部极小值和鞍点;