一、学习资料
Datawhale提供:Datawhale (linklearner.com)
Task1.2:《深度学习详解》- 3.2 批量和动量(7页+31分钟).pdf - 飞书云文档 (feishu.cn)
李宏毅老师对应视频课程:神经网络训练不起来怎么办(1):局部最小值(:Loacl Minima)与鞍点(Saddle Point)_哔哩哔哩_bilibili
二、学习笔记
本次课程讨论中心:为什么神经网络优化失败
(一)引入
训练时经常会出现:loss值高→更新参数→loss还是降不下去
1、把深层网络(deep network)、线性模型和浅层网络(shallow network)做比较,可以发现深层网络没有做得更好——深层网络没有发挥出它完整的力量,所以优化是有问题的。
2、模型从一开始就训练不起来:不管我们怎么更新参数,损失不再下降。
这种情况可能是因为模型运行到临界点了,在这一点上微分最接近0,但并不是Loss在整个函数中的最小值。
(截图自李宏毅老师课程,如未特殊标明,则下同)
(二)临界点(critical point)
1、局部极小值(local minima)
在课程的前几讲,老师也举过局部极小值影响梯度下降的例子。
如图所示,已存在wT点上斜率为0,因此模型到此点就会停止优化,但事实上这一点上并不是L在整体图像上的最小值。
(截自课程P2)
(截自本章课程,即P5)
2、鞍点(saddle point)
在鞍点上,gradient(斜率)也是为0,但是不同于局部极小值。局部极小值是周围都比这个点高,所以“无路可逃”;但鞍点四周还能找到其他点,使loss更小。
3、分辨局部极小值和鞍点
Q:如何判断这个临界点是局部极小值还是鞍点?
A:需要知道loss函数的形状。
Q:那么如何得知loss函数的形状?
A:无法得知完整的函数形状,但是如果给定某一组参数,如θ,在θ附近的损失函数可以使用泰勒级数近似(Tayler series appoximation)写为:
拆解式子:
等号左边:在函数L上取一点θ
等号右边:①在θ附近取一点θ',这个θ'对应的L(θ')应该是非常非常接近于L(θ)的。但是还有一定的差距,怎么办呢,通过后面两部分弥补上。
②绿色方框部分:g代表梯度,是一个向量(有时候g也会写成下方左边举例的那种)。gi是向量g的第i个元素,就是L关于θ的第 i 个元素的微分。这部分用来弥补的是右图上绿色线条的部分。
③红色方框部分:海森矩阵。H里面放的是L的二次微分,它的第i行第j列的值,即Hij,就是把θ的第i个元素对Lθ′作微分,再把θ的第j个元素对gi作微分后的结果。这部分用来弥补的是右图上红色线条的部分。
当临界点出现时,意味着g=0,则中间绿色的部分=0,那么只需要通过红色部分就可大致得知θ'附近的L图像(误差表面)长什么样子。
为简化式子,将(θ − θ′)用向量 v 来表示,则式子为:
此时会有三种情况:
当vTHv恒大于0时,一定有L(θ)>L(θ′)。即只要θ在θ′附近,L(θ) 恒大于 L(θ′),可知 L(θ′) 是附近的一个最低点,所以它是局部极小值。
当vTHv恒小于0时,一定有L(θ)<L(θ′)。即只要θ在θ′附近,L(θ) 恒小于 L(θ′),可知 L(θ′) 是附近的一个最高点,所以它是局部极大值。
当vTHv时而小于0时而大于0时,这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′)。因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而是鞍点。
这样做理论可行,但实际上我们不可能把所有v全都代入一遍。所以,我们就通过矩阵特征来得知红色部分的正负。
若H的所有特征值都是正的,则H为正定矩阵,则有vTHv恒大于0,临界点是局部极小值。反之H为负定矩阵,则有vTHv恒小于0,临界点是局部极大值。若H的特征值有正有负,则临界点是鞍点。
总之:通过判断海森矩阵的特征值,即可得知临界点究竟属于哪种。
海森矩阵同样可得逃离鞍点的方法。
(上图截自datawhale教程)
再放一个简单举例:
(其实实际运用中狂算一波海森矩阵还是太麻烦了,并不常用...所以下面这个例子就省略步骤了,放老师的图上来理解一下就行)
4、逃离鞍点
下图为训练某不同神经网络的结果,每个点对应一个神经网络。纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失。我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。
图中横轴代表最小值比例(minimum ratio),最小值比例定义为最小值比例 =正特征值数量/总特征值数量
(截自datawhale教程)
(三)批次(batch)
1、batch, epoch, shuffle定义
(1)批次(batch):每一次算loss的时候,模型不会取全部的训练资料的去算,而是把资料分为多个批次(或称批量)(batch)。每一次都取一个batch,一个batch里有B个数据,算完后更新参数。然后再取另一个batch,然后再继续计算loss和g。
(2)回合(epoch):遍历了所有batch后,即为一个回合(或称一个轮次)。
(3)随机打乱(shuffle):在每个epoch开始前,重新分一次batch。
2、批量大小(batch size)
(1)时间
假设训练资料共20个数据:
①左图:批量梯度下降法(Batch Gradient Descent,BGD)batch size=N=20
不分批量,即只有一个batch,batch大小即为训练数据的大小,所有数据都在这一个batch中。使用全批量(fullbatch)的数据来更新参数的方法,模型需要遍历完全部20个数据才能开始计算梯度和损失。
缺点:所需时间长。优点:准确性高。
②右图:随机梯度下降法(Stochastic Gradient Descent,SGD)(也称增量梯度下降法)batch size=1
每1个数据都分进1个batch,只要取出一笔数据即可计算损失、更新一次参数。模型逐个batch计算,然后逐个更新参数。有多少数据就分多少batch、更新多少次。
缺点:噪音高,因为每个batch里的数据太少了,很容易不准,更新曲线中的曲折很多。优点:所需时间短,左图还在读取的时候,右边已经开始更新了。
两种方法各有利弊,大批量(批量梯度下降)不一定用时会比小批量(随机梯度下降)更长,因为计算机有平行运算(parallel computing)的能力。除非批量大小太大了,毕竟GPU的算力也是存在极限的。
小批量(随机梯度下降)不一定用时会比大批量(批量梯度下降)更短,也是因为平行运算能力。如果跑完一个epoch需要更新上万次,需要的时间就比更新60次要长。
补充资料:MNIST 中的“NIST”是指国家标准和技术研究所(National Institute of Standards and Technology),其最初收集了这些数据。MNIST 中“M”是指修改的(Modified),数据经过预处理以方便机器学习算法使用。MNIST 数据集收集了数万张手写数字(09̃)的28×28 像素的灰度图像及其标签。一般大家第一个会尝试的机器学习的任务,往往就是用 MNIST 做手写数字识别, 这个简单的分类问题是深度学习研究中的“Hello World”。
(2)准确率(accuracy)
虽然时间上说不准,但从正确率来看,small batch通常来说表现更好一些。
因为大批量的很容易在遍历一轮的过程中被临界点卡住,从而开始不再更新。但小批量的在L1上的某一点因为斜率为0卡住后,读取下一个批次时,L2上的相同自变量的点可能并没有卡住,就可以换下个批量的损失L2计算梯度。模型还是可以继续训练,继续让损失变小,所以小批量的更容易逃离鞍点。
如果小批量的变差了,那可能就是过拟合了。
(3)大小batch size比较
(四)动量法(momentum method)
(好厉害的解法,从未设想过的道路......)
1、什么是动量法
假设误差表面(loss图像)是一个斜坡,参数是一个球。在物理的世界里,一个球如果从斜坡滚下来且势能足够大,就算滚到鞍点或局部极小值,球也能翻过小障碍继续往前走,不会被卡住。
2、普通梯度下降和加入动量法后的梯度下降对比
普通梯度下降:
初始参数为θ→计算梯度→往梯度的反方向去更新参数θ1=θ - ηg →根据新的参数θ1再计算一次梯度→再往梯度的反方向更新参数θ2→根据θ2再计算一次梯度......(以此类推)
加入动量法的梯度下降:
这一动的方向不止基于梯度g了,还要再考虑这一动的前一动,把前一动指示的方向跟梯度的反方向(两个矢量)相加就是下一步的移动方向。