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,我的评价是最好自己想想)
这次真的简单, 但是要开始卷积网络了, 算是暴风雨前得宁静把
标签:CS231N,assignment,dropout,mask,mode,dx,拟合,隐含 From: https://www.cnblogs.com/360MEMZ/p/17314268.html