吴恩达第二门-改善深层神经网络-第一周6-10学习笔记

本文详细介绍了深度学习中两种重要的正则化方法——Dropout和归一化输入。Dropout通过随机失活神经元来防止过拟合,而归一化输入则加速训练过程,通过零均值化和方差归一化使代价函数更易优化。此外,文章还提及数据扩增和早停法作为正则化手段,以及梯度消失/梯度爆炸现象及其影响。
摘要由CSDN通过智能技术生成

吴恩达第二门-改善深层神经网络-第一周6-10学习笔记

1.6Dropout正则化

在之前的课程中,我们学习了L2正则化方法,但实际上正则化方法并不是只有L2正则化一种,在本节视频中我们将学习一种新的正则化方法——Dropout(随机失活法)。
在这里插入图片描述

什么是Dropout正则化?

正则化方法可以用于处理模型的过拟合现象,所谓的随机失活法就是让每个神经元发生随机的失活现象,dropout会遍历网络的每一层,并设置消除神经网络中节点的概率。
举个例子,在下图中,我们对原神经网络使用了dropout法,我们将每个神经元的消除概率都设为0.5,那么会有一些点被消除掉,消除这些点的同时,我们将与被消除神经元有关的连线都去掉,就得到了一个节点更少,规模更小的神经网络。
在这里插入图片描述
在这里插入图片描述
之后我们就可以对这个经过精简的,更小的神经网络使用反向传播算法进行训练。对每个训练样本都可以放到这个精简后的神经网络中训练。这种方法看似有些奇怪,单纯遍历节点,编码也是随机的,可它真的有效。

如何实施Dropout方法?

本节课主要介绍了一种最常用的方法,inverted dropout(反向随机失活)方法。
这里老师举了一个三层神经网络的例子。
在这里插入图片描述
我们先定义 d [ 3 ] d^{[3]} d[3]为一个三层的dropout向量,然后再设置一个keep-prob值,表示保留某个隐藏单元的概率。此处keep-prob等于0.8,它意味着消除任意一个隐藏单元的概率是0.2。让d3小于这个值,完成对d3矩阵的初始化操作,其中d3矩阵中每个数为0的概率为0.2,为1的概率为0.8。
图中的 a [ 3 ] a^{[3]} a[3]中包含了第三层的激活函数,更新 a [ 3 ] a^{[3]} a[3]的值,a3=np.multply(a3,d3),这里是矩阵之间的元素相乘操作,也可以写成a3*=d3。相乘之后我们得到的新的 a [ 3 ] a^{[3]} a[3]中就有%20的部分由0构成,即这部分参数失效。
最后我们要将 a [ 3 ] a^{[3]} a[3] 除以一个keep-prob的值。
如果用python实现该算法的话,d3会是一个布尔型数组,值为true和false,而不是1和0,乘法运算依然有效,python会把true和false翻译为1和0。

我们最后为甚要再除以一个keep-prob的值呢?

假设第三隐藏层上有50个隐藏神经元,在一维上 a [ 3 ] a^{[3]} a[3]是50,我们通过因子分解将它拆分成50*m维的,保留和删除它们的概率分别为80%和20%,这意味着最后被删除或归零的单元平均有10(50×20%=10)个,现在我们看下 z [ 4 ] z^{[4]} z[4],,我们的预期是, a [ 3 ] a^{[3]} a[3]减少20%,也就是说中 a [ 3 ] a^{[3]} a[3]有20%的元素被归零,我们将得到的 a [ 3 ] a^{[3]} a[3]除以一个keep-prob值后,其期望前后不发生改变。Dropout早期的迭代版本都没有除以keep-prob,所以在测试阶段,平均值会变得越来越复杂,不过那些版本已经不再使用了。
在这里插入图片描述
一般来说,我们在测试阶段不使用dropout,因为在测试阶段进行预测时,我们不期望输出结果是随机的,如果测试阶段应用dropout函数,预测会受到干扰。

1.7理解dropout

上一节视频中我们学习了什么是dropout,但为什么dropout方法有着如此巨大的作用呢?
直观上理解:dropout方法不需要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和之前讲的L2正则化类似;实施dropout的结果使权重被压缩,并完成一些预防过拟合的外层正则化。
在这里插入图片描述
如果从单个神经元入手分析,如上图所示,用紫色圈起来的这个单元,它没有特征可以依靠,因为特征都有可能被随机清除,或者说该单元的输入也都可能被随机清除。任何一个输入上都不会被赋予太多的权重,因为任何一个输入都有可能会被删除,该单元将通过这种方式积极地传播开,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和我们之前讲过的 L 2 L2 L2正则化类似,实施dropout的结果是它会压缩权重,并起到预防过拟合的外层正则化效果。
实际上,在设置keep-prob值的时候,针对不同的层,我们可以设置不同的值,比如含有诸多参数的层,我们可以把keep-prob设置成比较小的值,这样可以使我们更好地应用dropout法。
dropout的功能类似于L2正则化,但与L2正则化的应用方式,以及适用的输入范围不同。

dropout法应用

dropout法主要被应用于图像识别中,因为在计算视觉中,模型的输入量非常大,输入了太多像素,以至于没有足够的数据,所以dropout在计算机视觉中应用得比较频繁。归根结底dropout法是一种防止过拟合的方法,如果模型没有发生过拟合,不推荐使用dropout法。

dropout法的缺点

其最大的一个缺点就在于关于代价函数J的计算会变得困难,因为每次迭代该模型的时候,都会有一些神经元被随机移除,此时的代价函数并没有被明确定义,换一种说法,代价函数 J J J是不确定的。于是在这种情况下,我们失去了使用代价函数 J J J去调试的机会。吴恩达老师说他在使用时,通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数。

1.7其他正则化方法

除了前面介绍的L2正则化方法和随机失活(dropout)法外还有其他的一些正则化方法可以用于减少神经网络中的过拟合现象。

数据扩增

在这里插入图片描述
在前几节的课程中,我们学习到,如果想要减少过拟合现象的出现,还可以扩展我们的训练数据。拿识别猫的图片分类器举例,我们的训练集是猫的图片。除了录入新的照片之外,我们还可以通过对已有照片进行翻转、裁剪操作,来扩充训练集,虽然这种方法肯定没有加入新的照片好,但这样做节省了获取更多猫咪图片的花费。
这样做虽然可以扩大我们的训练集,但也有可能会引入假训练数据,但我们这么做代价几乎为零,除了一些对抗性代价。但像这样人工合成数据的话,我们要通过算法验证,图片中的猫经过水平翻转之后依然是猫。
在这里插入图片描述
对于光学字符识别,我们还可以通过添加数字,随意旋转或扭曲数字来扩增数据,把这些数字添加到训练集,它们仍然是数字。
所以,数据扩增可作为正则化方法使用,实际功能上也与正则化相似。

early stopping(早停法)

顾名思义,就是提早停止训练神经网络。我们在运行梯度下降时,可以绘制出训练误差图像,或者只绘制代价函数的优化过程。其图像呈单调下降趋势,如下图所示。
在这里插入图片描述
我们在训练过程中肯定希望代价函数 J J J不断减小,通过early stopping法,我们不但可以绘制上面这些内容,还可以绘制验证集误差,它可以是验证集上的分类误差,或验证集上的代价函数,逻辑损失和对数损失等。验证集误差通常会先呈下降趋势,然后在某个节点处开始上升,如下图所示。
在这里插入图片描述
所以如果我们在某一点处觉得神经网络已经足够优秀了,就可以提前停止训练。early stopping法要做的就是在中间点停止迭代过程,我们得到一个w值中等大小的弗罗贝尼乌斯范数。
在这里插入图片描述

early stopping法的缺点

我们在训练模型的时候,一个很重要的任务就是想办法减小代价函数 J J J的值,但这并不是我们唯一的任务,预防过拟合还有其他的任务,比如说方差的问题,我们要设法减小方差。我们以后会学习正交化原理来解决这类问题,整体思路就是在一个时间做一个任务。
而early stopping的主要缺点就在于我们并不能独立地处理这两个问题,因为提早停止了梯度下降,也就停止了优化代价函数J,因为现在你不再尝试降低代价函数J,所以代价函数的值可能不够小,同时你又希望不出现过拟合,我们用一种方法试图同时解决这两个问题,使得我们要考虑的东西变得更加复杂。
因为这个缺点的存在,很多人更倾向使用L2正则化方法,尝试不同的 λ \lambda λ值,虽然要负担更多的计算代价,但是可以使得超级参数搜索空间更容易分解,也更容易搜索。这些内容以后还会具体提到。

1.9归一化输入

归一化输入的过程

归一化输入是一种在训练过程中加速训练的方法。整体分为两步,第一步是零均值化,第二步是归一化方差,下图为归一化输入的整体流程。
在这里插入图片描述
我们先来看第一步,零均值化过程, μ = 1 m ∗ ∑ i = 1 m x ( i ) \mu = \frac{1}{m}*\sum_{i=1}^{m}x^{(i)} μ=m1i=1mx(i),这是一个向量,每次x=x- μ \mu μ,以达到移动训练集的目的。
第二步就是归一化方差了,在第二张图片中我们可以看出x1特征的方差要远大于x2特征的方差,我们要做的就是给 σ 2 \sigma^{2} σ2赋值,令 σ 2 = 1 m ∗ ∑ i = 1 m ( x ( i ) ) 2 \sigma^{2}=\frac{1}{m}*\sum_{i=1}^{m}(x^{(i)})^{2} σ2=m1i=1m(x(i))2,然后每次令x=x/ σ 2 \sigma^{2} σ2,这样操作之后可以使得x1,x2的方差相等,且都等于1,得到第三张图片的训练数据。

为什么要进行归一化输入

如果我们不使用归一化输入,代价函数会是这样的样子:
在这里插入图片描述
我们会得到一个非常狭窄的代价函数,如果我们在这样的代价函数上运行梯度下降法,必须使用一个非常小的学习率。因为如果是在这个图像中,梯度下降法可能需要多次迭代过程,直到最后找到最小值。
但如果我们对输入进行归一化输入,代价函数平均起来看更对称,不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,在梯度下降法中可以使用较大步长进行学习。
实际上 ω \omega ω是一个高维向量,因此用二维绘制并不能正确地传达并直观理解,但总地直观理解是代价函数会更圆一些,而且更容易优化。
在这里插入图片描述
如果特征x1,x2是相似范围的,比如-1 ~ 1和0 ~ 1,归一化输入就不显得那么重要了。但如果范围相差比较大,那归一化输入就显得非常重要了。吴恩达老师说因为归一化输入没有什么坏处,所以他每次都会进行归一化输入,虽然不一定有用。。

1.10梯度消失/梯度爆炸

在我们对模型进行训练的时候,在某些地方会发生梯度消失或者梯度爆炸的情况,也就是有时候导数会非常小或者非常大,这种时候训练的难度就大大增加了。
本节视频中主要讲述了梯度消失/梯度爆炸现象出现的原因。
在这里插入图片描述
上图是一个深层的神经网络,为了方便表示,这里举的是一个每层中都只包含两个隐藏神经元的神经网络。这里的激活函数选取的是最简单的 g ( z ) = z g(z)=z g(z)=z,所以有 y ^ = W [ L ] W [ L − 1 ] … … W [ 1 ] x \hat{y}=W^{[L]}W^{[L-1]}……W^{[1]}x y^=W[L]W[L1]W[1]x,如果我们假设每个权重矩阵 W [ l ] = [ 1.5 0 0 1.5 ] W^{[l]}={\begin{bmatrix} 1.5& 0\\ 0 & 1.5 \end{bmatrix}} W[l]=[1.5001.5],所以y= W [ 1 ] [ 1.5 0 0 1.5 , ] L − 1 x W^{[1]}{\begin{bmatrix} 1.5& 0\\ 0 & 1.5, \end{bmatrix}}^{L-1}x W[1][1.5001.5,]L1x,根据矩阵的计算规则,我们可以算出 y ^ = 1. 5 [ L − 1 ] x \hat{y}=1.5^{[L-1]}x y^=1.5[L1]x,对一个L很大的深层神经网络, y ^ \hat{y} y^的值将会发生爆炸式的增长。
反之,如果将1.5换成0.5时,代价函数将以指数形式衰减。
在深度神经网络中,代价函数J将以指数级递减,虽然我只是讨论了代价函数J以相关的指数级数增长或下降,它也适用于与L层数相关的导数或梯度函数,也是呈指数级增长或呈指数递减。这就是梯度消失与梯度爆炸产生的原因。
在这一节课中,我们学习了了深度神经网络中梯度消失或爆炸为什么会出现,实际上,在很长一段时间内,它曾是训练深度神经网络的阻力。合理地初始化能够减少梯度消失与梯度爆炸的发生。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值