本笔记是针对李宏毅教授在b站上的视频《ML Lecture 9-1:Tips for Training DNN》的学习笔记。
问题:texting data的效果不好?是过拟合overfitting了嘛?
首先根据下图,训练完成一个模型后,获得一个Neural network,检查结果来确定要执行的相应措施。
实际上只有trianing data效果好但是texting data的表现不行的情况下,才能说模型可能overfitting了。对于DL来说,过拟合往往不是你首先会碰到的问题,反而是训练过程就很难得到满意的结果,即可能训练集上的准确率就一直很低。如果你在训练集上准确率很高了,但在测试集上准确率低,那才是过拟合。
问题:导致texting data的效果不好的原因是什么呢?
当然是因为数据不够!但是假设数据足够,但是为什么做不出来预期的表现呢?
如下面这种情况:
明明参数比56层网络少的20层网络也可以在训练集上达到更好的效果,所以这也不太可能是欠拟合问题,因为欠拟合一般是指模型的参数不够多,所以其能力不能解出这种问题。
这就是training data的效果不好,那么其可能的原因:
1.sigmoid function激活函数不适合作为多层DNN的激活函数。
2.局部最小(local minima)鞍点(saddle point)停滞(piateau)
提醒:读文献时,看到新方法时,要明白它是要解什么样的问题?一般DL要解决的问题就是训练集上的准确率和测试集上的准确率这两个问题,而新提出的方法也一般是针对这两个问题。
梯度弥散与Relu激活函数
梯度弥散的解释(vanishing gradient problem):链接中有从数学的角度的解释,比较通俗的解释是,在靠近input的部分梯度较小,在远离input的地方,梯度较大。因此,靠近input的参数更新慢、收敛也慢,远离input的参数更新快、收敛得也很早。
为什么会有这个现象发生呢?
如果我们把BP算法的式子写出来,就会发现:用sigmoid作为激活函数就是会出现这样的问题。
直觉上想也可以理解:某个参数的下降梯度取决于损失函数对参数的偏导,而偏导的含义是:当该参数变化很小一点,对应的损失函数向相应变化的幅度。所以我们假设对第一层的某个参数加上△w,看它对损失函数值的影响。那么,当△w经过一层sigmoid函数激活时,它的影响就会衰减一次。(sigmoid会将负无穷到正无穷的值都压缩到(-1,1)区间)。
于是,怎么解决这个问题呢:换一个不会逐层消除掉增量的激活函数,比如ReLU.
而且除了解决梯度弥散问题,ReLU含有其它的好处:
1.计算速度快
2.生物学层面的理由,无用的神经元会退化消失
3.等同于无穷多层的偏差不同的sigmoid函数叠加的结果
那ReLU具体怎么解决梯度弥散问题呢?
如下图,假设图中网络的激活函数都是ReLU。而网络中必然有一些神经元对应的输出会是0,它们对于网络的贡献也是零,故可以逻辑上直接从网络中删除,这样我们就获得了一个“更瘦长”的线性网络(输出等于输入)。
而之前说梯度递减也是因为sigmoid的衰减效果,而我们现在用ReLU它本身不会对增量进行递减,因为现在凡是在网络中work的神经元,其输出都等于其输入,相当于线性函数y=x。
问题:如果网络都用ReLU了,网络变成了线性的了?那NN的效果不会变得很差吗?这与我们使用深层网络的初衷不是违背了吗?
答:其实使用ReLU的NN整体还是非线性的。当每个神经元的操作域(operation region)是想相同的时,它是线性的。即当你对input只做小小的改变,不改变神经元的操作域,那NN就是线性的;但如果对input做比较大的改变,改变了神经元的操作域,这样NN就是非线性的了。
问题:ReLU不能微分呀?怎么做梯度下降呀?
答:当x>0时,ReLU微分就是1,当x<0时,ReLU微分就是0。而x的值一般不太可能恰好是0,所以不在意x=0时的微分值也没问题。
ReLU的变形
原本的ReLU在参数小于0时,因为梯度等于0,就停止了更新。为了让参数保持更新,可以适当改变ReLU在负轴的形态。(leaky ReLU, Parametric ReLU)
Maxout(ReLU是maxout的一种特例)
Maxout如何做到和ReLU一样的效果?
Maxout的激活函数可以是任意分片线性凸函数,分片数量取决于将多少个元素分为一组:
问题:Maxout网络怎么训练?
其实Maxout网络因为是从group里面选取值最大的元素,那么那些未被选中的neuron的贡献就可以看做是0,可以拿掉。那么Maxout也就称为一种类似于线性的激活函数(直接将输入值输出)。所以我们直接训练拿掉了未被选中的neuron后的”瘦长“网络就可以。
另外,不用担心这样会造成那些为被选中的neuron的参数无法被训练到,因为其实你每次输入的训练数据不同时,被选中的neuron也不同,所以终究而言,所有的neuron都是能被训练到的