CS231N assignment 2#3 _ dropout 学习笔记 & 解析

发布时间 2023-04-13 14:00:26作者: 360MEMZ

dropout

定义 & 作用 & 基本实现

如课程所说,dropout最大的意义在于防止过拟合. 我们还记得, dropout在网络架构上介于激活函数之后, 下一层输入之前. 想法很简单, 就是将隐含层的某些数据屏蔽掉, 直接从以输入到下一层, 概率为p. 

需要注意的是, dropout是仅针对训练而言的,测试不能dropout, 所以为了保证规模近似, 需要确保矩阵均值不变, 所以dropout下还要乘1/p.

这样我们就知道了代码:

    if mode == "train":
        mask = (np.random.rand(*x.shape)<p)/p # 生成0,1rand, 随后利用<p来随机剔除
        out = x*mask         
    elif mode == "test":
        out = x        

而在反向当中, 很显然就是没有被dropout的正常, 而dropout得梯度直接为0, 相当直接乘mask, 所以结果如下:

    if mode == "train":
        dx = dout * mask
    elif mode == "test":
        dx = dout

需要注意的是, 原本代码中指定了rand得seed,保证每次推进得结果是可复现的.

下面是效果:

我们就能看出, 加入dropout之后, 虽然训练集表现收敛变慢, 但是验证集却差别不大甚至有所上升, 表明拟合效果能更好.

问题 & 解答

答: 为了保证均值一致, 如果不做p, 则需要在测试集*p. 

答: 既然隐含层本身就是控制拟合属性之一, 如果减少隐含层元素, 则不是很容易过拟合, 需要降低dropout淘汰参数, 增大p. (不知为啥很多博客都在说瞎话要减小p,我的评价是最好自己想想)

这次真的简单, 但是要开始卷积网络了, 算是暴风雨前得宁静把