除了L2正则化,还有一个非常实用的正则化方法——dropout(随机失活),我们看一下它的工作原理。

假设你在训练上图这样的神经网络,它存在过拟合,这就是dropout所要处理的,我们复制这个神经网络,dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,假设网络中每一层每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是0.5,设置完节点概率,我们会消除一些节点,然后删除从该结点进出的连线,最后得到一个节点更少,规模更小的网络,然后使用backprop方式进行训练,这是网络节点精简后的一个样本。

对于其它样本,我们照旧以抛硬币的方式设置概率,保留一类节点集合,删除其它类型的节点集合。对于每个训练样本,我们都将采用一个精简后的神经网络来训练它,这种方法似乎有点怪,单纯遍历节点,编码也是随机的,可它真的有效。不过可想而知,我们针对每个样本训练规模极小的网络,最后你可能会认识到为什么要正则化网络,因为我们在训练极小的网络,如何实施dropout呢?

方法有几种,接下来要讲最常用的,即inverted dropout(反向随机失活),出于完整性考虑,我们用一个三层(l=3)(l=3)(l=3)网络来举例说明,编码中会有很多涉及到3的地方,这里只举例说明如何在某一层中实施dropout,首先要定义向量d,d3d^3d3表示一个三层的dropout向量,d3=np.random.rand(a3.shape[0],a3.shape[1])<keep−probd^3=np.random.rand(a3.shape[0],a3.shape[1])<keep-probd3=np.random.rand(a3.shape[0],a3.shape[1])<keep−prob,其中keep-prob是一个具体数字,上个示例中它是0.5,这里是0.8,它表示保留某个隐藏单元的概率,0.8意味着消除任意一个隐藏单元的概率是0.2,它的作用就是生成随机矩阵。如果对a3a3a3进行因子分解,效果也是一样的,d3d3d3是一个矩阵,每个样本和每个隐藏单元,其在d3d3d3中的对应值为1的概率都是0.8,其对应值为0的概率是20%。随机数字小于0.8,它等于1的概率是0.8,等于0的概率是0.2,。

接下来要做的就是从第三层中获取激活函数,这里我们叫它a3a3a3,a3a3a3含有要计算的激活函数,a3=np.multiply(a3,d3)a3 = np.multiply(a3,d3)a3=np.multiply(a3,d3),这里是元素相乘,也可以写成a3∗=d3a3 *= d3a3∗=d3,它的作用就是过滤d3d3d3中所有等于0的元素,而各个元素等于0的概率只有20%,乘法运算最终把d3d3d3中相应的元素归零。

如果用python实现该算法的话,d3d3d3是一个布尔型数组,值为True和False,而不是1和0。乘法运算依然有效,python会将true和false翻译为1和0,。

最后我们向外扩展a3a3a3,用它除以0.8或者除于keep-prob参数,下面解释一下为什么要这样做。

为方便起见,假设第三隐层上有50个单元或者50个神经元,我们通过因子分解将它拆分为(50∗m)(50*m)(50∗m)维的,保留和删除它们的概率分别是80%和20%。这也意味着,最后被删除或归零的单元平均有10个。

现在我们看一下z[4]z^{[4]}z[4],z[4]=w[4]∗a[3]+b[4]z^{[4]}=w^{[4]}*a^{[3]}+b^{[4]}z[4]=w[4]∗a[3]+b[4],我们的预期是a[3]a^{[3]}a[3]减少20%,也就是a[3]a^{[3]}a[3]中有20%的元素被归零,为了不影响z[4]z^{[4]}z[4]的期望值,我们需要用w[4]∗a[3]/0.8w^{[4]}*a^{[3]}/0.8w[4]∗a[3]/0.8,这将会修正或者弥补我们所需的那20%,a[3]a^{[3]}a[3]的期望值不会变。

a[3]/=keep−proba^{[3]}/=keep-proba[3]/=keep−prob就是所谓的dropout方法,它的功能是不管keep-prob的值是多少,反向随机失活(inverted dropout)方法通过除以keep-prop确保a[3]a^{[3]}a[3]的期望值不变。

事实证明,在测试阶段,当我们评估一个神经网络时,也就是用反向随机失活方法使得测试阶段变得更容易,因为它的数据扩展问题变少。

目前实施dropout最常用的方法就是inverted dropout。dropout早期的迭代版本都没有除于keep-prob,所以在测试阶段,平均值会变得越来越复杂。

现在你使用的是d向量,你会发现,不同的训练样本,清除不同的隐藏单元也不同。实际上,如果你通过相同训练集多次传递数据,每次训练数据的梯度不同,则随机对不同隐藏单元归零。有时却并非如此,比如需要将相同隐藏单元归零,第一次迭代梯度下降时,把一些隐藏单元归零;第二次迭代梯度下降时,也就是第二次遍历训练集时,对不同类型的隐层单元归零,向量d或者d3用来决定第三层中哪些单元归零。无论用foreprop还是backprop。

如何在测试阶段训练算法,在测试阶段,我们已经给出了x或是想预测的变量,用的是标准计数法,用a[0]a^{[0]}a[0],第0层的激活函数标注为测试样本x,我们在测试阶段不使用dropout函数。因为在测试阶段进行预测时,我们不期望输出结果是随机的,如果测试阶段应用dropout函数,预测会受到干扰。理论上,你只需要多次运行预测处理过程,每一次不同的隐藏单元会被随机归零,预测处理遍历它们,但是计算效率低,得出的结果也几乎相同。

inverted dropout函数在除于keep-prob时可以记住上一步的操作,目的是确保即使在测试阶段不执行dropout来调整数值范围,激活函数的预期结果也不会发生变化,所以没必要在测试阶段额外添加尺度参数。

深度学习的实用层面 —— 1.6 Dropout正则化相关推荐

  1. 深度学习的实用层面 —— 1.8 其它正则化方法

    除了L2正则化和随机失活(dropout正则化),还有几种方法可以减少神经网络中的过拟合. 假设你正在拟合猫咪图片分类器,如果你想通过扩增训练数据来解决过拟合,但扩增训练数据代价高,而且有时候我们无法 ...

  2. 深度学习的实用层面 —— 1.5 为什么正则化可以减少过拟合

    通过两个例子来直观体会一下,左图是高偏差,右图是高方差,中间是刚刚好.现在我们看一下这个庞大的深度拟合神经网络,这是神经网络的代价函数J(w[l],b)=1m∑i=1mL(y^[i],y[i])J(w ...

  3. 吴恩达深度学习的实用层面编程作业:正则化Regularization

  4. 吴恩达深度学习笔记5-Course2-Week1【深度学习的实用层面】

    改善深层神经网络:超参数调试.正则化以及优化 深度学习的实用层面 一.训练.验证.测试集 样本数据分成以下三个部分: 训练集(train set): 用于对模型进行训练. 验证集(hold-out c ...

  5. 3.深度学习的实用层面

    第一周:深度学习的实用层面 项目进展得一个关键性得因素就是划分高质量得训练集,验证集,测试集.这有助于提高循环迭代得效率.验证集也称为development set 也称为dev set. 验证集主要 ...

  6. 吴恩达【优化深度神经网络】笔记01——深度学习的实用层面

    文章目录 引言 一.训练集/验证集/测试集(Train/Dev/Test sets) 1. 数据集选择 2. 补充:交叉验证(cross validation) 二.偏差和方差(Bias/Varian ...

  7. 吴恩达老师深度学习视频课笔记:深度学习的实用层面

            训练.验证和测试数据集(training.development and test sets):训练神经网络时,我们需要作出很多决策,如神经网络分多少层(layers).每层含有多少个 ...

  8. 吴恩达《优化深度神经网络》精炼笔记(1)-- 深度学习的实用层面

    AI有道 不可错过的AI技术公众号 关注 吴恩达的深度学习专项课程的第一门课<神经网络与深度学习>的所有精炼笔记我已经整理完毕.迷路的小伙伴请见文章末尾的推荐阅读: 在接下来的几次笔记中, ...

  9. Coursera吴恩达《优化深度神经网络》课程笔记(1)-- 深度学习的实用层面

    红色石头的个人网站:redstonewill.com Andrew Ng的深度学习专项课程的第一门课<Neural Networks and Deep Learning>的5份笔记我已经整 ...

最新文章

  1. css之文本两端对齐的两种解决方法
  2. 低秩矩阵的应用--背景建模
  3. 机器人加锤石如何放技能q_ADC必须会躲4个技能,前两个训练走位,能躲图4的只有闪现!...
  4. error LNK2001: unresolved external symbol QtCored.lib using staic Qt lib
  5. linux nfs 配置_centos7 NFS 配置
  6. [原创]软件测试工具简介及下载地址(不定时更新)
  7. Java技术专题之JVM逻辑内存回收机制研究图解版
  8. macOS Sierra 10.12.6 odoo 10.0 开发环境配置
  9. python的函数的笔记_Python笔记-函数1
  10. 绘制confusion matrix的R实现
  11. 【毕业设计】46-基于单片机的智能卫浴系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)
  12. 吴恩达深度学习学习笔记——C1W2——神经网络基础——练习题
  13. Python玫瑰花绘制
  14. ElasticSearch 狂神说
  15. 2.002 tensorflow做矩阵乘法
  16. ECharts 区域缩放组件使用详解
  17. EXCEL2016下将身份证号这列重复项用背景颜色突显
  18. python学习-Dya13-函数
  19. android 4.0 安全模式分析
  20. 如何使用parted划分2bt以上磁盘

热门文章

  1. ARP病毒***症状
  2. 【原创】使用yahoo雅虎js库(YUI)建立无刷新的N级树(可添加删除节点)
  3. 面试精讲之面试考点及大厂真题 - 分布式专栏 04 谈谈你对分布式的理解,为什么引入分布式?
  4. 面试官系统精讲Java源码及大厂真题 - 15 CopyOnWriteArrayList 源码解析和设计思路
  5. REST API 概念的简单介绍
  6. php 取字符串的数字,php提取字符串中的数字
  7. 保姆级教程!手把手教你使用Longhorn管理云原生分布式SQL数据库!
  8. 【模块化开发】之 模块化概述
  9. svg 自己做动画图片 GSAP真的好用
  10. 【Java】判断某值是否在数组中,使用Arrays类