python课程第三周小结_第三周学习小结

改善深层神经网络:超参数调试、正则化以及优化

一、第一周-深度学习的实用层面

1.训练、验证、测试集

通常在进行深度学习的过程中,需要将数据集按照使用方法分成以下三个部分:

1.训练集(train set):对模型进行训练的部分数据。

2.验证集(development set):利用验证集或者又称为简单交叉验证集(hold-out cross validation set)进行交叉验证,选择出最好的模型。

3.测试集(test set):最后利用测试集对模型测试,获取模型的无偏估计。

验证集和测试集的区别:验证集用于进一步确定模型中的超参数(例如正则项系数、ANN中隐含层的节点个数等)而测试集只是用于评估模型的精确度(即泛化能力)

三种数据集在整个数据集中占的比例:

(1)在小数据时代如:100、1000、10000的数据量大小,可以将data做以下划分:

无验证集的情况:70% / 30%;

有验证集的情况:60% / 20% / 20%;

(2)在大数据时代,对于一个问题,拥有的数据量可能是百万级别的,所以验证集和测试集所占的比重会趋向于变得更小。

验证集的目的是为了验证不同的算法哪种更加有效,所以验证集只要足够大能够验证大约2-10种算法哪种更好就足够了,不需要使用20%的数据作为验证集。如百万数据中抽取1万的数据作为验证集就可以了。

测试集的主要目的是评估模型的效果,如在单个分类器中,往往在百万级别的数据中,我们选择其中1000条数据足以评估单个模型的效果。

100万数据量:98% / 1% / 1%;

超百万数据量:99.5% / 0.25% / 0.25%(或者99.5% / 0.4% / 0.1%)

注:建议验证集要和训练集来自于同一个分布,可以使得机器学习算法变得更快;

如果不需要用无偏估计来评估模型的性能,则可以不需要测试集。

2.偏差、方差

偏差(bias):描述的是预测值(估计值)的期望与真实值之间的差距。偏差越大,越偏离真实数据。

方差(variance):描述的是预测值的变化范围,离散程度,也就是离其期望值的距离。方差越大,数据的分布越分散。

三种数据的情况

从图中我们可以看出,在欠拟合的情况下,会出现高偏差。在过拟合的情况下,会出现高方差。从方差和偏差两者权衡的角度来讲,我们利用训练集对模型进行训练就是为了使得模型在训练集上使 偏差最小化,避免出现欠拟合的情况,但是如果模型设置的太复杂,虽然在训练集上偏差的值非常小,模型甚至可以将所有的数据点正确分类,但是当将训练好的模型应用在验证集上的时候,却出现了较高的错误率。这是因为模型设置的太复杂则没有排除一些训练集数据中的噪声,使得模型出现过拟合的情况,在验证集上出现高方差的现象。所以对于方差和偏差的权衡问题,对于模型来说是一个十分重要的问题。

总的来说我们的训练目标是训练出一个低方差和低偏差的模型。

3.机器学习的基本方法

在训练机器学习模型的过程中,解决High bias 和High variance 的过程:

1.是否存在High bias ?

解决方案:(1)增加网络结构,如增加隐藏层数目;

(2)训练更长时间;

(3)寻找合适的网络架构,使用更大的NN结构;

2.是否存在High variance?

解决方案:(1)获取更多的数据;

(2)正则化( regularization);

(3)寻找合适的网络结构;

在大数据时代,深度学习对监督式学习大有裨益,使得我们不用像以前一样太过关注如何平衡偏差和方差的权衡问题,通过以上方法可以使得再不增加另一方的情况下减少一方的值。

4.正则化

(1)Logistic regression

利用正则化来解决High variance 的问题,正则化是在 Cost function 中加入一项正则化项,惩罚模型的复杂度。即

逻辑回归L2正则化

其中λ为正则化因子

(2)Neural network

加入正则化项的代价函数:

网络中加入正则化项的代价函数

其中

其中w的矩阵大小为

,该矩阵范数被称作Frobenius norm

(3)Weight decay

加入正则化项的梯度:

则梯度更新公式变为:

代入可得

其中,(1-αλ/m)< 1,会给原来的Wl一个衰减的参数,所以L2范数正则化也被称为“权重衰减(Weight decay)”

5. 为什么正则化可以减小过拟合

对于神经网络的Cost function:

加入正则化项,直观上理解,正则化因子λ设置的足够大的情况下,为了使代价函数最小化,权重矩阵W就会被设置为接近于0的值。则相当于消除了很多神经元的影响,那么图中的大的神经网络就会变成一个较小的网络。

当然上面这种解释是一种直观上的理解,但是实际上隐藏层的神经元依然存在,但是他们的影响变小了,便不会导致过拟合。

数学解释:

假设神经元中使用的激活函数为g(z)=tanh⁡(z),在加入正则化项后:

当λ增大,导致W[l]减小,Z[l]=W[l]a[l−1]+b[l]便会减小,由上图可知,在z较小的区域里,tanh⁡(z)函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,从而不会发生过拟合。

6. Dropout 正则化

Dropout(随机失活)就是在神经网络的Dropout层,为每个神经元结点设置一个随机消除的概率,对于保留下来的神经元,我们得到一个节点较少,规模较小的网络进行训练。

(1)实现Dropout的方法:反向随机失活(Inverted dropout)

keep_prob = 0.8 # 设置神经元保留概率

d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob  #随机矩阵中所有位置的值与keep_prob比较并替换为比较结果,即小于keep_prob则为1,反之为0。

a3 = np.multiply(a3, d3)  #对应位置相乘,即保留为1的位置

a3 /= keep_prob

keep_prob = 0.8,那么就有大约20%的神经元被删除了,也就是说a[3]中有20%的元素被归零了,在下一层的计算中有Z[4]=W[4]⋅a[3]+b[4],所以为了不影响Z[4]的期望值,所以需要W[4]⋅a[3]的部分除以一个keep_prob。通过对“a3 /= keep_prob”,则保证无论keep_prob设置为多少,都不会对Z[4]的期望值产生影响。

(注:在测试阶段不要用dropout,因为那样会使得预测结果变得随机。)

(2)为什么使用dropout

从神经元的角度来看,dropout的方法与之前的加入正则化项的方法类似,都是消除很多神经元的影响,使一个大的网络变成小的网络。即dropout和L2范数都有收缩权重的效果,对于神经元较多的层会设置比较小的keep_prob,对于神经元比较多的层会设置比较大的keep_prob多为1.0。

(3)Dropout的缺点

dropout的最大的缺点就是其使 Cost function不能再被明确的定义,因为每次迭代都会随机消除一些神经元结点,所以我们无法绘制出每次迭代J(W,b)下降的图。

我们可以通过每次使用dropout后再设置keep_prob为1,运行代码后再计算J(W,b)来查看代价函数是否是单调减少的,后面再给keep_prob赋相应的值继续正则化。

7.其他正则化的方法

(1)数据扩增(Data augmentation)

通过图片的一些变换,得到更多的训练集和验证集。如镜像、旋转等。

更多数据

(2)Early stopping

在交叉验证集的误差上升之前的点停止迭代,避免过拟合。这种方法的缺点是无法同时解决bias和variance之间的最优。

Early stopping

8.归一化输入

归一化输入是为了让我们无论输入的值在什么位置都可以一相对较少的迭代次数来得到全局的最优解。如下图:

归一化和非归一化的区别

在图中可以看出不使用归一化和使用归一化前后Cost function 的函数形状会有很大的区别。

在不使用归一化的代价函数中,如果我们设置一个较小的学习率,那么很可能输入的值在椭圆的两个锐弧的地方的时候我们需要很多次迭代才能到达代价函数全局最优解;如果使用了归一化,那么无论从哪个位置开始迭代,我们都能以相对很少的迭代次数找到全局最优解。

9.梯度消失与梯度爆炸

如下图所示的神经网络结构,以两个输入为例:

简化的神经网络

为了方便假设g(z) = z,b[l] = 0,对于目标的输出有:

由于神经网络的层数很深,所以当W的值大于1的时候会出现多个大于1的值相乘,激活函数的值会以指数级递增,当W的值小于1的时候,多个小于一的数相乘,使激活函数以指数级递减,所以在计算梯度时,根据情况的不同,梯度函数会以指数级递增或者递减,导致训练导数难度上升,梯度下降算法的步长会变得非常非常小,需要训练的时间将会非常长。

在梯度函数上出现的以指数级递增或者递减的情况就分别称为梯度爆炸或者梯度消失。

10.利用初始化缓解梯度消失和爆炸的问题

当输入的n比较大时,我们希望每个wi的值都小一些,这样它们的和得到的z也较小。

这里为了得到较小的wi,设置Var(wi)=1/n,这里称为Xavier initialization。

对参数进行初始化:

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

这么做是因为,如果激活函数的输入xx近似设置成均值为0,标准方差1的情况,输出zz也会调整到相似的范围内。虽然没有解决梯度消失和爆炸的问题,但其在一定程度上确实减缓了梯度消失和爆炸的速度。其中不同的激活函数使用不同的Xavier initialization,如下。

不同激活函数的 Xavier initialization:

ReLU:

tanh:

n为输入的神经元个数

11.梯度的数值逼近

使用双边误差的方法去逼近导数:

由图可以看出,双边误差逼近的误差是0.0001,先比单边逼近的误差0.03,其精度要高了很多。

双边的导数定义:

单边的导数定义:

12.梯度检验

将所有的参数W[l]和b[l]reshape成一个大的向量

将所有的参数dW[l]和db[l]reshape成一个大的向量d

进行如下的梯度检验:

梯度检验

来判断

是否成立

由上述图中的公式

来判断。

其中

表示欧几里得范数,它是误差平方之和,然后求平方根,得到的欧氏距离。

13. 实现梯度检验 Notes

不要在训练过程中使用梯度检验,只在debug的时候使用,使用完毕关闭梯度检验的功能;

如果算法的梯度检验出现了错误,要检查每一项,找出错误,也就是说要找出哪个dθapprox[i]dθapprox[i]与dθdθ的值相差比较大;

不要忘记了正则化项;

梯度检验不能与dropout同时使用。因为每次迭代的过程中,dropout会随机消除隐层单元的不同神经元,这时是难以计算dropout在梯度下降上的代价函数J;

可以在随机初始化的时候运行梯度检验,或在训练几次后再进行。

二、第二周-优化算法

1.Mini-batch梯度下降算法

对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候,如有500万或5000万的训练数据,处理速度就会比较慢。但是如果每次处理训练数据的一部分即进行梯度下降法,则我们的算法速度会执行的更快。而处理的这些一小部分训练子集即称为Mini-batch。

对于普通的梯度下降法,一个epoch只能进行一次梯度下降;而对于Mini-batch梯度下降法,一个epoch可以进行Mini-batch的个数次梯度下降。

如下图左边是普通的batch梯度下降,右边是使用Mini-batch梯度下降:

两种方法的对比

batch梯度下降:

对所有m个训练样本执行一次梯度下降,每一次迭代时间较长,Cost function 总是向减小的方向下降。

随机梯度下降:

对每一个训练样本执行一次梯度下降,但是丢失了向量化带来的计算加速,Cost function总体的趋势向最小值的方向下降,但是无法到达全局最小值点,呈现波动的形式。

Mini-batch梯度下降:

选择一个1

下图是三种方法梯度下降的比较直观的表示

三种梯度下降的直观对比

Mini-batch 大小的选择

如果训练样本的大小比较小时,如m⩽2000时,选择batch梯度下降法;

如果训练样本的大小比较大时,典型的大小为:

2^6、2^7、⋯、2^10;

Mini-batch的大小要符合CPU/GPU内存。

2. 指数加权平均

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值