1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
1.7 理解 Dropout Why does drop out work?
Dropout可以随机删除网络中的神经单元,他为什么可以通过正则化发挥如此大的作用呢?
上一节课已经介绍过,Dropout可以随机删除网络中的神经单元,每次迭代后,NN都比以前更小。采用一个较小的NN和使用正则化的效果是一样的。
1.单个神经元实施Dropout
我们从单个神经元入手。
如上图,这个单元的工作就是输入并生成一些有意义的输出。
现在通过dropout,该单元的输入几乎被消除,有时这两个单元会被删除,有时会删除其它单元。
也就是说,上图中中间的单元,它不能依靠任何特征,因为特征都有可能被随机清除,或者说该单元的输入都可能被随机清除。
我不愿意把所有赌注都放在一个节点上,不愿意给任何一个输入加上太多权重,因为它可能会被删除。因此该单元将通过这种方式积极地传播开,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和我们之前讲过的正则化类似,实施dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化。
事实证明,dropout是一种正则化的替代形式。
而L2对不同权重的衰减是不同的,它取决于倍增的激活函数的大小。
总结
dropout的功能类似于L2正则化,与L2正则化不同的是,被应用的方式不同,dropout也会有所不同,甚至更适用于不同的输入范围。
2.NN实施Dropout
上图是一个有3个输入特征的网络,每层分别由7,7,3,2,1个节点。有一个要选择的参数是keep-prob,它代表每一层上保留单元的概率。
实施dropout的另一个细节是,不同层的keep-prob也可以变化。
- 第一层权重矩阵W[1]维度3x7
- 第二层权重矩阵W[2]维度7x7
- 第三层权重矩阵W[3]维度7x3
- 第四层权重矩阵W[4]维度3x2
- 第五层权重矩阵W[5]维度2x1
W[2]是最大的权重矩阵,因为它拥有最大参数集,即7×7。
- 为了预防矩阵过拟合,第二层的keep-prob值应该相对较低,假设是0.5。
- 对于其它层,过拟合的程度可能没那么严重,它们的keep-prob值可能高一些,可能是0.7。
- 如果在某一层,我们不必担心其过拟合的问题,那么keep-prob可以为1。这意味着保留所有单元,并且不在这一层使用dropout。
keep-prob设置如下图
再次强调一下,对于有可能出现过拟合,且含有诸多参数的层,我们可以把keep-prob设置成比较小的值,以便应用更强大的dropout。有点像在处理L2正则化的正则化参数λ \lambdaλ,我们尝试对某些层施行更多正则化。
对于输入层,或者说第零层,从技术上讲,我们也可以应用dropout,这样有机会删除一个或多个输入特征,虽然现实中我们通常不这么做。
keep-prob=1,是非常常用的输入值,当然也可以是0.9,但是消除一半的输入特征是不太可能的。通常情况下,即使你对输入层应用dropout,那keep-prob也会接近于1。
总结
如果你担心某些层比其它层更容易发生过拟合
- 一个方案是,把某些层的keep-prob值设置得比其它层更低,缺点是为了使用交叉验证,你要搜索更多的超级参数
- 另一种方案是,在一些层上应用dropout,而有些层不用dropout,应用dropout的层只含有一个超级参数,就是keep-prob
3.两个使用Dropout的经验
dropout有两个实施过程中的经验。
- 经验1
实施dropout,在计算机视觉领域有很多成功的第一次。
计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,所以dropout在计算机视觉中应用得比较频繁。有些计算机视觉研究人员非常喜欢用它,几乎成了默认的选择。
但要牢记一点,dropout是一种正则化方法,它有助于预防过拟合,因此除非算法过拟合,不然不要使用dropout。所以dropout在其它领域应用得比较少。
- 经验2
dropout一大缺点就是J代价函数不再被明确定义,每次迭代,都会随机移除一些节点,所以很难double check梯度下降的性能。定义明确的代价函数每次迭代后都会下降,因为要优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制梯度下降曲线。
我通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减,然后再打开dropout函数。虽然我们并没有关于其他方法性能的数据统计,我觉得你也可以尝试其它方法,把它们与dropout方法一起使用。