美文网首页
深度学习之dropout

深度学习之dropout

作者: ltochange | 来源:发表于2021-05-24 21:51 被阅读0次

    dropout原始论文

    为了防止训练过拟合,在训练过程中随机丢弃一部分输出(有的文章说随机丢弃掉一些神经元) 在这里插入图片描述
    左图不使用dropout

    对于第l层的输出{y}_{i}^{l},直接进行线性变化,然后经过激活函数,得到第l+1层的输出{y}_{i}^{l+1}

    \begin{aligned} z_{i}^{(l+1)} &=\mathbf{w}_{i}^{(l+1)} {y}_{i}^{l}+b_{i}^{(l+1)}\end{aligned}

    \begin{aligned} y_{i}^{(l+1)} &=f\left(z_{i}^{(l+1)}\right)\end{aligned}

    右图使用dropout

    先按照伯努利分布,概率为p采样,得到r_{i}^{(l)}, 与第l层的输出{y}_{i}^{l}维度相同。两者对应位置相乘,对{y}_{i}^{l}中的部分位置置0,得到dropout后的 \widetilde{{y}}_{i}^{l}. 最后进行线性变化,经过激活函数,得到第l+1层的输出{y}_{i}^{l+1}

    \begin{aligned} r_{i}^{(l)} & \sim \operatorname{Bernoulli}(p) \end{aligned}

    \begin{aligned}\widetilde{{y}}_{i}^{(l)} &={r}_{i}^{(l)} * \mathbf{y}_{i}^{(l)}\end{aligned}

    \begin{aligned} z_{i}^{(l+1)} &=\mathbf{w}_{i}^{(l+1)} \widetilde{\mathbf{y}}_{i}^{l}+b_{i}^{(l+1)}\end{aligned}

    \begin{aligned} y_{i}^{(l+1)} &=f\left(z_{i}^{(l+1)}\right)\end{aligned}

    实现代码

    import numpy as np
    
    def dropout(x, prob):
        if prob < 0. or prob >= 1:  # prob概率值,在0~1之间
            raise Exception('Dropout prob must be in interval [0, 1[.')
        retain_prob = 1. - prob
        # 通过binomial函数,生成与x一样的维数向量
        sample = np.random.binomial(n=1, p=retain_prob, size=x.shape)
        # 二项分布,当n=1时,即为伯努利分布
        # 即将生成一个0、1分布的向量,0表示丢掉对应位置x的数值
        print(sample)
        x *= sample
        print(x)
        x /= retain_prob
        # infer时不进行dropout,从而保持输出的结果稳定
        return x
    
    x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=np.float32)
    y = dropout(x, 0.4)
    print(y)
    

    个人理解

    其中,代码第14行 x /= retain_prob 是对原始的x进行rescale,那么为什么要进行 rescale呢?可能是为了保持训练和测试的时候网络输出的期望一致

    假设丢弃概率是p, 原始论文中的dropout(vanilla版本)在测试时做rescale

    • 训练时,使用dropout,对于网络中的某个输出值x,期望变为 (1-p)x+p0=(1-p)x
    • 为了保持测试过程(没有dropout)期望一致,在测试时,对于相应层输出乘以1-p

    inverted 版本,在训练时做rescale

    • 训练时,使用dropout,对于网络中的某个输出值x,期望变为 (1-p)x+p0=(1-p)x
    • 为了保持测试过程(没有dropout)期望一致,在训练时, 对包含dropout的输出乘1/(1-p), 使得期望仍然为1/(1-p)*(1-p)x = x,即代码中所使用的方法。从而保证测试时不需要对代码进行修改

    参考

    https://blog.csdn.net/hjimce/article/details/50413257

    相关文章

      网友评论

          本文标题:深度学习之dropout

          本文链接:https://www.haomeiwen.com/subject/ojefsltx.html