吴恩达-深度学习-课程笔记-6:深度学习的实用层面(week1)

PilgrimHui PilgrimHui     2022-10-01     759

关键词:

1 训练/验证/测试集( Train/Dev/test sets )

构建神经网络的时候有些参数需要选择,比如层数,单元数,学习率,激活函数。这些参数可以通过在验证集上的表现好坏来进行选择。

前几年机器学习普遍的做法: 把数据分成60%训练集,20%验证集,20%测试集。如果有指明的测试集,那就用把数据分成70%训练集,30%验证集。

现在数据量大了,那么验证集和数据集的比例会变小。比如我们有100w的数据,取1w条数据来评估就可以了,取1w做验证集,1w做测试集,剩下的用来训练,即98%的训练集。对于数据量过百万的数据,训练集可以占到99.5%

我们在做一个应用的时候,比如训练一个分类器识别猫,可能训练集数据都是网上爬取的,验证集和测试集都是用户上传的,这样训练集的分布和验证测试集的分布不一致。

这种情况,有一条经验法则,建议大家要确保验证集和测试集的数据来自同一分布,因为你要用验证集来评估不同的模型。而训练集因为要收集大量数据,可以采用各种方法比如网页抓取,这样会导致训练集和验证测试集分布不一致。

测试集是对模型的无偏估计,没有测试集的话就是在训练集上训练,在验证集上评估然后修改参数迭代出适用的模型。有些团队说他们的设置中只有训练集和测试集,而没有验证集。这样的训练实际上就是只有训练集和验证集,并没有用到测试集的功能。

 

2 偏差和方差( bias / variance )

高偏差:数据拟合的不好,欠拟合,比如在训练集和验证集上的效果都差,训练集和验证集准确率差不多

高方差:数据拟合的太好而泛化能力变差,过拟合,比如在训练集上表现好,在验证集上表现差,训练集和验证集的准确率相差甚多

高偏差和高方差:训练集上表现很差,验证集上表现更加差,训练集和验证集的准确率相差甚多。高方差和高偏差的数据样本见下图所示。

这里有个假设前提:训练集和验证集来自同一分布。

表现好不好相对于最优误差来讲的,比如猫的二分类,人能够几乎0%的错误率识别是不是猫,那么最优误差是0%,这个时候训练误差和验证误差都是16%,可以判定为高偏差。

如果一个问题的最优误差是15%,那么训练误差和验证误差都是16%,就不能说它高偏差。

 

3 机器学习基础( Basic recipe for machine learning )

训练集表现不好,高偏差:重新构建网络,更多隐藏层,更多隐藏单元,迭代更多次,更改优化器等等,必须做各种尝试(可能有用,可能没用)。反复尝试,直到可以拟合数据为止。如果网络空间很大,通常可以很好的拟合数据集。

过拟合,高方差:尽可能使用更多的数据,正则化,同样要做各种反复的尝试。

在深度学习早期,没办法做到只减少偏差或方差却不影响另一方。

但当前的深度学习和大数据时代,只要有足够大的网络,足够多的数据(也不一定只是这两个,只是做个假设),就可以在不影响方差的同时减少偏差。

 

4 正则化( Regularization )

在原始的损失函数后面加一个正则项,主要是权重w的L2范式的平方,此方法称为L2正则,实际上L2正则在进行梯度下降的时候做了一个权重衰减,从公式上可以看出。

也可以用L1正则,加上的是w的L1范式,就是绝对值相加,它可以使w稀疏,也就是w有很多0。

正则化就是对权重w进行惩罚,当w太大的时候损失函数会变大,这个时候优化为了使损失函数尽可能小就会惩罚w,减小了w的影响,使神经网络变得简单,由此来防止过拟合。

也可以这样理解,正则使得w尽量小,这个时候z就比较小,比如对于激活函数tanh来说,z比较小的时候梯度相对来说比较像一条直线,那么得到的函数相对呈线性,这样整个神经网络就不会过于复杂,由此来防止过拟合。

 

5 dropout正则( Dropout regularization )

除了L2正则,还可以用dropout正则来防止过拟合。

dropout会在每一层随机删除一些节点,相当于直接使某些层的权重为0,由此使得网络规模变小,得到一个精简后的网络。

对于每一个样本都会用一个精简后的网络训练,这样的话可以认为每个样本训练时的网络结构是不一样的。

具体如何实施呢?有几种方式,ng讲了常用的一种,Inverted dropout反向随机失活。

对于模型的某一层,设定一个概率keep-prob表示保留单元的概率。生成一个随机矩阵,表示每个样本和每个隐藏单元是否丢弃:$d^{[3]} = np.random.rand( d^{[3]}.shape[0],  d^{[3]}.shape[1]) < keep-prob$

过滤掉$d^{[3]}$中所有等于0的元素:$a^{[3]} = np.multiply( a^{[3]}, d^{[3]} )$

dropout后需要把所有数值除以这个保留概率(为了保证a3的期望不变):$a^{[3]} /= keep-prob$

测试阶段不使用dropout,因为我们在测试阶段不希望输出的结果是随机的。

另一个dropout有效的直观理解是,因为对于某个单元,输入单元有可能被删除,所以神经网络不会分配太大的权重,这相当于L2正则中的收缩权重的效果,所以说dropout的功能类似于L2正则。

每层的keep-prob可以不同,对于单元数多,容易过拟合的层可以用小一点的keep-prob,对于不容易过拟合可以用大一点的keep-prob。

很多dropout的第一次成功应用是在计算机视觉领域,因为计算视觉中往往输入了过多的像素。计算机视觉的研究人员很喜欢用dropout,几乎成了默认的选择。

但是要记住,dropout是为了防止过拟合的手段,当算法过拟合的时候才使用,所以一般是用在计算视觉方面(往往没有足够的数据,容易过拟合)。

dropout的一大缺点就是代价函数不再被明确定义,每次迭代都会随机移除一些节点,很难调试梯度下降的迭代过程(绘制迭代次数和cost的函数图)。

可以在调试的时候先把keep-prob设置为1,绘制出迭代图,之后再打开dropout。

 

6 其它正则化方法( Other regularization methods)

数据增强(data augmentation),对原始图像做一些翻转,裁剪,放大,扭曲等处理,产生额外的数据,这些额外的数据可能无法提供太多的信息,但是这么做没什么花费(相比于收集新数据要简单的多)。

提早停止(early stopping), 当发现验证集降到最低开始上升的时候(表示要过拟合了),这个时候停止训练,可以理解为选择一个中等的w来防止过拟合(一开始随机初始化很小,随着训练慢慢增大)。

early stopping有一个缺点,就是它无法同时处理最小化代价和防止过拟合这两个问题(防止了过拟合,但是可能早早就停下来了,没有做到最小化代价)。

所以代替early stopping用的L2正则,这样训练的时间就可能很长,你必须尝试很多正则化参数,搜索参数的计算代价太高。而early stopping的优点就是无需尝试很多参数。个人倾向于用L2正则。

 

7 归一化输入( Normalizing inputs)

归一化输入需要两个步骤:零均值化归一化方差

零均值化:样本中的每个特征值都减去该特征 的平均值,这样每个特征的均值为0

归一化方差:样本中每个的特征值除以该特征的方差,这样每个特征的方差为1

值得注意的是,如果你在训练集归一化,那么在测试集要用相同的平均值和方差(训练集计算得到的)来归一化,因为我们希望在训练集和测试集上做相同的数据转换。

为什么要归一化输入特征呢?如下第1个图左侧所示,如果不归一化的话,代价函数可能是一个非常细长狭窄的函数,在训练的时候需要设置很小的步长,迭代时间会变长。

如下第1个图右侧所示,归一化后,各个特征都在相似范围内,代价函数更圆,更容易优化,梯度下降法能够使用较大的步长,更快速地迭代。

 

8 梯度消失,梯度爆炸,权重初始化( Vanishing / exploding gradients,Weight initialization for deep networks )

ng的例子中,训练神经网络的时候如果网络很深的话,假设权重都是1.5,传递到最后一层的y的值将会呈指数增长(因为每经过一层就会乘一个权重1.5),假设权重都是0.5,传递到最后一层的y将会变得很小很小。

这是造成梯度消失或梯度爆炸的原因,它给训练造成了很大困难。针对梯度消失或梯度爆炸,有一个不完整的解决方案,虽然不能彻底解决问题,却很有用。

考虑$z = w_1*x_1 + w_2*x_2 + ... + w_n*x_n$,为了防止z太大或太小,可以看到n越大的话,你就希望w越小,以此来平衡z,那么很合理的设定就是把w设定为1/n。

所以在某一层,初始化权重的方法就是设定值为$\sqrt{\frac{1}{n^{[l-1]}}}$,如下图所示,其中$n^{[l-1]}$表示l层的输入特征数。如果你使用的是relu激活,那么用2 / n效果会更好。

此外,还有一些其它的变种,见下右图所示。权重初始化可以看做一个超参数,但是相比于其它超参数,它的优先级比较小,一般优先考虑调整其它超参数来调优。

 

9 梯度的数值逼近,梯度检验( Weight initialization for deep networks, Gradient Checking )

进行梯度检验的时候,考虑某点前进很小很小距离的点,和往后很小小距离的点,考虑了两个点估计的梯度会更准确,渐进误差为这段距离的平方O(ε^2)。

考虑某点前进很小很小的一段距离的点来估计梯度,只考虑了单边,渐进误差为这段距离O(ε)。

所以我们采用双边误差的估计来进行梯度检验,用双边误差的估计梯度和实际求导的梯度做一个距离计算,看看距离是否足够小。

ng介绍的梯度检验如下第2个图所示,其中Θ[i]表示第i个样本的所有权重,距离公式中的分母只是为了防止数值太大而加的。

需要注意的是,梯度检验和dropout不要同时进行,

 

 

吴恩达deeplearning.ai课程笔记(1-3)神经网络和深度学习---浅层神经网络

以下为在Coursera上吴恩达老师的DeepLearning.ai课程项目中,第一部分《神经网络和深度学习》第二周课程部分关键点的笔记。笔记并不包含全部小视频课程的记录,如需学习笔记中舍弃的内容请至Coursera或者网易云课堂。同时在阅... 查看详情

吴恩达深度学习专项课程3学习笔记/week2/erroranalysis

ErroranalysisCarryingouterroranalysisErroranalysis是手动分析算法错误的过程。通过一个例子来说明erroranalysis的过程。假设你在做猫图像识别的算法,它的错误率高达10%,你希望提高它的表现。你已经有了一些改进的想法,包括:算法把狗... 查看详情

卷积神经网络笔记--吴恩达深度学习课程笔记(代码片段)

各个知识点详解LeNet-5网络LetNet网络的的讲解主要参考1998年计算机科学家YannLeCun发布的一篇论文《Gradientbasedlearningappliedtodocument-recognition》大家可以找到这篇论文结合学习,针对该网络,首先大家需要了解一下图像中的常... 查看详情

吴恩达深度学习专项课程2学习笔记/week2/optimizationalgorithms

Optimizationalgorithms优化算法以加速训练。Mini-batchgradientdescendBatchgradientdescend:每一小步梯度下降否需要计算所有的训练样本。很耗时。Mini-batchgradientdescend:将训练集分为很多小的mini-batch,每一个epoch用到一个mini-batch的训练样本,... 查看详情

最为详细的卷积神经网络笔记--吴恩达深度学习课程笔记

卷积神经网络(二)二、经典神经网络的结构:LeNet-5AlexNetVGGResNet2.1LeNet-52.2AlexNet-5可以同时在两个GPU上运行2.3VGG2.4残差网络ResNet下图是一个残差块,输入a[l]会传送到l+2层的线性部分之后,这样它会直接参加... 查看详情

最为详细的卷积神经网络笔记--吴恩达深度学习课程笔记(代码片段)

各个知识点详解LeNet-5网络LetNet网络的的讲解主要参考1998年计算机科学家YannLeCun发布的一篇论文《Gradientbasedlearningappliedtodocument-recognition》大家可以找到这篇论文结合学习,针对该网络,首先大家需要了解一下图像中的常... 查看详情

吴恩达-深度学习-课程笔记-7:优化算法(week2)

1Mini-batch梯度下降在做梯度下降的时候,不选取训练集的所有样本计算损失函数,而是切分成很多个相等的部分,每个部分称为一个mini-batch,我们对一个mini-batch的数据计算代价,做完梯度下降,再对下一个mini-batch做梯度下降。... 查看详情

吴恩达深度学习笔记(代码片段)

监督学习简介文章目录监督学习简介前言一、监督学习常见应用二、基础知识1.数据类型2.学习次序3.常用符号4.二分分类(logistics)5.梯度下降法6.导数和流程图(略)7.logistics中的梯度下降7.向量化的必要性8.向量... 查看详情

最为详细的卷积神经网络笔记--吴恩达深度学习课程笔记

卷积神经网络(三)三.目标检测3.1目标定位对于分类定位问题,通常只有一个较大的物体在图片的中央,我们需要识别该物体的类别并标记物体的位置。而对象检测问题在一张图片中可能会有多个不同类别的对象... 查看详情

吴恩达-深度学习-课程笔记-14:人脸识别和风格迁移(week4)

 1什么是人脸识别(whatisfacerecognition)在相关文献中经常会提到人脸验证(verification)和人脸识别(recognition)。verification就是输入图像,名字或id,判断是不是。而人脸识别是输入图像,输出这个人的名字或id。我们先构造一个准确... 查看详情

最为详细的卷积神经网络笔记--吴恩达深度学习课程笔记

一.卷积神经网络(一)1.1计算机视觉卷积神经网络一般应用于计算机视觉领域,由于有的时候图片的像素点很多,导致神经网络输入特征值的维数很多。1.2边缘检测示例如下图所示,原图是一个661的矩阵,... 查看详情

吴恩达-深度学习-课程笔记-8:超参数调试batch正则化和softmax(week3)

1调试处理(tuningprocess)如下图所示,ng认为学习速率α是需要调试的最重要的超参数。其次重要的是momentum算法的β参数(一般设为0.9),隐藏单元数和mini-batch的大小。第三重要的是神经网络的层数和学习率衰减adam算法的三个参数... 查看详情

李飞飞吴恩达bengio等人的15大顶级深度学习课程

目前,深度学习和深度强化学习已经在实践中得到了广泛的运用。资源型博客sky2learn整理了15个深度学习和深入强化学习相关的在线课程,其中包括它们在自然语言处理(NLP),计算机视觉和控制系统中的应用教程。这些课程涵... 查看详情

吴恩达深度学习笔记(代码片段)

神经网络文章目录神经网络前言一、一些基础的numpy语法二、神经网络1、原理2、代码MATLAB版本:python版本:3、激活函数tanh函数Relu函数LeakyReLU函数(PReLU)ELU(ExponentialLinearUnits)函数总结前言学习的第二天一、一些... 查看详情

吴恩达深度学习课程第三课—结构化机器学习项目

第一周机器学习策略1.1什么是机器学习策略1.2正交化功能点之间相互独立1.3单一数字评估指标调和平均数1.4满足和优化指标N个指标,满足N-1个指标的前提下优化那一个指标1.5训练,开发,测试数据集划分训练集,开发集,测试... 查看详情

吴恩达深度学习笔记+作业

1.1.2Buildingbasicfunctionswithnumpy1.1.2.2numpy.exp,sigmoid,sigmoidgradientimportnumpyasnpdefsigmoid(x):s=1/(1+np.exp(-x))returns#设sigmoid为s,s‘=s*(1-s)defsigmoid_derivative(x):s=1/(1+np.exp(-x))ds=s* 查看详情

卷积神经网络笔记--吴恩达深度学习课程笔记(代码片段)

各个知识点详解LeNet-5网络LetNet网络的的讲解主要参考1998年计算机科学家YannLeCun发布的一篇论文《Gradientbasedlearningappliedtodocument-recognition》大家可以找到这篇论文结合学习,针对该网络,首先大家需要了解一下图像中的常... 查看详情

吴恩达深度学习笔记(deeplearning.ai)之卷积神经网络

经典网络LeNet-5AlexNetVGGNg介绍了上述三个在计算机视觉中的经典网络。网络深度逐渐增加,训练的参数数量也骤增。AlexNet大约6000万参数,VGG大约上亿参数。从中我们可以学习到:随着网络深度增加,模型的效果能够提升。另外,VG... 查看详情