【前言】Drop Path是NAS中常用到的一种正则化方法,由于网络训练的过程中常常是动态的,Drop Path就成了一个不错的正则化工具,在FractalNet、NASNet等都有广泛使用。
Dropout
Dropout是最早的用于解决过拟合的方法,是所有drop类方法的大前辈。Dropout在12年被Hinton提出,并且在ImageNet Classification with Deep Convolutional Neural Network工作AlexNet中使用到了Dropout。
原理 :在前向传播的时候,让某个神经元激活以概率1-keep_prob(0<p<1)停止工作。
功能 : 这样可以让模型泛化能力更强,因为其不会过于以来某些局部的节点。训练阶段以keep_prob的概率保留,以1-keep_prob的概率关闭;测试阶段所有的神经元都不关闭,但是对训练阶段应用了dropout的神经元,输出值需要乘以keep_prob。
具体是这样的:
假设一个神经元的输出激活值为
a
,在不使用dropout的情况下,其输出期望值为a
,如果使用了dropout,神经元就可能有保留和关闭两种状态,把它看作一个离散型随机变量,它就符合概率论中的0-1分布,其输出激活值的期望变为p*a+(1-p)*0=pa
,此时若要保持期望和不使用dropout时一致,就要除以p
。
作者:种子_fe
链接:https://www.imooc.com/article/30129
实现 : pytorch中的实现如下。
class _DropoutNd(Module):
__constants__ = ['p', 'inplace']
p: float
inplace: bool
def __init__(self, p: float = 0.5, inplace: bool = False) -> None:
super(_DropoutNd, self).__init__()
if p < 0 or p > 1:
raise ValueError("dropout probability has to be between 0 and 1, "
"but got {}&#