Tips for deep learning
上面的步骤我们都非常熟悉了,定义模型,评估模型,选择最好的function,得到神经网络,检查在训练集中的表现,然后检查在测试集中的表现。
-
为什么要做训练集的检查?
在传统机器学习中,通常在训练集都会表现得比较好,但是在神经网络中,不一定会表现得好,有可能陷入了局部最优,这是需要回头检查哪个步骤出了什么问题,你可以做什么样的修改,在training set得到好的结果。 -
为什么要做测试集检查?
假如说你在training set得到了一个好的performance了,然后再把neural network放在你的testing data,testing set的performance才是我们关心的结果。在trainingdata获得好的performance的前提下,testingdata\color{red}{在training data获得好的performance的前提下,testing data}在trainingdata获得好的performance的前提下,testingdata上表现的不好,才是overfitting\color{red}{上表现的不好,才是overfitting}上表现的不好,才是overfitting
有时候我们不能认为问题都是overfitting,这里有个例子:
例如,单看右图时,在testing data上,56层的error rate要比20层的要高,这个时候,你就可以说56层因为参数过多,所以overfitting了吗?在神经网络中这样直接判断是错误的\color{red}{错误的}错误的!!!你必须先检查一下你的training data上的结果。
看回左图,明显看到56层的performance是比20层差的,在做神经网络的时候,其实会有很多问题导致你train得不好,例如局部最优,56层可能卡在局部最优得地方,所以表现才这么差,所以56层并没有overfitting,只是在train的时候,已经出问题了。
- 有人会问,那56层这个神经网络算是underfitting吗?
对Underfitting的理解是这个model的参数不够多,所以model的能力不足以解决这个问题。
其实也不算是,因为56层的参数肯定是比20层多的,你20层能做得好的事情,50层会可能做不好吗? 50层都已经包括了20层所有的参数,还添加了额外的参数,从理论上说,50层必然比20层表现得好的。
- 当你看到一个方法,你要知道它要解决什么样的问题?
例如dropout,dropout是在training data表现好,testing data上表现不好的时候才会去使用,当training data 结果就不好的时候用dropout 往往会越训练越差。
【随机失活(dropout)在学习过程中通过将隐含层的部分权重或输出随机归零,降低节点间的相互依赖性,从而实现神经网络的正则化,降低其结构风险】
如何解决神经网络遇到的问题?
下面将会针对training表现不好的这方面,给出一些修改建议
1.改变激活函数
当training 的结果不好,你可以思考一下,是否你的Network的架构有问题?activation function不适用?
在2006年以前,如果将网络叠很多层,往往会得到上图的结果。上图,是手写数字识别的训练准确度的实验,使用的是sigmoid function。可以发现当层数越多,训练结果越差,特别是当网络层数到达9、10层时,训练集上准确度就下降很多。但是这个不是当层数多了以后就overfitting,因为这个是在training set上的结果。
梯度消失Vanishing Gradient
在神经网络的layer比较深的时候,会出现梯度消失现象。