Dropout含义
dropout含义就是在一个神经网络中,每个隐藏层都有一个概率,是用来判断节点保留或者消除的,将一个大的神经网络通过消除节点变为一个小的神经网络,防止过拟合的发生。如下图所示,每个隐藏层节点是否保留的概率都是0.5。
对一个样本训练时,消除一些节点后如下:
其他样本训练时同样是通过概率判断是否消除每个节点。
Dropout实施方法–Inverted dropout(反向随机是活)
假设当前是一个三层的神经网络l=3,keep-prob = 0.8。
首先初始化一个d3矩阵,d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep-prob,a3代表某一层输出的维度(第一维代表当前层节点数量,第二维代表样本数量),d3是和a3相同维度的一个01矩阵,每一列代表当前层每个节点是否保留,行代表每个样本。
然后将失活的节点输出清除a3 = np.multiply(a3,d3),multiply函数代表元素乘积,两个矩阵的对应位置元素相乘。通过这个算法后就会把一部分a3的值变为0,也就是将节点消除了。
最后对a3执行a3/=keep-prob,执行这一步的原因是,当前我们的保留率为0.8,假设当前层有50个节点,那么就会与10个节点被移除,为了保证a3的期望值保持在一个范围内,需要a3/=keep-prob。为什么需要a3的期望保持在一个范围内呢,因为这会使得测试的时候变得简单,没有增加额外的缩放问题。
在测试阶段时,不需要使用dropout,因为测试阶段我们希望输出的结果是确定的,而不是随机的,如果使用了dropout,对于每一个测试样本的预测结果都是不确定的。
为什么dropout有效?
1,直观来看,dropout会让一些结点随机失活,使用一个较小的神经网络进行训练,在效果来看和正则化效果是一样的。
2,从单个神经元来看,对于下图的右侧神经元,dropout会使删除一部分输入,这样做的意义是让右侧节点不要去依赖任何一个特征,因为它随时可能被清除,要去全局考虑所有特征,这样就不会有过大的权重,以此来防止过拟合。同时由于权重都比较小,右侧节点的值也会很小,右侧节点通过这种方式能够积极的传播开,这与L2正则化结果一致,dropout的结果也是压缩权重。
使用范围
dropout主要应用于计算机视觉领域,因为通常图片数据可能不足。此外除非发生了过拟合,一般情况下不用dropout。
dropout缺点
使用dropout会让代价函数J不再有明确的定义,当出现梯度下降出现问题后,很难去检查到底哪里出现了梯度问题,而定义明确的代价函数J每次都是迭代下降的。因此可以将keep-prob先设置为1,然后确保J是单调递减的,再打开dropout。