#Task 1.1+1.2#
第 3 章 深度学习基础
“本章介绍了深度学习常见的概念,理解这些概念能够帮助我们从不同角度来更好地优化神经网络。要想更好地优化神经网络,首先,要理解为什么优化会失败,收敛在局部极限值与鞍点会导致优化失败。其次,可以对学习率进行调整,使用自适应学习率和学习率调度。最后,批量归一化可以改变误差表面,这对优化也有帮助。”————《深度学习详解》
3.1 局部极小值与鞍点
当损失在改变了模型种类之后仍旧不理想,说明优化是有问题的。但有时,模型一开始就训练不起来,为什么?
3.1.1 临界点及其种类
鞍点(saddle point),其实就是梯度是零且区别于局部极小值(local minimum)和局部极大值(localmaximum)的点;把梯度为零的点统称为临界点(critical point)
只要逃离鞍点,就有可能让损失更低。
3.1.2 判断临界值种类的方法
#vT==向量 v 的转置
虽然无法完整知道整个损失函数的样子,但是如果给定某一组参数θ′,在 θ′ 附近的损失函数是有办
我们可以根据 ’第二项‘ 来判断在 θ′ 附近的误差表面(error surface)到底长什么样子。知道误差表面的“地貌”,我们就可以判断 L(θ′) 是局部极小值、局部极大值,还是鞍点。
为了符号简洁,我们用向量 v 来表示 θ − θ′; (θ − θ′)T H(θ − θ′)可改写为 vT Hv,有如下三种情况。
(1)如果对所有 v,vT Hv > 0. 这意味着对任意 θ,L(θ) > L(θ′). 只要 θ 在 θ′ 附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
(2)如果对所有 v,vT Hv < 0. 这意味着对任意 θ,L(θ) < L(θ′),θ′ 是附近最高的一个点,L(θ′) 是局部极大值。
(3)如果对于 v,vT Hv 有时候大于零,有时候小于零。这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
有一个更简便的方法来判断 vT Hv的正负:只要看 H的特征值。若 H 的所有特征值都是正的,H 为正定矩阵,则 vT Hv> 0,临界点是局部极小值。若 H 的所有特征值都是负的,H 为负定矩阵,则 vT Hv< 0,临界点是局部极大值。若 H 的特征值有正有负,临界点是鞍点。
如果 n 阶对称矩阵 A 对于任意非零的 n 维向量 x 都有 xT Ax > 0,则称矩阵 A 为正定矩阵。如果 n 阶对称矩阵 A 对于任意非零的 n 维向量 x 都有 xT Ax< 0,则称矩阵 A 为负定矩阵。
这是我们取 [−2,2] 之间的参数得到的损失函数,得到的损失的值后,画出误差表面后得到的结论。
何时为临界点?比如原点
通过海森矩阵来判断原点是局部极小值还是鞍点,要看它的特征值,这个矩阵有两个特征值:2 和 −2,特征值有正有负,因此原点是鞍点。
H 不只可以帮助我们判断是不是在一个鞍点,还指出了参数可以更新的方向。
沿着 u 的方向更新 θ,损失就会变小。
虽然临界点的梯度为零,如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与 θ′ 相加,就可以找到一个损失更低的点。
e.g. 在前面的例子中,原点是一个临界点,此时的海森矩阵如式 (3.9) 所示,该海森矩阵有一个负的特征值:−2,其对应的特征向量有无穷多个。不妨取 u = [1, 1]T 。梯度不会告诉我们要怎么更新参数,但海森矩阵的特征向量告诉我们只要往 [1, 1]T 的方向更新。损失就会变得更小,就可以逃离鞍点。
但实际上,我们几乎不会真的把海森矩阵算出来,因为海森矩阵需要算二次微分,计算这个矩阵的运算量非常大,还要把它的特征值跟特征向量找出来,所以几乎没有人用这个方法来逃离鞍点。
3.1.3 逃离鞍点的方法
我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。图 3.6 中,横轴代表最小值比例(minimum ratio),最小值比例=正特征值数量/总特征值数量。实际上,我们几乎找不到所有特征值都为正的临界点。
从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
本文图文基本摘抄自————《深度学习详解》,非营利仅供学习参考。
3.2 批量和动量
3.2.1 批量大小对梯度下降法的影响
实际上,批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
随机梯度下降的梯度上引入了随机噪声,因此在非凸优化问题中,其相比批量梯度下降更容易逃离局部最小值。
一般情况下的两者关系
MNIST 中的“NIST”是指国家标准和技术研究所(National Institute of Standards andTechnology),其最初收集了这些数据。MNIST 中“M”是指修改的(Modified),数据经过预处理以方便机器学习算法使用。MNIST 数据集收集了数万张手写数字(09̃)的28×28 像素的灰度图像及其标签。一般大家第一个会尝试的机器学习的任务,往往就是用 MNIST 做手写数字识别, 这个简单的分类问题是深度学习研究中的“Hello World”。
因此实际上,在有考虑并行计算的时候,大的批量大小反而是较有效率的,一个回合大的批量花的时间反而是比较少的。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有噪声的的梯度反而可以帮助训练
这不是过拟合,因为批量大小越大,训练准确率也是越低。因为用的是同一个模型,所以这不是模型偏见的问题。 但大的批量大小往往在训练的时候,结果比较差。这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
其实小的批量也对测试有帮助。假设有一些方法(比如调大的批量的学习率)可以把大的批量跟小的批量训练得一样好。实验结果发现小的批量在测试的时候会是比较好的
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
所以从一个回合需要的时间来看,大的批量是较有优势的。 而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。
3.2.2 动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。如图 3.14所示,假设误差表面就是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。 但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。
一般的梯度下降(vanilla gradient descent)如图 3.15 所示。初始参数为 θ0,计算一下梯度,计算完梯度后,往梯度的反方向去更新参数 θ1 = θ0 − ηg0。有了新的参数 θ1 后,再计算一次梯度,再往梯度的反方向,再更新一次参数,到了新的位置以后再计算一次梯度,再往梯度的反方向去更新参数。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
每一步的移动都用 m 来表示。m 其实可以写成之前所有计算的梯度的加权和,如式 (3.13)所示。其中 η 是学习率,λ 是前一个方向的权重参数,也是需要调的。
3.3 自适应学习率--(非监督式学习)
临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。图 3.18 中的横坐标代表参数更新的次数,竖坐标表示损失。一般在训练一个网络的时候,损失原来很大,随着参数不断的更新,损失会越来越小,最后就卡住了,损失不再下降。当我们走到临界点的时候,意味着梯度非常小,但损失不再下降的时候,梯度并没有真的变得很小,图 3.19 给出了示例。图 3.19 中横轴是迭代次数,竖轴是梯度的范数(norm),即梯度这个向量的长度。随着迭代次数增多,虽然损失不再下降,但是梯度的范数并没有真的变得很小。
图 3.20 是误差表面,梯度在山谷的两个谷壁间,不断地来回“震荡”,这个时候损失不会再下降,它不是真的卡到了临界点,卡到了鞍点或局部最小值。但它的梯度仍然很大,只是损失不一定再减小了。所以训练一个网络,训练到后来发现损失不再下降的时候,有时候不是卡
(PDF暂时到此为止了,dbq,若有需要请看下一篇)
本文图文基本摘抄自————《深度学习详解》,非营利仅供学习参考,侵删。