有一种常用手段叫做dropout,也是用来防止过拟合的。
一 dropout原理
有一种常用的过拟合的方法叫dropout。dropout的意思是,在训练过程中,每次随机选择一部分节点不要去“学习”。
这样做得原理是什么?
因为从数据的分析来看,数据本身是不可能很纯净的,即任何一个模型不能100%把数据完全分开,在某一类中一定会有一些异常数据,过拟合的问题恰恰把这些异常数据当成规律来学习。对于模型来说,我们希望它能够有一定的“智商”,把异常的数据过滤掉,只关心有用的规律数据。
异常数据的特点是,它与主流样本中的规律都不同,但是量非常少,相当于在一个样本中出现的概率比主流数据出现的概率低很多。我们就是利用这个特性,通过在每次模型中忽略一些节点的数据学习,将小概率的异常数据获得学习的机会降低,这样这些异常数据对模型的影响就会更小了。
注意:由于dropout让一部分节点不去“学习”,所以在增加模型的泛化能力的同时,会使学习速度降低,是模型不太容易“学成”,所以在使用的过程中需要合理地调节到底丢弃多少节点,并不是丢弃的节点越多越好。
二 TensorFlow中的dropout
在TensorFlow中dropout的函数原型如下:
def dropout(x,keep_prob,noise_shape=None,seed=None,name=None)
其中参数的含义如下:
x:输入的模型节点
keep_prob:保持率。如果为1,则代表全部进行学习;如果为0.8,则代表丢弃20%的节点,只让80%的节点去学习。
noise_shape:代表指定的x中,哪些维度可以使用dropout技术。为None时,表示所有维度都使用dropout技术,也可以将某个维度标志位1,来代表该维度使用dropout技术。例如:x的形状为[n,len,w,ch],使用nose_shape未[n,1,1,ch],这表明会对x中的第二维度len和第三维度进行drop。
seed:随机选取节点的过程中随机数种子值。
注意:drop改变了神经网络的结构,它仅仅是属于训练时的方法,所以一般在进行测试时,要将dropout的keep_prob变为1,代表不需要进行丢弃,否则会影响模型的正常输出。