深度学习笔记(二)(1)深度学习的实践层面

深度学习笔记(一)(1)深度学习的实践层面

返回目录

1.1 训练,验证,测试集(Train / Dev / Test sets)

在配置训练、验证和测试数据集的过程中做出正确决策会在很大程度上帮助大家创建高效的神经网络。训练神经网络时,我们需要做出很多决策,例如:
神经网络分多少层;每层含有多少个隐藏单元;学习速率是多少;各层采用哪些激活函数。
在这里插入图片描述
我们通常会将这些数据划分成几部分,一部分作为训练集,一部分作为简单交叉验证集,有时也称之为验证集,方便起见,我就叫它验证集(dev set),其实都是同一个概念,最后一部分则作为测试集。
在这里插入图片描述
但是在大数据时代,我们现在的数据量可能是百万级别,那么验证集和测试集占数据总量的比例会趋向于变得更小。假设我们有 100 万条数据,其中 1 万条作为验证集,1 万条作为测试集,100 万里取 1 万,比例是 1%,即:训练集占 98%,验证集和测试集各占 1%。对于数据量过百万的应用,训练集可以占到 99.5%,验证和测试集各占 0.25%,或者验证集占 0.4%,测试集占 0.1%。
**数据来源:**我建议大家要确保验证集和测试集的数据来自同一分布。但由于深度学习算法需要大量的训练数据,为了获取更大规模的训练数据集,我们可以采用当前流行的各种创意策略,例如,网页抓取,代价就是训练集数据与验证集和测试集数据有可能不是来自同一分布。
若无测试集,对于不需要无偏估计则可以不设置。所以如果只有验证集,没有测试集,我们要做的就是,在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,然后迭代并选出适用的模型。
在这里插入图片描述

1.2 偏差,方差(Bias /Variance)

在这里插入图片描述
最左未高偏差,最右为高方差。
理解偏差和方差的两个关键数据是训练集误差(Train set error)和验证集误差(Dev set error)。
在这里插入图片描述
以上分析的前提都是假设基本误差很小,训练集和验证集数据来自相同分布,如果没有这些假设作为前提,分析过程更加复杂。
在这里插入图片描述
这个图会产生高偏差,因为不能很好的拟合数据。
在这里插入图片描述
这个图则既有高偏差,又有高方差。

1.3 机器学习基础(Basic Recipe for Machine Learning)

初始模型训练完成后,我首先要知道算法的偏差高不高,如果偏差较高,试着评估训练集或训练数据的性能。如果偏差的确很高,甚至无法拟合训练集,那么你要做的就是选择一个新的网络,,或者花费更多时间来训练网络,或者尝试更先进的优化算法,一会儿我们会看到许多不同的神经网络架构,或许你能找到一个更合适解决此问题的新的网络架构,加上括号,因为其中一条就是你必须去尝试,可能有用,也可能没用,不过采用规模更大的网络通常都会有所帮助,延长训练时间不一定有用,但也没什么坏处。训练学习算法时,我会不断尝试这些方法,直到解决掉偏差问题,这是最低标准,反复尝试,直到可以拟合数据为止,至少能够拟合训练集。如果网络足够大,通常可以很好的拟合训练集,只要你能扩大网络规模,,如果你觉得基本误差不是很高,那么训练一个更大的网络,你就应该可以……至少可以很好地拟合训练集,至少可以拟合或者过拟合训练集。一旦偏差降低到可以接受的数值,检查一下方差有没有问题,为了评估方差,我们要查看验证集性能,我们能从一个性能理想的训练集推断出验证集的性能是否也理想,如果方差高,最好的解决办法就是采用更多数据,如果你能做到,会有一定的帮助,但有时候,我们无法获得更多数据,我们也可以尝试通过正则化来减少过合。但是,如果能找到更合适的神经网络框架,有时它可能会一箭双雕,同时减少方差和偏差。
俩点注意
第一点,高偏差和高方差是两种不同的情况,我们后续要尝试的方法也可能完全不同。通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法。
第二点,在机器学习的初期阶段,关于所谓的偏差方差权衡的讨论屡见不鲜,原因是我们能尝试的方法有很多。

1.4 正则化(Regularization)

深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据。
在这里插入图片描述
正则化只正则化w为了方便,也可以对b也进行。
L1正则化,会导致矩阵稀疏,就是0多,但没有降低占内存太多,不常用:
在这里插入图片描述
𝜆是正则化参数,是另外一个需要调整的超级参数
在这里插入图片描述
神经网络中的应用上图。
该矩阵范数被称作“弗罗贝尼乌斯范数”,用下标𝐹标注,它表示一个矩阵中所有元素的平方和。
该如何使用该范数实现梯度下降呢?
在这里插入图片描述
𝐿2正则化有时被称为“权重衰减”,之所以叫它“权重衰减”是因为这两项相等,权重指标乘以了一个小于 1 的系数。

1.5 为 什 么 正 则 化 有 利 于 预 防 过 拟 合 呢 ? ( Why regularization reduces overfitting?)

在这里插入图片描述
正则项,它可以避免数据权值矩阵过大,这就是弗罗贝尼乌斯范数,为什么压缩𝐿2范数,或者弗罗贝尼乌斯范数或者参数可以减少过拟合。直观上理解就是如果正则化𝜆设置得足够大,权重矩阵𝑊被设置为接近于 0 的值,直观
理解就是把多隐藏单元的权重设为 0,于是基本上消除了这些隐藏单元的许多影响。但若设置太大,会使,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近左图的高偏差状态。
但是𝜆会存在一个中间值,于是会有一个接近“Just Right”的中间状态。
直观理解就是𝜆增加到足够大,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了。神经网络变得更简单了。
用𝑔(𝑧)表示𝑡𝑎𝑛ℎ(𝑧),如果正则化参数 λ 很大,激活函数的参数会相对较小,因为代价函数中的参数变大了(W),这会导致Z处于线性区,前面讲过这样不好。在这里插入图片描述
在增加正则化项时,应用之前定义的代价函数𝐽,我们做过修改,
增加了一项,目的是预防权重过大。
在这里插入图片描述

1.6 dropout 正则化(Dropout Regularization)

正则化方法——“Dropout(随机失活)”
假设你在训练上图这样的神经网络,它存在过拟合,这就是 dropout 所要处理的,我们复制这个神经网络,dropout 会遍历网络的每一层,并设置消除神经网络中节点的概率。。假设网络中的每一层,每个节点都以抛硬币的方式设置概率,每个节点得以保留和消除的概率都是 0.5。
在这里插入图片描述
何实施 dropout的方法:
最常用的: inverted dropout(反向随机失活)
在这里插入图片描述
表示网络为3层,keep-prob表示某个隐藏单元保留的概率。最后让a3*=d3;
在这里插入图片描述
这一步是为了修正或弥补被消除的元素的带来误差。。反向随机失活(inverted dropout)方法通过除以 keep-prob,确保𝑎[3]的期望值不变。
Inverted dropout 函数在除以 keep-prob 时可以记住上一步的操作,目的是确保即使在测试阶段不执行 dropout 来调整数值范围。在这里插入图片描述在这里插入图片描述

1.7 理解 dropout(Understanding Dropout)

俩种认识:
在这里插入图片描述在这里插入图片描述
实施 dropout 的细节: 对于keep-prob,不同层可以选不同的值!对于参数集较大的W,那可以吧keep-prob便得小点,多失活一点W,然后对于少点W的,可以设置大点,对于完全不用担心的层,则可以设置1,不失活。每层 keep-prob 的值可能不同,们也可以对输入层应用 dropout,但不常用。
实施 dropout,在计算机视觉领域有很多成功的第一次,因为计算机视觉输入量大,但注意这是一个正则化方法,它有助于预防过拟合,因此除非算法过
拟合,不然我是不会使用 dropout 的。
dropout 一大缺点就是代价函数𝐽不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。
我通常会关闭 dropout 函数,将 keepprob 的值设为 1,运行代码,确保𝐽函数单调递减。然后打开 dropout 函数,希望在 dropout过程中,代码并未引入 bug。我觉得你也可以尝试其它方法,虽然我们并没有关于这些方法性能的数据统计,但你可以把它们与 dropout 方法一起使用。

1.8 其他正则化方法(Other regularization methods)

一.数据扩增
想通过扩增训练数据来解决过拟合,可以通过水平翻转图片、裁剪图片等方法来获得更多的数据。
二.early stopping
验证集误差通常会先呈下降趋势,然后在某个节点处开始上升,early stopping 的作用是,你会说,神经网络已经在这个迭代过程中表现得很好了,我们在此停止训练吧,得到验证集误差。在这里插入图片描述
说 early stopping 的主要缺点就是你不能独立地处理这两个问题,因为提早停止梯度下降,也就是停止了优化代价函数𝐽,因为现在你不再尝试降低代价函数𝐽,所以代价函数𝐽的值可能不够小,同时你又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题,这样做的结果是我要考虑的东西变得更复杂。
Early stopping 的优点是,只运行一次梯度下降,你可以找出𝑤的较小值,中间值和较大值,而无需尝试𝐿2正则化超级参数𝜆的很多值。
𝐿2正则化的缺点是去找λ的恰当值。。。。。

1.9 归一化输入(Normalizing inputs)

归一化需要两个步骤:
1.零均值
2.归一化方差;
在这里插入图片描述在这里插入图片描述
如果输入特征处于不同范围内,可能有些特征值从 0 到 1,有些从 1 到 1000,那么归一化特征值就非常重要了。如果特征值处于相似范围内,那么归一化就不是很重要了。一般就进行一下归一化,当做初始化。

1.10 梯度消失/梯度爆炸(Vanishing / Exploding gradients)

假设你正在训练这样一个极深的神经网络
在这里插入图片描述
此对于一个深度神经网络,𝑦的值将爆炸式增长。
就是说,太深的网络,可能会导致最后出现指数增长或指数级下降的问题。

1.11 神经网络的权重初始化(Weight Initialization for Deep Networks)

对于生梯度消失和梯度爆炸问题,有一个不完整的方案解决:在这里插入图片描述
对于Relu 激活函数:2/n
在这里插入图片描述
它适用于 tanh 激活函数,被称为 Xavier 初始化,
如果你想添加方差,方差参数则是另一个你需要调整的超级参数,可以给
在这里插入图片描述
希望你设置的权重矩阵既不会增长过快,也不会太快下降到 0,从而训练出一个权重或梯度不会增长或消失过快的深度网络。我们在训练深度网络时,这也是一个加快训练速度的技巧。

1.13 梯度检验(Gradient checking)

在这里插入图片描述
我使用双边误差在这里插入图片描述

在这里插入图片描述
否正确,经过一些调试,最终结果会是这种非常小的值(10−7),那么,你的实施可能是正确的。

1.14 梯 度 检 验 应 用 的 注 意 事 项 ( Gradient Checking Implementation Notes)

在这里插入图片描述
首先,不要在训练中使用梯度检验,它只用于调试。
第二点,如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug。
第三点,在实施梯度检验时,如果使用正则化,请注意正则项。
第四点,梯度检验不能与 dropout 同时使用,因为每次迭代过程中,dropout 会随机消除隐藏层单元的不同子集,难以计算 dropout 在梯度下降上的代价函数𝐽。
最后一点,也是比较微妙的一点,现实中几乎不会出现这种情况。当𝑤和𝑏接近 0 时,梯度下降的实施是正确的,在随机初始化过程中……,但是在运行梯度下降时,𝑤和𝑏变得更大。

返回目录

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞲_大河弯弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值