吴恩达深度学习笔记之改善神经网络(一)

来源:互联网 发布:万能游戏透视软件 编辑:程序博客网 时间:2024/06/09 19:37

1.1 Train/dev/test sets

在配置训练,验证,和测试数据集的过程中做出正确决策,会在很大程度上帮助大家创建高效的神经网络。训练神经网络的时候,我们需要做出很多决策。例如:神经网络分多少层,每层包含多少神经元,以及学习速率是多少。
实际上,应用型机器学习是一个高度迭代的过程,下面的示例图可以表示我们训练一个神经网路的过程。

这里写图片描述

当然最佳决策取决于我们拥有的数据量,应用深度学习是一个典型的迭代过程,需要很多次循环往复,才能为应用程序找到一个称心的神经网络,因此循环过程的效率是决定项目进度的关键因素,创建高质量的训练集,验证集,测试集有助于提高循环效率。
在机器 学习的小数据时代,通常做法是将所有数据三七分。如下所示:

这里写图片描述

但是在大数据时代,那么验证集合测试集数据总量的比例会变得更小。

总结一下:

在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分,数据规模相对较小的,适用传统的划分比例,数据规模较大的,验证集合测试集就可以占到20%或10%以下。其次要确保验证集和测试集的数据来自同意分布。

1.2 偏差和方差(bias and variance)

这一节我们对偏差和方差做一个简单的介绍。以一个简单的二分类为例。如下图所示:

这里写图片描述

上图中,第一种就是一种高偏差的情况,我们称之为欠拟合,第二种刚刚好,第三种是高方差的情况,我们称之为过拟合。
我们可以通过以下几个指标来研究偏差和方差,理解偏差和方差的两个关键数据是训练集误差和验证集误差。如下所示:

这里写图片描述

假设训练集误差为1%,但是验证集为误差为11%,此时,我们可能过度拟合了训练集,在某种程度上,验证集并没有充分利用交叉验证集的作用,像这种情况,称为高方差,如果训练集测试集误差都很高,则称为高偏差。也就是说,我们可以通过衡量训练集和验证集误差,我们可以得出不同结论。

注意

以上分析都是假设基本误差很小的情况下,其次训练集数据和测试集数据来自同一分布。

1.3 机器学习基础(Basic “recipe” for machine learning)

训练神经网络时可以用以下的基本方法,即初始模型训练完成后,我们首先妖之道算法的偏差高不高,如果偏差较高,试着评估训练集或训练数据的性能,如果偏差的确很高,甚至无法拟合训练集,那么我们要做的是选择一个新网络,比如含有更多隐藏层或者隐藏单元的网络,或者尝试更先进的优化算法。通常采用规模更大的网络会有用。进行不断尝试,直到解决偏差问题。一旦偏差降低到可以接受的程度,检查一下方差是否有问题,如果方差高,最好的方法是采用更多的数据,其次,我们可以通过正则化来减少过拟合

1.4 正则化(Regularization)

如果我们怀疑神经网络过度拟合了数据,即存在高方差问题,此时又没有更多的数据,那么最先想到的方法是通过正则化来减少过拟合。这也是非常可靠的方法,下面我们来看看正则化的原理。
我们以逻辑回归为例,求成本函数的最小值,如下:

J(w,b)=1mi=1mL(y^(i),y(i))+λ2mw22

加上后面的λ2mw22我们称之为L2正则化,L2正则化是最常见的正则化类型,还有一种L1正则化,如下所示:
J(w,b)=1mi=1mL(y^(i),y(i))+λ2mw1

如果用L1正则化,W最终会是稀疏的,也就是说w向量中有很多0,虽然这样与利于压缩模型,因为集合中参数均为0,存储中所占用的内存更少,实际上,却没有降低太多存储内存。
λ是正则化参数,我们通常使用验证集来配置这个参数,需要尝试各种各样的数据,寻找最好的参数,以上是在逻辑回归上实现正则化,那么如何在神经网络上实现正则化呢?

神经网络实现正则化

神经网络的成本函数如下:

J(w[1],b[1],,w[l],b[l])=1mi=1mL(y^(i),y(i))+λ2mw2F

其中
w2F=i=1n[l1]i=1n[l](w[l]ij)2

如何实现使用该范数实现梯度下降呢?我们用反向传播算法计算出dw的值,backprop会给出j对w的偏导数。如下:
dw[l]=(frombackprop)+λmw[l]

w[l]=w[l]αdw[l]
其中w[l]=w[l]αdw[l]就是我们额外增加的正则化项,其中λmw[l],这也是L2正则化有时被称为“权重衰减”的原因。

1.5 为什么正则化可以减少过拟合?(why regularization reduce overfitting)

我们先看一下神经网络的代价函数:

J(w[1],b[1],,w[l],b[l])=1mi=1mL(y^(i),y(i))+λ2mw2F

我们可以从上述公示中就是如果正则化λ设置的足够大,权重矩阵w被设置为接近于0的值,这样就可以消除隐藏层单元的许多影响,如果是这种情况的话,这个大大被简化的网络就会变成一个很小的网络,但是深度却很深如下图1所示,此时就会使这个网络从高方差状态更接近高偏差状态,但是λ会有一个中间值,于是就会接近“just right”的中间状态。

这里写图片描述
这里写图片描述

1.6 Dropout 正则化(Dropout regularization)

除了L2正则化外,还有一个好方法可以减少过拟合,即dropout(随机失活)。dropout会遍历网络的每一层,并设置消除神经网络中节点的概率,每个节点都以抛硬币的方式设置概率,设置完节点概率,我们会得到一个节点更少,规模更小的网络。如下所示:

这里写图片描述

1.7 理解dropout(understanding dropout)

上一小节,我们已经对dropout随机删除网络中的神经元有了一个直观了解,好像每次迭代之后,神经网络都会变得比以前更小,因此采用一个较小的神经网络和使用正则化的效果是一样的。第二个直观认识就是我们从单个神经元入手,我们看下面这个单个神经元。

这里写图片描述
这个单元的工作就是输入并生成一些有意义的输出,通过dropout该单元的某些输入可以被消除,因为输入的神经元可能会被消除,所以我们不愿意把所有赌注都放在某一个节点上,因为可能被删除,因此该单元将通过这种方式积极的传播开,并为单元增加权重,通过传播所有权重dropout将产生收缩权重的平方范数的效果。如下,可以调节每一层的keep-prob.
这里写图片描述

总结一下:

dropout的功能类似于L2正则化,与L2正则化不同的是,被应用的方式不同,dropout也会有所不同,甚至更适用于不同的范围,实施dropout的另一个细节是其中一个要选择的参数keep-prob他代表每一层保留单元的概率,所以不同的keep-prob也可以变化,dropout主要被应用计算机视觉当中。其次dropout一大缺点就是代价函数J不再被明确定义,每次迭代都会随机移除一些节点。

1.8 归一化输入(Normalizing inputs)

训练神经网络其中一个加速训练的方法就是归一化输入。我们来了解一下,假设我们有一个特征向量,他是二维的,如下:

这里写图片描述

归一化输入需要两个步骤:第一步就是零均值化,即执行μ=1mmi=1x(i)x=xμ直到变成上述图2部分。接着进行第二步即归一化方差,从上图中我们易知特征X1方差比特征X2的方差要大得多,我们要做的就是给δ赋值,使得δ2=1mmi=1x(i)2,注意:δ2,它的每一个特征都有方差。然后我们将每一个特征都除以δ2,即x=x/δ2,就会得到上述图3的样子,此时X1和X2的方法都等与1。

为什么要进行归一化?

我们先来看代价函数

J(w,b)=1mi=1mL(y^(i),y(i))

我们接着来看下面一张图:

这里写图片描述

如果我们不使用归一化输入的话,它的代价函数将会是上图中左边的样子,他是一个非常细长狭窄的代价函数。而如果使用了归一化,梯度下降法能更简单更快速。如右图所示。

1.9 梯度消失与梯度爆炸 (Vanishing/exploding gradient)

训练神经网络尤其是神经网路所面临的一个问题是梯度消失或梯度爆炸。导数或者坡度会以指数方式变大或变小。为了简单起见,我们以下面的神经网络为例。

这里写图片描述

由上图可知,如果对于一个深度神经网络来说,L值越大,那么y^也会越大,实际上它是以指数方式增长的,他增长的比率是wL,所以对于权重的选择,我们要么选比1大一点点,要么选比1小一点点。也因为如此,很长一段时间内,它是训练神经网络的一个阻力。

1.10 梯度检验(Gradient checking)

梯度检验可以帮我节省很多时间,也可以帮我发现backprop中的bug,接下来我们看看如何利用梯度检验来调试或者检验backprop的实施是否正确。假设我们的网络中含有如下参数,我们首先要做的就是把所有参数转换成一个巨大的向量。如下所示:

这里写图片描述

然后做一个连接运算,得到一个巨型向量θ,该向量表示为参数θ,代价函数J是所有w和b的函数,现在我们得到了一个θ的代价函数J,用他们来初始化大向量dθ,它与θ具有相同的维度。
同样地,把dw[l]转换成矩阵,db[l]已经是一个向量了,这样所有的dw都已是矩阵,这里需要注意的是dw[l]w[l]具有相同维度。我们可以把所有导数转换成一个大向量dθ,它与θ具有相同维度。现在的问题是dθ与代价函数J的梯度有什么关系。这就是实施梯度检验的过程。首先我们要清楚,J是超参数θ的一个函数,我们可以将J函数展开为J(θ1,θ2,θ3),不论超参数θ的维度是多少,为了实施梯度检验,我们要做的就是循环执行,从而会每个i,也就是每个θ组成的元素进行计算Dθapprox[i],在这里我们使用双边误差,如下所示:

这里写图片描述

然后我们要做的就是验证这些向量是否彼此接近,具体来说,就是计算两个向量的距离的欧几里得范数。如下所示:

这里写图片描述

这里先得到欧式距离,然后用向量做归一化,分母是用于预防这些向量太小或太大,我们实际执行这个方程式时,如果发现得到的值为107或者更小,这就很好。如果大的是103那就不正常了。

注意:

梯度检验和dropout不能同时使用,因为每次迭代的时候,dropout会随机消除隐藏层单元的不同子集,难以计算dropout在梯度下降上的代价函数J。

阅读全文
0 0
原创粉丝点击