local minima:局部最优
saddle point:鞍点
gradient=0(loss 不再更新):有多种情况——local minima/saddle point,统称为critical point
在local point处无法找到其他最小值点
在saddle point处有可能从某个方向找到escape方法
要知道loss function的形状
泰勒展开式
当 θ \theta θ近似于 θ ′ \theta' θ′时, L ( θ ) L(\theta) L(θ)可近似为以上式子
g(Gradient)会弥补 θ ′ 与 θ \theta'与\theta θ′与θ之间的差距
H(Hessian海森矩阵)继续补足 θ ′ 与 θ \theta'与\theta θ′与θ之间的差距
当我们遇到critical point时,此时gradient=0,即上式2项=0
此时可以根据上式3项的Hession Matrix,判断 θ \theta θ附近error surface大致样子,以判断该点属于何种类型
令 v = θ − θ ′ v=\theta-\theta' v=θ−θ′,故3项为 1 2 v T H v \frac{1}{2}v^{T}Hv 21vTHv
不管 θ \theta θ为何值,且 v T H v > 0 v^{T}Hv>0 vTHv>0,则在 θ \theta θ附近都有 L ( θ ) > L ( θ ′ ) L(\theta)>L(\theta') L(θ)>L(θ′),即local minima
同理,若 v T H v < 0 v^{T}Hv<0 vTHv<0,则在 θ \theta θ附近都有 L ( θ ) < L ( θ ′ ) L(\theta)L(θ)<L(θ′) ,即local maxima
否则,为saddle point
又由 v T H v > 0 v^{T}Hv>0 vTHv>0可知,H是positive definite,即Hessian矩阵所有特征值都大于0,因此直接判断Hessian即可
某个network:y=w1w2x
穷举w1,w2,并计算其所带来的loss,画图如下
计算H(Loss的二次微分矩阵)【原点(0,0)处】
saddle point处是可以找到继续梯度下降的方向的,通过Hessian矩阵
找到H的特征向量u及对应的特征值
λ
\lambda
λ
将3项改写为
1
2
λ
∣
∣
u
∣
∣
2
\frac{1}{2}\lambda||u||^2
21λ∣∣u∣∣2
沿着u,即特征值的方向更新
θ
\theta
θ即可降低loss
实际应用中一般不会计算Hessian矩阵,因为计算量较大,还要计算特征值和特征向量,还有其他escape saddle point的方法
在不同维度空间中,会不会local minima变成saddle point?
即如果有更多参数,或许local minima就更少了?
在经验中也支持这个假说:
实际上基本找不到所有特征值全正情况,由图可以看出在极端条件下也有一般是负特征值,也即实际上local minima的并不常见,总会找到可以使loss下降的方向
每次计算loss时,是分别取batch进行计算L1,l2…ln
所有数据(n个batch)计算完成即为一个epoch
在每一个epoch开始之前会分一次batch,每一次的batch划分都不一样——shuffle
观察两种极端情况:
batch size=N:要把所有数据处理一遍才能updata一次参数
batch size=1:每一次update是不稳定noisy的
较大batch size的计算时间不一定比较小batch size多(有平行运算的能力)有实验证明
因此当batch size小的时候,一个epoch花费时间会更多,在考虑平行运算时,big batch size更有优势
noisy gradient 可能会帮助训练准确度,大的batch size可能会带来不好的结果
小的batch在testing时得到较好效果
在峡谷里的local minima是bad minima
大的batch size倾向于走到峡谷里
总结
batch size:炼丹超参
物理引入,通过动量让gradient decent越过critical point
(一般的)gradient过程
加上动量的gradient decent过程
会考虑前一步方向再decent
一种改变梯度方向的策略,防止陷入local minima
考虑过去所有gradient总和
由于惯性可能会越过山坡找到更低处——momentum的好处
总结
当loss不再下降时,gradient不一定变得很小
自行调整当前gradient的权重(重要性)
目前最常用的optimization:Adam算法——RMSProp+Momentum
Adam original paper
learning rate decay : 接近终点时可以让learning rate减小,让更新慢下来
warm up: learning rate 先变大再变小
bert 中需要warm up
transformer 中也有
详情可参考论文RAdam
使用回归方式求解分类问题:以模型输出数值贴近分类表示值来表示,属于某一类别;但是按照这样表示class1有更大可能相似于class2,而与class3有更大不同,但不是所有分类方式都是数值接近而相似的。
将每个class用独热向量表示
(class两两之间距离相同)
softmax
两个class用sigmoid函数
再去计算
y
^
\hat{y}
y^与
y
y
y之间距离,作为损失函数并使其最小
有多种方式计算距离
cross-entropy是最适合分类问题的
cross-entropy和softmax是一个set,总是绑在一起使用
固定y3=-1000,不考虑其影响,y1,y2在【-10,10】之间变化
对loss的影响
左上角处:MSE会卡住,cross entropy有斜率可以往右下角(优化方向步进)
因此使用MSE可能训练困难,即使使用较好的optimization(Adam)在开始处也可能loss下降较慢,相反使用cross entropy就没有这种担心
因此可以看出,loss函数的选择也会影响训练效率
由于不同的dimension有不同的范围其对loss的影响大小不同,导致error surface不同地方梯度不同,导致训练效率下降
如何使得不同dimension有相同range:feature normalization
可以使gradient decent loss收敛更快一点,训练更顺利一些
考虑到深度学习的多层网络训练
经过每层网络后的结果可能仍然是different dims
因此在下一层之前还要做feature normalization
实际应用中在激活函数之前还是之后使用feature normalization都是可以的,影响不大
若激活函数是sigmoid,建议在z处做feature normalization,因为sigmoid函数在0附近斜率较大,对z做feature normalization可以将所有的值移到0附近,会得到更大的gradient
在这里,z1,z2,z3是相互影响的
实践时,由于数据量巨大我们分batch训练,因此考虑到一个batch训练过程中的normalization,我们称之为batch normalization(batch size比较大)
平均不是0
新增学习参数,如果不希望normalization结果平均是0(可能会对结果产生影响),网络会自动学习与调整
β
,
γ
\beta,\gamma
β,γ
若testing时没有batch
pytorch的处理: 在训练时计算moving average
batch normalization original paper
How does batch normalization help optimization