深度学习的实用层面 —— 1.6 Dropout正则化

除了L2正则化,还有一个非常实用的正则化方法——dropout(随机失活),我们看一下它的工作原理。
在这里插入图片描述
假设你在训练上图这样的神经网络,它存在过拟合,这就是dropout所要处理的,我们复制这个神经网络,dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,假设网络中每一层每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是0.5,设置完节点概率,我们会消除一些节点,然后删除从该结点进出的连线,最后得到一个节点更少,规模更小的网络,然后使用backprop方式进行训练,这是网络节点精简后的一个样本。
在这里插入图片描述
对于其它样本,我们照旧以抛硬币的方式设置概率,保留一类节点集合,删除其它类型的节点集合。对于每个训练样本,我们都将采用一个精简后的神经网络来训练它,这种方法似乎有点怪,单纯遍历节点,编码也是随机的,可它真的有效。不过可想而知,我们针对每个样本训练规模极小的网络,最后你可能会认识到为什么要正则化网络,因为我们在训练极小的网络,如何实施dropout呢?

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

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

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

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

为方便起见,假设第三隐层上有50个单元或者50个神经元,我们通过因子分解将它拆分为 ( 50 ∗ m ) (50*m) (50m)维的,保留和删除它们的概率分别是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.8 w^{[4]}*a^{[3]}/0.8 w[4]a[3]/0.8,这将会修正或者弥补我们所需的那20%, a [ 3 ] a^{[3]} a[3]的期望值不会变。

a [ 3 ] / = k e e p − p r o b a^{[3]}/=keep-prob a[3]/=keepprob就是所谓的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来调整数值范围,激活函数的预期结果也不会发生变化,所以没必要在测试阶段额外添加尺度参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值