本系列为darknet源码解析,本次解析src/dropout.h 与 src/dropout.c 两个。
在神经网络中应用dropout包括训练和预测两个阶段,在训练阶段,dropout 以一定的概率p随机的"舍弃"一部分神经元点,即这部分神经元节点暂时停止工作,如下图所示。因此,对于一个包含N个节点的神经,在dropout的作用下可看作2^N个模型的集成。这2^N个模型可以看成原始网络的子网络,它们共享部分权值,并且具有相同的网络层数,并且整体的参数数目保持不变,这就大大简化了运算。减少了模型过拟合的风险,增强了模型的泛化能力。
在测试阶段,在前向传播的计算时,每个神经元的输出结果要预先乘以概率1-p,为什么要乘以1-p呢???因为在训练的时候只有占比(1-p)的神经元节点参与了训练,那么在测试阶段,所有的神经元节点都参与计算,则得到结果要比训练时平均要大 1/(1-p), 为了避免发生这种情况,就需要神经元输出结果乘以1-p,使得下一层输入规模保持不变。
在darknet源码中采用了inverted dropout, 为什么要采用inverted dropout呢?其实就是为了避免在测试阶段,不需要做额外的操作。那么怎么解决这个问题,就是直接将dropout后每个神经元的输