深度学习中Dropout的笔记

1. Backgroud

dropout的产生源自于Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提到使用了dropout技术来使得一个比较复杂的前馈网络在比较小的数据集中,不再那么容易过拟合,从而提高了神经网络整体的性能。
需要注意的是,过拟合是一个在人工智能领域几乎无法回避的问题,所以新提出了这种可以防止过拟合的方法后,立刻就被人们讨论和分析。那么什么是dropout呢?

2. Definition

Dropout是训练深度神经网络的一种非常好用的trick。在定义了一个神经网络后,可以在指定阶段基于一定概率忽略其中一定比例的节点的方式提高整个网络的性能的一种方式。

2.1 工作流程

首先,例如我们要训练一个简单的神经网络(这里只是举例子,在实际工作过程中,结构可能很复杂)。
在这里插入图片描述
这个网络,原本的工作过程是:
1.我们把输入数据 ——张量X从网络的左端送入。
2.网络开始根据神经元的权重不断计算并沿着箭头方向向右传播。
3.最后汇总到最右侧两个神经元上后,根据输出的向量与实际标签结果计算一个损失(基于指定的损失函数)。
4.然后,基于损失,按照梯度的方向不断回馈给整个网络并反向传播。

但是!!! 如果使用dropout技巧,那么就需要对网络进行这样的改动:

  1. 对网络中的部分节点进行随机的隐藏,(这里的随机还是要基于特定的概率或者概率分布的),比如我找来的这张图就删除了一半的节点。
    在这里插入图片描述
  2. 同样将X从左侧输入,并从右侧汇聚。但是此刻使用的网络已经删掉了(掩蔽掉)一半的节点,所以,此刻如果反向传播,也只会更新那些没有删掉的节点
  3. 最后,像普通机器学习任务一样,不断循环,只是每一次都需要随机选择一些节点隐藏起来。

这里是引用
为什么说Dropout可以解决过拟合?
(1)取平均的作用: 先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。
(2)减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。
(3)Dropout类似于性别在生物进化中的角色:物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。

这个性别的概念我想解释一下:实际上,物种的繁衍有两种,一种是无性繁殖,另一种是有性繁殖。而无性繁殖就是简单的把自己的基因信息保存起来在繁殖的过程中保留给子辈,但是,事实上,有性繁殖这种基因的互相交叉才能更好的在自然界生存,这也是自然界自然选择的基本结论。而dropout有些类似这个想法,不断使用新的子网络来训练,从而帮助每种情况都能够很好的适应大数据这个“自然界”,从而提高鲁棒性。

还有一种观点认为 Dropout 实际上是在训练时进行了数据增强。一般认为,在线性空间中,学习一整个空间的特征集合就够了,但在非线性不连续空间中,学习若干个局部空间的特征集合会更好,这被称为特征稀疏性。而使用 Dropout 后,得到的是更多的局部特征,同等的数据量下,局部特征多了,区分性大了,稀疏性也就大了,这在数据量小的时候尤为有效。

最后需要讲的是,带有Dropout 层的神经网络只能在训练中使用,测试和实际使用时不能有 Dropout 操作,需要进行屏蔽。比如在pytorch中,就可以通过 net.eval() 语句和 net.train() 语句进行验证模式和训练模式的切换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值