网易云深度学习第二课notebook1

 2023-09-22 阅读 10 评论 0

摘要:改善深层神经网络:超参数调试、正则化以及优化 1.训练、验证、测试 对于一个dataset,我们通常将其划分为训练集、验证集、测试集 训练集(train set):用训练集对算法或者模型进行训练 验证集(development set):利用验证集或者成为交

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

1.训练、验证、测试
对于一个dataset,我们通常将其划分为训练集、验证集、测试集
训练集(train set):用训练集对算法或者模型进行训练
验证集(development set):利用验证集或者成为交叉验证集进行交叉验证,选择出最好的模型。
测试集(test set):训练好模型后,通过测试集进行测试。

2.偏差、方差
这里写图片描述
从图中我们可以看出,在欠拟合(underfitting)的情况下,出现高偏差(high bias)的情况,在过拟合(overfitting)的情况下,出现高方差(high variance)的情况。
从bias-variance tradeoff(权衡偏差方差)的情况下,我们利用训练集对模型进行训练是为了使得模型在trainset上使得bias最小化,避免欠拟合的情况。
如果模型设置的太复杂,trainset上的bias会非常小,甚至完全拟合。这时,将训练好的模型进行测试时,准确率会非常低。这是因为模型设置的太过复杂,以至于trainset中的噪音过多,使得模型过拟合,从而出现high variance.

3.机器学习的基本方法
这里写图片描述
(1)是否存在high bias?
增加网络结构(增加hidden layer层数)
训练更长时间
寻找合适的网络架构,使用更大的NN结构
(2)是否存在high variance?
获得更多数据
正则化
寻找合适的网络架构

4.正则化惩罚项(regularization)
正则化是在Cost Function中加入一项正则化项,惩罚模型的复杂度。
Logistic regression
加入正则化惩罚项的代价函数:
这里写图片描述
通常只对w进行正则化,而b不进行,因为w几乎涵盖所有参数,而b只是实数,当然加入b的正则化可行,只是没有太大影响。
||w||22:=w.Tw
这里写图片描述
其中λ是正则化因子,是超参数。
注意的是lambda在python中属于保留字。

加入正则化的代价函数:
这里写图片描述
frobenius norm 范数
人话:就是对应元素的平方和再开方
这里写图片描述

权重衰减(weight decay)
加入正则化后,梯度发生了变化:
这里写图片描述
这里写图片描述
其中(1-αλ/m)<1,这会使得原来的W衰减,所以L2范数正则化也被称为权重衰减。

5.为什么正则化可以减小过拟合
这里写图片描述
对于神经网络的Cost Function:
这里写图片描述
从式子来看,当正则化因子λ足够大时,为了使得损失函数最小化,权重矩阵W会被设置为接近于0的值。这相当于消除了很多神经元的影响。
这种解释是比较直观表面的,实际上隐藏层的神经元依然存在,只是他们的影响变小了,于是变没有导致过拟合。

数学解释:
激活函数g(z)=tanh(z),加入正则化后:
这里写图片描述
当λ增大,导致W减小,Z随之减小,由上图可知,在Z较小的区域内,tanh(z)函数近似于线性,所以每层的函数就近似于线性函数,整个神经网络就称为一个简单的近似线性神经网络,从而不会发生过拟合。

6.Dropout 正则化
Dropout(随机失活)就是在神经网络的Dropout层,为每个神经元节点设置一个随机消除的概率,对于保留下来的神经元,我们就得到了一个节点较小,规模较小的网络。
这里写图片描述

Dropout算法:反向随机失活(Inverted dropout)
假设对 layer3 进行dropout:

keep_prob = 0.8  # 设置神经元保留概率
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
a3 /= keep_prob

为什么需要有a3/keep_prop?
依然代码中的keep_prop=0.8,那么大约有20%的神经元被删除了,也就是说a3中有20%的元素被归零了,在下一层的计算中有Z[4]=W[3]*a[3]+b[4],为了不影响Z[4]的期望值,所以需要对W[4]*a[3]的部分除以一个keep_prop
注意:在测试阶段不要使用dropout,那样会使得预测结果变的随机。

7.理解Dropout
另外一种对于Dropout的理解,这里我们以单个神经元入手,单个神经元的工作是接受输入,并产生一些有意义的输出,但是假如Dropout后,输入的特征可能会被随机清除,所以该神经元不会再依赖于任何一个输入特征,也就是说不会给任何一个输入特征设置太多的权重。
所以通过传播过程,dropout和L2正则化有相同的收缩权重的效果。

缺点:
dropout的缺点是使得Cost Function不能再被明确定义,因为每次迭代都会随机消除一些神经元,所以我们无法绘制出J(W,b)稳定下降的直观图。
使用Dropout的方法:
关闭dropout功能,即设置keep_prop=1
运行代码,确保J(W,b)函数单调递减
再打开dropout函数

8.其他正则化方法
数据扩增(Data augmentation):通过图片的一些变换,得到更多的训练集和验证集;
Early stopping:在交叉验证集的误差上升之前的点停止迭代,避免过拟合。这种方法的缺点是无法同时解决bias和variance之间的最优。

9.归一化输入
对数据集特征x1、x2归一化的过程
这里写图片描述
(1)计算每个特征所有样本数据的均值:μ=1/m∑x(i);
(2)减去均值得到对此的分布:x:=x−μ;
(3)归一化方差:
这里写图片描述

使用归一化的原因:
这里写图片描述
在不适用归一化的代价函数中,如果我们设置一个较小的学习率,那么我们可能需要多次迭代才能到达代价函数的全局最优解,如果使用归一化,那么无论从哪个位置开始迭代,我们都能以相对少的迭代次数找到全局最优解。

10.梯度消失和梯度爆炸
这里写图片描述
这里我们首先假定g(z)=z,b[l]=0,所以对于目标输出有:
这里写图片描述
W[l]>1时,激活函数的值将会以指数递增。
W[l]<1时,激活函数的值将会以指数递减。
上面的情况对于导数也是同样的道理,所以计算梯度时,根据情况的不同,梯度函数会以指数递增或者指数递减,导致训练导数的难度上升,梯度下降算法的步长会变的非常非常小,需要训练的时间会非常长。
在梯度函数上出现以指数级递增或者递减的情况分别被称为梯度爆炸和梯度消失。

11.利用初始化缓解梯度消失和爆炸问题
这里写图片描述
由上图可知,当输入的数量n较大时,我们希望每个wi的值都小一些,这样它们的和得到的z也较小。
这里为了得到较小的wi,设置Var(wi)=1/n
对参数进行初始化:

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

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

12.梯度的数值逼近
使用双边误差的方法去逼近导数:
这里写图片描述
由图可以看出,双边误差逼近的误差是0.0001,先比单边逼近的误差0.03,其精度要高了很多。
这里写图片描述

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/82368.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息