“吴恩达deeplearning.ai”学习笔记(p47-p60:第二课时第一章:超参数调试、正则化以及优化)

上接:第一课时第四章:深度神经网络

目录:

1.机器深度学习


1.1训练_开发_测试集

应用深度学习是一个典型的迭代过程,需要多次循环往复才能为应用程序找到一个称心的神经网络,而循环该过程的效率往往由是否具备高质量的训练数据集、验证集和测试集所决定。
对于一个需要解决的问题的样本数据,在建立模型的过程中,我们通常会将问题的data划分为以下几个部分:

  1. 训练集(train set):用训练集对算法或模型进行训练过程;
  2. 验证集(development set):利用验证集或者又称为简单交叉验证集(hold-out cross validation set)进行交叉验证,选择出最好的模型;
  3. 测试集(test set):最后利用测试集对模型进行测试,获取模型运行的无偏估计。

在机器学习发展的小数据时代,比如输入量仅为100、1000、10000样式大小时,人们对于数据的合理划分是:

  • 无验证集的情况:70% / 30%;
  • 有验证集的情况:60% / 20% / 20%;

而在大数据时代,对于一个问题,我们拥有的data的数量可能是百万级别的,那么验证集和测试集所占数据总量的比重会趋向于变得更小。因为验证集的目的是为了验证不同的算法哪种更加有效,所以验证集只要足够大能够验证大约2-10种算法哪种更好就足够了,不再需要占总数据20%的份额作为验证集(例如百万数据中往往只抽取1万的数据作为验证集就足够了),测试集的主要目的是评估模型的的性能,如在单个分类器中,往往在百万级别的数据中,我们选择其中1000条数据足以评估单个模型的性能所以现如今人们对于数据的合理划分是:

  • 100万数据量:98% / 1% / 1%;
  • 超百万数据量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)

值得注意的是:建议验证集要和训练集来自于同一个分布,可以使得机器学习算法变得更快;如果不需要用无偏估计来评估模型的性能,则可以不需要测试集。


1.2偏差-方差

面对数据集,当我们对其进行拟合时,往往会得到一个逻辑回归拟合。
在这里插入图片描述
1) 欠拟合
所得的逻辑回归拟合并不能很好的拟合数据集,会导致偏差很高

2) 过度拟合
当拟合一个非常复杂的分类器,比如深度神经网络或含有隐藏单元的神经网络就可能非常适合这个数据集,但是这看起来也不是一种很好的拟合方式,分类器实质偏差较高,数据过度拟合

3) 适度拟合
介于过拟合和欠拟合中间的一类,但其数据偏差值合理
在这里插入图片描述

例如在小猫图片识别的神经网络搭建的实例中,我们肉眼识别几乎不会出错,假定训练集错误率是1%,为方便论证,假设验证集的错误率是11%;这样对比下来我们可以看出训练集拟合得非常好但是验证集效果却差强人意,这很有可能是因为逻辑回归实际过拟合数据集了,在这种情况下,验证集就没有充分利用交叉验证集的作用,同时我们常称这种情况为“高偏差”。
假定训练集错误率是15%,验证集的错误率是16%;这样对比肉眼识别的近乎0%而言结果也不是很好,但是训练集对于验证机产生的结果确是合理的。这种假设对应的算法偏差高,因为它甚至不能拟合训练集。假定训练集错误率是15%,验证集的错误率是30%;训练集的结果非常糟糕,算法偏差也高(因为它在训练集上结果不理想,方差也很高)。
假定训练集错误率是0.5%,验证集的错误率是1%;可见效果很好,方差偏差都很低,就是适度拟合的情况。
最有误差(基本误差)是接近于0%的情况。
逻辑回归是否拟合数据集决定偏差的高低;训练集和验证集误差值差距决定方差高低.


1.3机器学习基础

在初始模型训练完成后,我们需要知道算法的偏差高不高,如果偏差较高,我们需要评估训练集和训练数据的性能。 解决High bias 和High variance 的过程:

1.如果存在High bias (高偏差),解决的思路有:

  • 增加网络结构,如增加隐藏层数目;
  • 训练更长时间;
  • 寻找合适的网络架构,使用更大的NN结构;

2.如果存在High variance,解决的思路有:

  • 获取更多的数据;
  • 正则化( regularization);
  • 寻找合适的网络结构;

在深度学习早期时间中,我们没有很好的工具能够在降低偏差的同时不影响方差,而在大数据时代,只要持续训练一个更大的网络,准备更多的数据,同时正则适度,就可以二者达到均忧的局面。而这就是深度学习赋予监督式学习的益处,也是我们不用太过关注如何平衡偏差和方差的一个重要原因。
在这里插入图片描述

1.4(regularization)“L2正则化”

可以达到训练一个更大的网络同时几乎没有任何负面影响的效果,而训练一个大型神经网络的主要代价也只是计算时间 。正则化可以有助于避免过度拟合或者减少网络误差。
正则化的作用原理:
在逻辑回归实现设想(求成本函数J的最小值)过程中添加参数λ (也就是正则化参数)

在这里插入图片描述

另外前面的知识中我们学习到,成本函数J参数包含一些训练数据和不同数据中个体预测的损失。(w、b是逻辑回归的两个参数,w是一个多维度参数矢量,b是一个实数)
在这里插入图片描述
实际上L1正则化使模型变得稀疏,却没有降低太多存储内存,人们在训练模型时,往往趋向于L2。
λ是正则化参数,往往通过使用验证集或交叉验证来配置这个参数。λ是另外一个需要调整的超级参数(注意在python代码中,lambda是一个保留字段,所以我们实际表示参数λ时往往使用“lambd”)

在神经网络中实现正则化:
对应的成本函数为:
在这里插入图片描述
其中在这里插入图片描述
因为w的大小为( n^[ L − 1 ], n^ [ l ] ) ,n^[L-1]表示隐藏单元的数量,n[l]表示l层单元的数量。该矩阵范数被称作Frobenius(弗洛贝尔乌斯范数),即——一个矩阵中所有元素的平方和
对应的梯度下降:
在这里插入图片描述
则梯度更新公式变为:
在这里插入图片描述
带入dw中得到:
在这里插入图片描述
其中,( 1 − α λ/ m ) <1的项,会给原来的W[l]一个衰减的参数,所以L2范数正则化也被称为“权重衰减(Weight decay)”

1.5为什么正则化有利于预防过拟合呢?

看下面例子以作体会(左图是高偏差,右图是高方差,中间是just right的图像):
在这里插入图片描述
假设下图是一个过饱和的神经网络:
在这里插入图片描述
其正则化后的代价函数为:
在这里插入图片描述
我们可以看到我们实质是对L2范数进行了压缩。直观上的解释就是:当正则化λ设置得足够大,权重矩阵W会被设置为接近于0的值。
直观理解就是:我们试着把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。
这样一来原本过拟合的大型神经网络就可以被简化为一个很小的网络(但是深度是不变的),它将使得这个神经网络从过拟合状态向高偏差状态进行过渡,而随着我们对于λ的测试,我们可以在这个过程中找到”just right“状态!
在这里插入图片描述
当然实际上隐藏层的神经元依然存在,只是他们的影响变小了,便不会导致过拟合。

数学解释:
在这里插入图片描述

假设神经元中使用的激活函数为g ( z ) = tanh ⁡ ( z ) ,在加入正则化项后:
当λ增大,导致W^[ l ]
减小,Z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] 也会减小,由上图可知,在z较小的区域里,tanh ⁡ ( z ) 函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,从而不会发生过拟合。
但是L2正则化的不足有:

  • 训练神经网络的时间长
  • 虽然导致超级参数搜索空间更容易分解和搜索,但是正则化参数值λ需要不断尝试,就导致搜索大量λ值得计算代价很高。

1.6另一种正则化方法:“Dropout(随机失活)”

dropout重点在于随即删除网络中的神经单元,进而对神经网络进行化简。

1.6.1dropout原理

  • dropout会遍历网络中的每一层
  • 然后设置消除神经网络中节点的概率:
    选用一些方法对节点的概率进行设置,可以将这些节点的概率化零,从而变相的删掉了该节点进出的连线),最后得到一个节点更小,规模更小的网络。
  • 用backprop方法进行训练

在这里插入图片描述

1.6.2实现dropout的方法

①inverted dropout(反向随机失活)
举例(以一个三层网络为例,只说明在某一层中实施dropout)说明如下:

在这里插入图片描述

  • 定义向量d(d3表示一个三层的dropout向量,d3=np.random.rand),d3实质是一个布尔型数组,其值为true或false
  • 查看d3=np.random.rand(a3shape[0],a3shape[1])与keep_pro的大小关系(假设保留某个隐藏单元的概率——keep_pro=0.8)
    如果d3中元素随机初始化的数字>0.8,则赋值为1;若其<0.8,则赋值为0 .
  • 从第三层中获取激活函数a3
  • 处理a3中的节点,使d3在a3中对应的部分节点归零(a3=np.multply(a3,d3))
  • 向外扩展a3(a3/=keep_pro)
    这一步是因为a3部分节点失活之后为了接下来在z[4]=w[4]*a[3]+b[4]中不影响z[4]的维度,就要扩展以保持一致

1.7理解Dropout

本质而言就是我们给不同的输入特征向量增加一点权重,然后传播所有的权重,dropout将会产生收缩权重的平方范数的效果,并完成一些预防过拟合的外层正则化。上文提到L2对于不同权重的衰减是不同的,它往往取决于倍增的激活函数的大小。

在这里插入图片描述
如果担心某些隐藏层比其他层更容易发生过拟合,就可以这些层对应的keep_pro值设置得比其他层更低;缺点是:为了使用交叉验证,你要搜索更多的超级参数。
综上所述:
dropout虽然赋予我们更简便的神经网络,但是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,由于这种随机性,使得成本函数的复查变得困难。

1.8其他正则化方法

当我们收集新数据消耗过大时,为了节约成本(以收集猫咪数据集为例)我们可以:

1.8.1对原有数据集进行简易变形以扩大数据集

  • 水平翻转图片
  • 裁剪图片
    在这里插入图片描述
    但上述的人工合成数据还需要通过算法验证。

1.8.2early stopping

在这里插入图片描述
early stopping的作用原理与L2正则化(选择参数w范数较小的神经网络以避免神经网络的过度拟合)类似,它可以在成本J变化的不那么激烈时停止,避免参数w迭代变得很大。同时它只运行一次坡度下降,只需要获得w得较小值,中间值,较大值即可,无需像L2正则化一样要反复测试超级参数λ得值。
early stopping的不足在于:他无法同时处理:

  • ①避免参数w,b,成本函数J(w,b)的激增;
  • ②停止的时机可能不当,它无法预知之后当前得到的J是不是最优,就无法避免方差,偏差仍然过大的情况

1.9归一化输入

假设我们有一个训练集,他有两个输入特征,所以输入特征X是二维的。在这里插入图片描述
归一化输入的步骤:
第一步:零均值化——移动训练集直到它完成零均值化
①减去均值得到对称的分布:x : = x − μ
②计算每个输入特征占所有样本数据的均值:
在这里插入图片描述
在这里插入图片描述
第二步:归一化方差
注意上图中,特征X1的方差比特征X2的方差要大得多,而我们要做的就是给σ 赋值为1:
在这里插入图片描述
σ2是一个向量,它的每个特征都有方差,而由于此时我们对于每个输入特征量x(i)都完成了零均值化,则此时得到的方差就等于x(i)的平方。
上述是老师的讲法,观看的时候有不少争议,可取的一个解释是老师实际讲的是”0均值标准化“,上述公式中x=x/σ比较合理
在这里插入图片描述
归一化特征量,可以使得代价函数平均起来更对称,也更加方便找到梯度下降的最优解:
在这里插入图片描述


1.10梯度消失与梯度爆炸

当我们在训练神经网络时,导数或坡度有时会变得非常大或非常小。
在这里插入图片描述

在这里插入图片描述


1.11神经网络的权重初始化

以一个单个神经元为例:

在这里插入图片描述
我们可以看到参数w1、w2、w3、w4……wl的值直接影响输出z的大小,如果我们想要获取一个数值较为合理的z,那么w(i)相应的就应该设置得比较小,例如我们可以设置:

Var(wi)=1/n
#其中n是输入的神经元个数
#称为Xavier initialization

参数初始化可以写作:

WL = np.random.randn(WL.shape[0],WL.shape[1])* np.sqrt(1/n)

不同激活函数的 Xavier initialization:

  • 激活函数为Relu:
    V a r ( w i ) = 2 /n
  • 激活函数为tanh:
    V a r ( w i ) = 1/n

其中n是输入的神经元个数,也就是n^[l − 1 ]


1.12梯度的数值逼近

如ppt所示,以函数f(θ)=θ3为例,其导函数设为g(θ)=3θ2
当θ=1时,g(θ)=1
在这里插入图片描述
观察图像写出双边导数有:
当θ=1,f(θ)=3.0001
在这里插入图片描述
对于单边导数有:
当θ=1,f(θ)=3.0301
在这里插入图片描述

在这里插入图片描述

结论:
使用双边误差的方法会更逼近实际导数值,使得精确度大大提高;从而在梯度检验和反向传播中使用该方法 会更加准确。


1.13梯度检验

我们的神经网络中各个不同的隐藏层具有不同的参数w,为了做梯度检验,我们可以把参数全部连接起来,将输入特征X的维度变为一个一维的向量θ 。
同时对dW[1], db[1], ⋯ ,dW[ L]执行同样的操作,如图所示:
在这里插入图片描述
然后去求出dθ与代价函数J的梯度或坡度之间的差距大不大,若差距大于10-5则需要排查各层计算:
在这里插入图片描述


1.14关于梯度检验实现的注记

  • 不要在训练过程中使用梯度检验,只在检验dropout的时候使用,因为这个检验过程十分长,使用完毕关闭梯度检验的功能;
  • 如果算法的梯度检验失败,要检查每一项,找出错误,也就是说要找出哪个dθapprox[i]与dθ相差很大
  • 不要忘记了正则化项;
  • 梯度检验不能与dropout同时使用。因为每次迭代的过程中,dropout会随机消除隐层单元的不同神经元,这时是难以计算dropout在梯度下降上的代价函数J;
  • 你可能会遇到这样的一种情况:
    在随机初始化过程中,当w和b接近0时,梯度下降的实施是正确的;但是在运行梯度下降时,w和b变得更大,这时backprop的实施可能会变得不那么正确。
    所以为了避免这种情况,我们可以在随机初始化过程中运行梯度检验再训练网络,从而使w和b有一段时间远离0。

猜你喜欢

转载自blog.csdn.net/KQwangxi/article/details/113891782