Igor

专注机器学习

神经网络之Dropout

1、前言

    前面学习了神经网络的L2正则化,作为避免过拟合的方法,Dropout也非常流行,使用极其广泛。按照吴恩达的描述,Dropout在神经网络中的表现要优于L2正则化。

    Dropout的实际做法也很简单,甚至比L2正则化更加简单,因为它没有用到求导的知识,知识用到了简单的矩阵Element-wise乘法。具体思想是:对于所有隐藏层,按照某个概率keep_prob保留神经元,而其他的都Drop掉不要,从而降低网络的复杂度。

2、实现方法

    前向传播

    设l层神经网络的输出为Al,生成一个[0,1)、形状和Dl相同的随机数矩阵:

    Dl = np.random.rand(Al.shape[0], Al.shape[1])                    
    Dl = np.int64(Dl < keep_prob)  

    将小于keepprob的数设为1,其他的设为0

    然后:

    Al = np.multiply(Al, Dl)      # 把Dl为0的那些神经元删除了                   

    Al = Al / keep_prob     

    Al除以keep_prob是为了让Al的和基本保持不变,这样在计算损失时候就和原来没有使用Dropout的相当了

    反向传播

    反向传播时候的做法类似,前面是删除了Al中的部分神经元,那反向传播时候肯定就不能考虑哪些神经元了,所以要把对应的dAl删除

    dAl = np.multiply(dAl, Dl)             

    dAl = dAl / keep_prob 

    这里的Dl和前向传播对应layer使用的必须一样。这里dAl依然需要除以keep_prob让后面的计算中与不Drop时候相当

3、小结

    Dropout实现简单,效果显著,目前发现在神经网络中使用较多。同样需要多调一个超参数keep_prob 

阅读更多
个人分类: 机器学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

神经网络之Dropout

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭