一、学前概览
任务内容:深度学习之中常见的概念
任务目的:帮助调参侠从不同角度更好去优化神经网络
本节出现术语:局部极小值、鞍点、自适应学习率、学习率调度、批量归一化
1.学前疑惑
A.为什么收敛在局部极限值与鞍点会导致优化失败?
B.如何理解批量归一化可以改变误差表面?
2.学中疑问
C.如何去区分critical point(gradient为0的点)是属于local minima或者saddle point?
D.参数update中,看的是gradient,但是当gradient为0,如果该点为saddle point,还可以再通过H(hessian),那么如何通过H去更新参数?
E.saddle point和local minima哪一个更常见?
F.为什么要用batch?
G.为什么小的batch size在训练集上会取得比较好的结果?
3.学后解答
A.因为达不到全局最优解
B.批量归一化通过改变网络中数据的分布和引入正则化效应,使得误差表面更加有利于优化算法的搜索(并非本节学的内容)。
C.见知识点1
D.见知识点2
E.见知识点3的图6
F.我所理解的一种便是用GPU去加速计算,加快训练过程。
G.见知识点5
二、Task1.1 局部极小值与鞍点
实际优化过程中经常出现的问题:不管怎么更新参数,损失都无法下降(深有体会)或者是没有发挥它的力量。
出现原因:该地方参数对损失的微分为0(local minima或者saddle point都有可能存在)
1.知识点1:loss function在给定参数下的近似表达
给定某一组参数,比如θ′ ,在θ′ 附近的损失函数是有办法写出来的,似懂非懂,不过这不是我们学习的重点,我们知道这个公式的含义就可以了,具体证明是做数学的人来做。如图1所示。
![给定参数下的损失函数的近似表达](https://i-blog.csdnimg.cn/direct/62fcaac3bcaa41dca42a4948ed6096d6.png)
当训练走到了critical point时,次微分结果为0,去除图1中间绿色项,所以可以通过红色项(即Hessian)去了解当前属于训练处于哪种状态(local min、local max或saddle point)。
对红色项分析,将Hessian和两边的向量替换成一个向量v:
当红色项>0时,意味着当前参数是Local minima;
当红色项<0时,意味着当前参数是Local maxima;
当红色项有时>0,有时<0,则意味着当前参数是saddle point
更进一步地,上述问题可以转化为判断hessian矩阵特征值的大小,列出来的情况如图2所示
![](https://i-blog.csdnimg.cn/direct/28d376346b2945b8acfdf2ac320df99e.png)
举例子,有一个很废的神经网络,它的误差表面如图3右上角所示,坐标轴代表两个参数大小关系,假设输入是1,输出为1,那么该神经网络的误差表达式(损失)同图3左上角的L表达式所示。此时,可以算出每个参数对L的微分(梯度),如图3中绿色部分所示。找到其中一种梯度为0的情况是两个参数值都为0,这个时候能够确定critical point,但是不确定是哪种类型。
需要注意一点是,hessian矩阵里放的是损失函数的二次微分,即图3中红线圈出来的部分。分别对两个参数求二次偏导,得到hessian矩阵,即H。再根据前面得出的结论,去判断该hessian矩阵的特征值(运用线性代数的知识),算出来得到一正一负,判断出为Saddle point。
![](https://i-blog.csdnimg.cn/direct/7e9f5f4f4d164d4ea5d42549b9794db2.png)
2.知识点2:通过saddle point去更新参数
首先先区分一下特征值,矩阵和向量的关系(太久没学忘了):
在线性代数中,对于n阶矩阵A,如果存在一个数λ以及非零n维列向量α,使得Aα=λα成立,则称λ是矩阵A的一个特征值。非零向量α是矩阵A属于特征值λ的一个特征向量。这个定义明确了特征值和特征向量的关系,即特征值是与矩阵A和其非零特征向量之间的特定关系相关的数。因此,当Aα=λα成立时,可以确定λ是矩阵A的一个特征值,而α是对应于这个特征值λ的特征向量。
对应到损失函数中,假设μ是H的特征向量,λ是特征值,那么可以对图4中红圈部分进行替换。再根据等式换位,可以得出将参数沿着μ的方向进行更新,可以达到减少损失的目的。
![](https://i-blog.csdnimg.cn/direct/d489100a4e6241909f3aaaac386280c0.png)
举例子,hessian矩阵算出了两个特征值分别为一正一负,取特征值-2,其存在有多个特征向量,这个时候有[1,1]是满足条件的,我们可以沿着[1,1]的方向去做参数的更新,实际上对应着从图5的右上角的误差表面的黑色箭头方向。
![](https://i-blog.csdnimg.cn/direct/85a5344c77b841bf96283aeeed0fc1f7.png)
实际中并不会把hessian算出来,因为对于hessian需要做二次微分,如果参数增加,那么计算hessia矩阵的运算量就会变得超级无敌大,此外还需要找 它的特征值和特征向量,实际应用中并不会用这个方法去逃离saddle point。
3.知识点3:逃离鞍点的方法
参数的数量代表了误差表面的维度。存在一个假说:维度很高,会不会有很多的路可以走?既然很多的路可以走,会不会local minima很少?
如图6所示,每一个蓝点代表一个NN,纵轴代表损失收敛的临界,横轴代表最小值比例(minimum ratio),其是由大于零的特征值与所有特征值之比得来。最小值比例最大也不过处于 0.5~0.6的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。从经验上看,local minima并没有那么常见。
![](https://i-blog.csdnimg.cn/direct/c7b68f3400054718a1f5372fd62dd758.png)
三、Task1.2:批量与动量
1.知识点4:batch,epoch的关系
所有的data分成一个一个的batch,每次update参数时,模型会取一个batch去算loss,gradient,然后更新参数,然后再拿另外的一个batch,再算一个loss,gradient,然后更新参数。当所有的batch都被模型看过一遍,便是一个epoch。
2.知识点5:small batch和large batch的区别
结合图7,简单粗暴去理解(不考虑平行计算):large batch(图7左边)冷却时间长,但是稳;small batch(图7右边)冷却时间短,但是产生的噪声多。
实际上左边并不一定用时长,如果考虑平行计算的时候,一个epoch大的batch花的时间可能比较小。
![](https://i-blog.csdnimg.cn/direct/e05c1bd031834b44b835be51a073bab0.png)
一张图(图8)解释small batch的优势:full batch时,很可能会遇到gradient为0从而卡住的情况,但是训练已经结束;如果是small batch的话,这个batch不行我就换下一个,总有出现训练损失下降的一个。有一篇论文研究两者的关系,发现不管是small还是large,在训练的时候结果差不多,但是测试的时候,大的批量比小的批量差,对于large batch而言代表着过拟合。可以这么解释,small batch有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使 “峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
![](https://i-blog.csdnimg.cn/direct/a6869f9d48a54df3afeb3345bbbbc0cc.png)
以图9作为总结,比较large和small batch在不同情况下的性能优劣。
![](https://i-blog.csdnimg.cn/direct/f7e2cc9590ce4449b27aed2ffa868178.png)
3.知识点6:momentum的运作原理
假设loss走向是一个斜坡,而参数就像一个球从斜坡上滚下来,如果动量够大,如便不会被鞍点和局部极小值卡住。所以思考:能不能把物理中出现的这种现象运用到梯度下降里面?
一般的梯度下降过程如图10所示,一直沿着gradient的反方向去更新参数。
![](https://i-blog.csdnimg.cn/direct/29f8065dc03040969db19240a8aa30d7.png)
加上动量后的梯度下降如图11所示,此时,参数的更新方向为gradient的反方向和前一步移动的方向的矢量和。更进一步地,如今的参数优化方向为当前gradient反方向加上前面的移动方向的综合。
![](https://i-blog.csdnimg.cn/direct/b347c611ecc3489886c615ad8cfd9c54.png)