【类神经网络训练不起来怎么办】李宏毅2021/2022春机器学习课程笔记EP4(P19-P22)
从今天开始我将学习李宏毅教授的机器学习视频,下面是课程的连接(强推)李宏毅2021/2022春机器学习课程_哔哩哔哩_bilibili。一共有155个视频,争取都学习完成吧。
那么首先这门课程需要有一定的代码基础,简单学习一下Python的基本用法,还有里面的NumPy库等等的基本知识。再就是数学方面的基础啦,微积分、线性代数和概率论的基础都是听懂这门课必须的。
这几节课主要讲了类神经网络训练不起来我们应该怎么办。
第一种是在训练时,我们可能会遇到梯度g已经接近0,loss几乎不再下降,但是loss的值依旧不够小,没有达到我们的预期。
梯度gradient为零的时候,一般会有下面两种情况:局部最小值和鞍点。
随着神经网络复杂,loss的函数我们难以表示,那么我们应该如何来区别局部最值和鞍点?
虽然我们无法明确地写出损失函数L(θ),但是θ’附近的函数是可以被写出来的。大概的L(θ)如下:
这里大概的L(θ)式子与g和H有关,g就是一次微分,H就是里面有二次微分的项。
因为这里我们讨论的是在驻点上的情况,这里的g=0,所以式子中绿框的部分可以直接除去不看。而右边红色框中的式子就可以帮助我们判断局部最值和鞍点。这里将红色框中的式子简写成vTHv,v表示模型的输出参数θ和label值θ’的差值。
除去了绿框中的式子,我们只把目光放在vTHv上,对于所有的v(也就是说不论θ的值是什么):
若vTHv>0,也就是说在θ’附近,L(θ)>L(θ’)恒成立,也就是说L(θ’)是局部最小值。换句话说vTHv>0,式子中的H如果是正定矩阵,也就是说H中的所有特征值都是正的,那么我们就可以说这里就是局部最小值点。
若vTHv<0,也就是说在θ’附近,L(θ)<L(θ’)恒成立,也就是说L(θ’)是局部最大值。换句话说vTHv<0,式子中的H如果是负定矩阵,也就是说H中的所有特征值都是负的,那么我们就可以说这里就是局部最大值点。
若有时vTHv>0,有时vTHv<0,那么我们就可以判断这是鞍点。
因此只要算H,看H中的特征值的正负就可以判断局部最优值和鞍点。
如果我们在训练的时候遇到loss下降不了(g=0点)的原因是到了鞍点,那么H就可能给我们提供参数更新的方向。
我们把μ设为H的特征向量,把λ设为μ的特征值,那么之前的vTHv可以简写成λ||μ||2。
我们的更新方法就是先找出负的λ对应的μ,然后新的更新参数θ=θ‘+μ。
然后是两个局部最优值的处理,这里因为基本不太可能出现所有的特征值λ都为正或都为负,所以局部最优值这种情况一般太可能出现,或者说不太可能成为loss下降卡住的原因。这里的解释就是,也许从二维角度看起来,有一些点想局部最优值,但是升高维度之后再看,大概率就不是局部最值了,也就是很多时候升维之后,我们可以发现在低维度下找不到的路(这里李老师在课上讲到很形象)。总的来说,我们就不需要去考虑局部最优值的解决方法。
第二种将了批次和动量的思想。
在第一节课时,我们说在训练模型的时候我们需要将资料分成多个批次(batch),但是我们为什么要这么做呢?或者说这样做有什么好处?
前面说了,batch size是一个我们可以自定义的超参数。那么下面我们就来比较一下大的批次和小的批次有什么区别,各自有什么优势。下面拿了两个机器学习中比较常见的问题:MNIST和CIFAR-10来说明。
从上面的图中就可以看出,随着batch size变大,模型的正确率就开始随着变小了。也就是说小的batch size的效果更好。而大的size出了什么问题呢?这里需要注意的是,这个问题不是过拟合(overfitting),而是优化(Optimization)的关系。那么这个优化的问题是什么呢?
从上面的图可以看出,如果我们用整个资料去训练,那么很可能会遇到局部最小的点(g=0),在这个点上卡住(停止学习)。但如果我们把整个资料分成一个一个批次,那么如果在一个函数的地方卡住,而另一个函数不一定会在局部最小值的点上,也就是说在一个函数卡住的时候,另一个函数并不一定会卡住。小的batch除了在训练集上效果好,其实也有更多的例子来说明小的batch在测试集上的效果更好。
如果我们同时考虑训练集和测试集的Loss函数,那么其实局部最小值也有好坏之分。因为训练集的loss和测试集的loss函数不同,在左边坡度较平的盆地局部最小值(minima)上,训练集和测试集不会差太多;但是对于右边坡度较陡峭的峡谷上的最小值(minima)上,训练集和测试集差的很大。flat minima就是好的minima,sharp minima就是坏的minima。所以说小的batch size更加倾向于平的minima(flat minima),大的batch size更加倾向于陡峭的minima(sharp minima)。
最后我们来总结一下,大的batch size和小的batch size的区别:
两种大小的batch size各自有各自的优点,比如说大的batch size在每一轮计算的时间会比较快;在优化方面(寻找最小的Loss值),小的batch size效果就会更好;在泛化(暂时没有提到)上,小的batch size效果也更加好。batch size是一个超参数,所以我们可以根据实际需要去选择batch size的大小。
下面我们来说另一种对抗鞍点和局部最小(梯度g=0)的方法:动量思想。
这个思想和物理上动量比较相似,也就是让Loss像物理中的小球一样,到了局部最小后,依旧向后更新参数。
先来复习一下我们前面做的一般的梯度下降法的做法。
一开始我们说梯度下降法更新参数的时候步骤是这样的,先是从θ0点开始计算梯度g0,然后更新新的参数θ‘=θ0– ηg0也就是往g的反方向更新参数θ,最后计算θ‘点的梯度g’,接着就是以此类推计算下去。
那么加上动量的思想之后就是下面这样。
在原来梯度下降法的基础上进行一步改动,就是下一步的更新方向我们不选择梯度g的反方向,而是选择梯度g加上上一步方向的向量和的方法去决定下一步更新参数的方向。
这样子做的好处就是,梯度g不再是影响参数θ更新的唯一参数。也就是说只要原来方向的影响够大,θ依旧会向右继续更新参数。这样在图像上就很想物理上的动量,也就是惯性。
第三种讲的是自动调整学习率。
学习率η决定了更新的步伐大小。
有时候训练停止可以是不一定寻找到了最小的梯度,而是因为学习率过大,参数在两个较大的loss处来回横跳而一直下不到最低的loss点处。
而如果我们的学习率平均变化,在loss变化率小的地方,学习率会急剧变小,每次走的步伐会急剧变小,参数的更新次数会急剧变大,这样就算是很长的时间,我们也很难到达终点。因此我们需要对每个参数的学习率进行客制化。
对每个参数的学习率进行客制化的调整方法如下:
原来的梯度下降法更新参数的方法是θ‘=θ0– ηg0,如果我们要对每个参数进行客制化,我们需要对这里的学习率进行变化。主要就是将所有过去算出的梯度g的均方(图中有误)开根作为σ,然后用我们设定的固定的学习率η去除以σ得到新的学习率。这样做的好处就是,我们可以根据坡度的陡峭程度去决定我们的学习率的大小。
具体说来就是参数θ的坡度小,这个地方的梯度g就小,算出来的σ就小,整体的学习率就会变大,步伐就会变大。反之亦然。
对于同一个参数,同一个方向,学习率也需要动态调整:
这里我们用到的方法就是RMSProp,我们不去使用刚才σ的计算方法,而是如上图中,我们引入了一个超参数α,它可以动态调整当前参数的梯度的重要性,从而更加灵活地去调整学习率。举例就是,坡度平缓时(g较小),我们减小α,可以让σ很快减小,这样就可以使学习率变大,步伐也变大;反过来,坡度很陡时(g较大),增大α,可以让σ很快变大,这样就可以使学习率变小,步伐也变小。
而这样,将每个参数的学习率客制化调整以后,到了终点平行处,学习率会自动调整,此处的坡度很小,因此梯度g会变小,步伐就会变大。在y轴方向累积了很多小的g,学习率就会急剧变大,但到了y轴方向梯度g很大的地方,σ会变大,学习率又会下降,步伐又会渐渐变小。这样最后就会呈现出上面那样泼墨的感觉。那我们为了防止靠近终点时,学习率急剧变大或变小,我们有两种方法去对抗。第一种是开始先设一个很大的学习率η,随着时间减小去减小学习率。第二种是从0开始快速增加学习率,到一定值后再缓慢减小学习率η。
第四种是损失函数(Loss)也可能有影响。
在进行分类问题的模型训练上,可能类1和类2没有直接的关系,因此用模型的输出数值y去对应一个类并不合适。我们通常会将label值yhat用one-hot编码表示,因为用独热编码表示三个类,它们两两之间的距离都一样,这样类与类之间就建立起来了关系。
从回归问题到多分类问题,我们还需要改进下面几处地方。
首先是回归问题是多个输入对应一个输出,这里我们直接将多个输入改成多个输出就可以,然后希望让每个输出尽量靠近我们的label类。
然后因为label中的yhat是只有0和1的one-hot编码,所以我们要在分类问题中多加一个softmax函数。softmax函数可以将输入的任何y值变为0-1的值。
softmax函数会让输入的各个值之间的差距变大,并且令输出值之和为1。函数的式子如下图。
值得一提的是,如果输入值为两个时,使用softmax函数和sigmoid函数的效果是一样的。
最后我们还要改变一下分类问题中求loss的函数。
原来的MSE方法将模型输出与标准值作差并求平方,来表示模型输出的标准度。我们将其改为Cross-entropy,这个方法更加适合用在分类问题上面。
从下面一个例子中可以看到,由于两种方法的式子不同,MSE可能在loss很大的地方非常平坦,g很小且趋近于0,梯度下降法可能出现停止训练的问题。这里也可以看出loss函数的式子不同也对模型是否好去训练有很大的影响。
以上就是对类神经网络训练不起来的问题的解决方法的笔记。
评论