深度学习吴恩达课程系列(3)

第二门课:改善神经网络

第一周:深度学习的实践层面

1.1训练,验证和测试集

总结一下,在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分,数据集规模相对较小,适用传统的划分比例,数据集规模较大的,验证集和测试集要小于数据总量的 20%或 10%。后面我会给出如何划分验证集和测试集的具体指导。

我建议大家要确保验证集和测试集的数据来自同一分布。

最后一点,就算没有测试集也不要紧,测试集的目的是对最终所选定的神经网络系统做出无偏估计,如果不需要无偏估计,也可以不设置测试集。

所以说,搭建训练验证集和测试集能够加速神经网络的集成,也可以更有效地衡量算法地偏差和方差,从而帮助我们更高效地选择合适方法来优化算法。

1.2偏差,方差

在这里插入图片描述
理解偏差和方差的两个关键数据是训练集误差(Train set error)和验证集误差(Dev set error)。

假定训练集误差是 1%,为了方便论证,假定验证集误差是 11%,们可能过度拟合了训练集,在某种程度上,验证集并没有充分利用交叉验证集的作用,像这种情况,我们称之为“高方差”。

假设训练集误差是 15%,我们把训练集误差写在首行,验证集误差是 16%,训练数据的拟合度不高,就是数据欠拟合,就可以说这种算法偏差比较高。相反,它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集的多了 1%,再举一个例子,训练集误差是 15%,偏差相当高,但是,验证集的评估结果更糟糕,错误率达到 30%,在这种情况下,我会认为这种算法偏差高,因为它在训练集上结果不理想,而且方差也很高,这是方差偏差都很糟糕的情况。

1.3机器学习基础

我通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方法。举个例子,如果算法存在高偏差问题,准备更多训练数据其实也没什么用处。

我们假定是这样,那么,只要正则适度,通常构建一个更大的网络便可以,在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。这两步实际要做的工作是:训练网络,选择网络或者准备更多数据。

我在课上不止一次提到了正则化,它是一种非常实用的减少方差的方法,正则化时会出现偏差方差权衡问题,偏差可能略有增加,如果网络足够大,增幅通常不会太高

1.4正则化

深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法。

2/𝑚乘以𝑤范数的平方,𝑤欧几里德范数的平方等于𝑤𝑗(𝑗 值从 1 到𝑛𝑥)平方的和,也可表示为𝑤𝑇𝑤,也就是向量参数𝑤 的欧几里德范数(2 范数)的平方,此方法称为𝐿2正则化。被称为向量参数𝑤的𝐿2范数。
在这里插入图片描述
我们不可能拟合所有参数,而𝑏只是单个数字,所以𝑤几乎涵盖所有参数,而不是𝑏,如果加了参数𝑏,其实也没太大影响,因为𝑏只是众多参数中的一个,所以我通常省略不计。

𝐿2正则化是最常见的正则化类型,你们可能听说过𝐿1正则化,在这里插入图片描述
在这里插入图片描述
如果用的是𝐿1正则化,𝑤最终会是稀疏的,也就是说𝑤向量中有很多 0,人们在训练网络时,越来越倾向于使用𝐿2正则化。

𝜆是正则化参数,我们通常使用验证集或交叉验证集来配置这个参数
在这里插入图片描述
𝑛[𝑙] × 𝑛[𝑙−1]的多维矩阵,𝑛[𝑙]表示𝑙 层单元的数量,𝑛[𝑙−1]表示第𝑙 − 1层隐藏单元的数量
在这里插入图片描述
该矩阵范数被称作“弗罗贝尼乌斯范数”,用下标𝐹标注,按照惯例,我们称之为“弗罗贝尼乌斯范数”,它表示一个矩阵中所有元素的平方和。

该如何使用该范数实现梯度下降呢?
是给𝑑𝑊加上这一项𝜆/𝑚*𝑊[𝑙],然后计算这个更新项,使用新定义的𝑑𝑊
在这里插入图片描述
在这里插入图片描述
我不打算这么叫它,之所以叫它“权重衰减”是因为这两项相等,权重指标乘以了一个小于 1 的系数。

1.5正则化预防过拟合的原因

直观上理解就是如果正则化𝜆设置得足够大,权重矩阵𝑊被设置为接近于 0 的值,直观理解就是把多隐藏单元的权重设为 0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近左图的高偏差状态。

但是𝜆会存在一个中间值,于是会有一个接近“Just Right”的中间状态。
在这里插入图片描述
总结一下,如果正则化参数变得很大,参数𝑊很小,𝑧也会相对变小,此时忽略𝑏的影响,𝑧会相对变小,实际上,𝑧的取值范围很小,这个激活函数,也就是曲线函数𝑡𝑎𝑛ℎ会相对呈线性,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合。

1.6dropout正则化

dropout 会遍历网络的每一层,个节点得以保留和消除的概率都是 0.5,设置完节点概率,我们会消除一些节点,然后删除掉从该节点进出的连线,最后得到一个节点更少,规模更小的网络,然后用 backprop 方法进行训练。
在这里插入图片描述

如何实施 dropout 呢?方法有几种,接下来我要讲的是最常用的方法,即 inverted dropout(反向随机失活)。我只举例说明如何在某一层中实施 dropout。首先要定义向量𝑑,𝑑[3]表示一个三层的 dropout 向量:
d3 = np.random.rand(a3.shape[0],a3.shape[1])

𝑑[3]是一个矩阵,每个样本和每个隐藏单元,其中𝑑[3]中的对应值为 1 的概率都是 0.8,对应为 0 的概率是 0.2,随机数字小于 0.8。

a3 =np.multiply(a3,d3),即让𝑑[3]中 0 元素与𝑎[3]中相对元素归零。

如果用 python 实现该算法的话,𝑑[3]则是一个布尔型数组,值为 true 和 false,

最后,我们向外扩展𝑎[3],用它除以 0.8,或者除以 keep-prob 参数。
𝑎3/= 𝑘𝑒𝑒𝑝 − 𝑝𝑟𝑜𝑏

这意味着最后被删除或归零的单元平均有 10(50×20%=10)个,现在我们看下𝑧[4],𝑧[4] = 𝑤[4]𝑎[3] + 𝑏[4],我们的预期是,𝑎[3]减少 20%,也就是说𝑎[3]中 有 20%的元素被归零,为了不影响𝑧[4]的期望值,我们需要𝑤[4]𝑎[3]/0.8

反向随机失活(inverted dropout)方法通过除以 keep-prob,确保𝑎[3]的期望值不变。

显然在测试阶段,我们并未使用 dropout,自然也就不用抛硬币来决定失活概率,以及要消除哪些隐藏单元了,因为在测试阶段进行预测时,我们不期望输出结果是随机的,如果测试阶段应用 dropout 函数,预测会受到干扰。

1.7理解dropout

总结一下,dropout 的功能类似于𝐿2正则化,与𝐿2正则化不同的是应用方式不同会带来一点点小变化,甚至更适用于不同的输入范围。

我用紫色线笔把它们圈出来,每层 keep-prob 的值可能不同。
在这里插入图片描述
注意 keep-prob 的值是 1,意味着保留所有单元,并且不在这一层使用 dropout,对于有可能出现过拟合,且含有诸多参数的层,我们可以把 keep-prob 设置成比较小的值,以便应用更强大的 dropout,有点像在处理𝐿2正则化的正则化参数𝜆,我们尝试对某些层施行更多

总结一下,如果你担心某些层比其它层更容易发生过拟合,可以把某些层的 keep-prob值设置得比其它层更低,缺点是为了使用交叉验证,你要搜索更多的超级参数,另一种方案是在一些层上应用 dropout,而有些层不用 dropout,应用 dropout 的层只含有一个超级参数,就是 keep-prob。

dropout 一大缺点就是代价函数𝐽不再被明确定义。

1.8其他正则化方法

  • 数据扩增
    除了水平翻转图片,你也可以随意裁剪图片,这张图是把原图旋转并随意放大后裁剪的,仍能辨别出图片中的猫咪。

对于光学字符识别,我们还可以通过添加数字,随意旋转或扭曲数字来扩增数据,把这些数字添加到训练集,它们仍然是数字。

因为在训练过程中,我们希望训练误差,代价函数𝐽都在下降,通过 early stopping,我们不但可以绘制上面这些内容,还可以绘制验证集误差,它可以是验证集上的分类误差,证集误差通常会先呈下降趋势,然后在某个节点处开始上升

当你还未在神经网络上运行太多迭代过程的时候,参数𝑤接近 0,迭代过程和训练过程中𝑤的值会变得越来越大,比如在这儿,神经网络中参数𝑤的值已经非常大了,所以 early stopping 要做就是在中间点停止迭代过程,我们得到一个𝑤值中等大小的弗罗贝尼乌斯范数,与𝐿2正则化相似,选择参数𝑤范数较小的神经网络,但愿你的神经网络过度拟合不严重。
在这里插入图片描述
但对我来说 early stopping 的主要缺点就是你不能独立地处理这两个问题,因为提早停止梯度下降,也就是停止了优化代价函数𝐽,因为现在你不再尝试降低代价函数𝐽,所以代价函数𝐽的值可能不够小,同时你又希望不出现过拟合,你没有采取不同的方式来解决这两个问题,而是用一种方法同时解决两个问题,这样做的结果是我要考虑的东西变得更复杂。如果不用 early stopping,另一种方法就是𝐿2正则化,训练神经网络的时间就可能很长。我发现,这导致超级参数搜索空间更容易分解,也更容易搜索,但是缺点在于,你必须尝试很多正则化参数𝜆的值,这也导致搜索大量𝜆值的计算代价太高。Early stopping 的优点是,只运行一次梯度下降,你可以找出𝑤的较小值,中间值和较大值,而无需尝试𝐿2正则化超级参数𝜆的很多值。

1.9归一化处理

归一化需要两个步骤:

  1. 零均值
  2. 归一化方差;

第一步是零均值化,𝜇 = 1 m \frac{1}{m} m1 ∑ i = 1 m \sum_{i=1}^m i=1m 𝑥 (𝑖)
在这里插入图片描述

第二步是归一化方差,注意特征𝑥1的方差比特征𝑥2的方差要大得多,我们要做的是给𝜎赋值,𝜎2 = 1 m \frac{1}{m} m1 ∑ i = 1 m \sum_{i=1}^m i=1m(x(i))2 ,这是节点𝑦 的平方,𝜎2是一个向量,它的每个特征都有方差.

所以如果输入特征处于不同范围内,可能有些特征值从 0 到 1,有些从 1 到 1000,那么归一化特征值就非常重要了。

1.10梯度消失\梯度爆炸

假设每个权重矩阵𝑊[𝑙] = [ 1.5 0 0 1.5 ] \left[ \begin{matrix} 1.5& 0\\0&1.5\end{matrix} \right] [1.5001.5],从技术上来讲,最后一项有不同维度,可能它就是余下的权重矩阵,𝑦 = 𝑊[1] [ 1.5 0 0 1.5 ] \left[ \begin{matrix} 1.5& 0\\0&1.5\end{matrix} \right] [1.5001.5](L-1)𝑥,因为我们假设所有矩阵都等于它,它是 1.5倍的单位矩阵,最后的计算结果就是y,也就是等于1.5(𝐿−1)𝑥。如果对于一个深度神经网络来说𝐿值较大,那么𝑦^的值也会非常大,实际上它呈指数级增长的,它增长的比率是1.5𝐿,此对于一个深度神经网络,𝑦的值将爆炸式增长。

相反的,如果权重是 0.5,𝑊[𝑙] = [ 0.5 0 0 0.5 ] \left[ \begin{matrix} 0.5& 0\\0&0.5\end{matrix} \right] [0.5000.5],它比 1 小,这项也就变成了0.5𝐿,矩阵𝑦 = 𝑊[1] [ 0.5 0 0 0.5 ] \left[ \begin{matrix} 0.5& 0\\0&0.5\end{matrix} \right] [0.5000.5](𝐿−1) 𝑥,再次忽略𝑊[𝐿],因此每个矩阵都小于 1,假设𝑥1和𝑥2都是 1,激活函数将变成 1 2 \frac{1}{2} 21 1 4 \frac{1}{4} 41 1 8 \frac{1}{8} 81等,直到最后一项变成 1 2 < s u p > L < / s u p > \frac{1}{2<sup>L</sup>} 2<sup>L</sup>1,所以作为自定义函数,激活函数的值将以指数级下降,它是与网络层数数量𝐿相关的函数,在深度网络中,激活函数以指数级递减。
在这里插入图片描述

1.11神经网络的权重初始化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.12梯度的数值逼近

首先说说如何计算梯度的数值逼近
在这里插入图片描述
所以在执行梯度检验时,我们使用双边误差,即上式。

1.13梯度检验

在这里插入图片描述
在这里插入图片描述

1.14梯度检验应用的注意事项

首先,不要在训练中使用梯度检验,它只用于调试。

第二点,如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug,也就是说,如果𝑑𝜃approx[𝑖]与𝑑𝜃[𝑖]的值相差很大,我们要做的就是查找不同的𝑖值,看看是哪个
导致𝑑𝜃approx[𝑖]与𝑑𝜃[𝑖]的值相差这么多。

第三点,在实施梯度检验时,如果使用正则化,请注意正则项。
在这里插入图片描述
第四点,梯度检验不能与 dropout 同时使用,因为每次迭代过程中,dropout 会随机消除隐藏层单元的不同子集,难以计算 dropout 在梯度下降上的代价函数𝐽。

当𝑤和𝑏接近 0 时,梯度下降的实施是正确的,在随机初始化过程中……,但是在运行梯度下降时,𝑤和𝑏变得更
大。可能只有在𝑤和𝑏接近 0 时,backprop 的实施才是正确的。是在随机初始化过程中,运行梯度检验,然后再训练网络,𝑤和𝑏会有一段时间远离 0,如果随机初始化值比较小,反复训练网络之后,再重新运行梯度检验

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

身影王座

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

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

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

打赏作者

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

抵扣说明:

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

余额充值