吴恩达深度学习第二章第一周——Dropout正则化的个人理解

学习了吴恩达机器学习第二章改善深层神经网络:超参数调试、正则化以及优化的第一周之后发现对其中的部分知识仍然不是很理解,因此打算对其中的一些难点重新去整理。又因为所有的内容太多,所以这边我打算只做难点的整理。

1) Dropout("随机失活") 操作过程

  • 1.每层每个节点以某一概率(这里以50%为例)被选中为需要删除的节点(如下图中标上X的节点)

  • 2.被选中为删除的节点,不仅要删除节点,与之相连的线段也要删除,如下图示

  • 3.使用反向传播算法对精简后的神经网络进行权重更新计算
  • 4.恢复被删节点,然后循环往复上面的步骤,直到得到我们想要的结果。

2) 最常用实现方法--反向随机失活(Inverted Dropout)

为方便说明我们假设需要计算的是3层神经网络,其中令

  • 保留节点的概率keepProb=0.8
  • a3表示三层网络各节点的值, a3=[a[1],a[2],a[3]]
  • d3表示一个三层的dropout向量,其维度与a3相同,用python实现如下:
keepProb = 0.8
# d3元素值为True或False
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keepProb
# 在相乘运算时,python会自动将True转化为1,False转化为0
# 所以可以选出概率大于keepProb的节点继续留下来进行计算
a3 = np.multiply(a3, d3)
a3 /= keepProb

对其中的最后一行做出解释:

我们假设网络的隐藏层,即a[2]有50个units,那么按照keepProb=0.8可以知道需要删除10个units,也就是说a[2]会减少20%,那么我们在计算下一层,即z[3]=w[3]a[2]+b[3时就会使得z[3]的期望值(均值)发生变化,为了不影响z[3]的期望值,我们需要用w[3]a[2]÷0.8来修正或弥补我们所需的20%。

注意点;

1.另外需要注意的是在测试阶段,我们不需要再使用dropout,而是像之前一样直接将各层的权重,偏差带入计算出预测值即可。

2.上面所提到的keepProb也可以是跟着各层节点数变化的

 

上面是对Dropout的定义的介绍,接下来就是个人对Dropout的理解。

为什么他能解决过拟合的问题,我觉得原因有两点。

第一点,取平均的作用

就拿普通的模型作为例子,普通的模型怎么防止过拟合问题,他可以通过用相同的训练数据训练5个不同的神经网络。然后对于任何一组测试,我们都用五个神经网络去测试,然后得到5个结果,此时我们采用投票取胜的方式,哪个结果出现的次数多,哪个结果大概率就是一个正确的结果。这种“综合起来求平均”的策略可以有效防止过拟合问题的发生。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。

dropout去掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

第二点,减少神经元之间复杂的共适应关系。

 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。 迫使网络去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。

举个例子,就不如说一个结果是有十个结点共同决定的,有一个结点是perfect结点,他的取值是刚刚好的,而另外的结点的取值还需要调整。这个时候网络的输出层往回传递误差,这10个节点都不知道自己现在的取值是不是合适,都以为这个误差是十个结点共同导致的,从而导致一种不好的变化。perfect结点以为自己不够好,更新自己的值,导致自己变差,而坏的结点以为是十个结点共同决定的,对自己认识不够充分,所以使得自己的改变会实际上需要进行的改变产生差别。

所以我们的目的,就是想让perfect结点不去改变,让他保留他的值,而让那些差的结点深刻的认识到自己的错误,进行较大的改变。

由于这是一种理想的状态,我们无法去区分哪些是perfect结点,哪些是坏的结点,所以我们干脆去随机划分。将一部分结点划分开来,让他们不参与到运算中去,只对剩下的一部分进行值的更新。这样就会有两个好处,首先,如果划分出去的是好的结点,那么他这个好的值就会被保留,如果划分出去坏的结点,这会使得工作的结点的误差变小,能使他们尽快的蜕变成perfect结点。

所以这样网络的训练效果就提高了。

 

你可能感兴趣的:(机器学习,机器学习)