02.改善深层神经网络:超参数调试、正则化以及优化-深度学习的实用层面

1.1训练,验证,测试集

在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是人们常说的 70%验证集,30%测试集,如果没有明确设置验证集,也可以按照 60%训练,20%验证和 20%测试集来划分。这是前几年机器学习领域普遍认可的最好的实践方法。

但是当数据规模较大的时候(百万级),我们不太可能使用20%的数据进行测试,所以使用1万条数据即可,即1%

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

1.2 偏差,方差

高偏差的情况:就是欠拟合:

image-20200718163639130

初始模型训练完成后,我首先要知道算法的
偏差高不高,如果偏差较高,试着评估训练集或训练数据的性能。如果偏差的确很高,甚至无法拟合训练集,那么你要做的就是选择一个新的网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法

方差过高:过拟合:

image-20200718163712239

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

1.4 正则化

正则化用于处理过拟合的情况:

image-20200718164846442

1.5 为什么正则化有利于预防过拟合呢

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

总结一下,如果正则化参数变得很大,参数𝑊很小, 𝑧也会相对变小,此时忽略𝑏的影响,𝑧会相对变小,实际上,𝑧的取值范围很小,这个激活函数,也就是曲线函数𝑡𝑎𝑛ℎ会相对呈线性,整个神经网络会计算离线性函数近的值,这个线性函数非常简单,并不是一个极复杂的高度非线性函数,不会发生过拟合。

L1正则化

L1范数符合拉普拉斯分布,是不完全可微的。表现在图像上会有很多角出现。这些角和目标函数的接触机会远大于其他部分。就会造成最优值出现在坐标轴上,因此就会导致某一维的权重为0 ,产生稀疏权重矩阵,进而防止过拟合。

最小平方损失函数的L1正则化

image-20200824153434881

L2正则化

L2范数符合高斯分布,是完全可微的。和L1相比,图像上的棱角被圆滑了很多。一般最优值不会在坐标轴上出现。在最小化正则项时,可以是参数不断趋向于0,最后活的很小的参数。

在机器学习中,正规化是防止过拟合的一种重要技巧。从数学上讲,它会增加一个正则项,防止系数拟合得过好以至于过拟合。L1与L2的区别只在于,L2是权重的平方和,而L1就是权重的和。如下:

最小平方损失函数的L2正则化

image-20200824153455577

L1正则化

  • 优点:输出具有稀疏性,即产生一个稀疏模型,进而可以用于特征选择;一定程度上,L1也可以防止过拟合
  • 缺点:但在非稀疏情况下计算效率低

L2正则化

  • 优点:计算效率高(因为存在解析解);可以防止模型过拟合(overfitting)
  • 缺点:非稀疏输出;无特征选择
区别

1、L1正则化是模型各个参数的绝对值之和

L2正则化是模型各个参数的平方和的开方值

2、L1会趋向于产生少量的特征,而其他的特征都是0,产生稀疏权重矩阵。

L2会选择更多的特征,这些特征都会接近于0

1.6 dropout正则化

原理

就是在从网络的第一层开始对每一层的每一个节点进行一定概率的删除,这样的话每一层就会有一定数量的节点被随机删除,最后用这个精简之后的网络来进行后向传播,下次进行前向传播的时候还是一样的方法进行dropout随机删除节点。

实施

反向随机失活:

例子代码:

d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep_prob
a3 = np.multiply(a3,d3)
a3 = a3 / keep_prob
z4 = np.dot(w4,a3) + b4

第1步:新建一个大小和a3一样的概率矩阵,其实这一行代码,因为每次都是随机数,所以只能做到近似保留 keep_prob 这么多,比如, keep_prob=0.8可能d3只有79%的1,也就意味着只有79%的单元被保留,但是如果隐藏层单元数量越多,越能够逼近80%。

第2步,a3与d3点乘,即保留keep_prob 的单元,剩下的1−keep_prob 单元被失活。

第3步,因为有1−keep_prob 的单元失活了,这样a3的期望值也就减少了1−keep_prob, 所以我们要a3/keep_prob,这样a3的期望值不变。这就是inverted dropout。

注意事项

只有在训练网络的时候使用dropout,在测试集上(预测的时候)不要使用dropout,也就意味着我们在预测(分类)的时候,用训练好的参数做前向传播的时候,要把dropout关掉!

在网络中,不同层的keep_prob可以是不同的,比如在节点较多的层我们可以让keep_prob较小:0.5,在节点较少的层可以让keep_prob更接近于1

1.7 归一化输入

零均值化(移动)+归一化方差(变形)

目的是使得这个训练迭代的次数减少,更快地进行网络的训练

1.8 梯度消失与梯度爆炸

两种情况下梯度消失经常出现,一是在深层网络中,二是采用了不合适的损失函数,比如sigmoid。

梯度爆炸一般出现在深层网络权值初始化值太大的情况下,下面分别从这两个角度分析梯度消失和爆炸的原因。

1.深层网络角度

如果w大于1,那么层数增多的时候,最终的求出的梯度更新将以指数形式增加,即发生梯度爆炸,如果w小于1,那么随着层数增多,求出的梯度更新信息将会以指数形式衰减,即发生了梯度消失

从深层网络角度来讲,不同的层学习的速度差异很大,表现为网络中靠近输出的层学习的情况很好,靠近输入的层学习的很慢,有时甚至训练了很久,前几层的权值和刚开始随机初始化的值差不多。

2.激活函数角度

如果使用sigmoid作为损失函数,很容易发生梯度消失

1.9 神经网络的权重初始化为什么要随机初始化

原理

对于逻辑回归,把权重初始化为0当然也是可以的。

但是对于一个神经网络,如果你把权重或者参数都初始化为0,那么梯度下降将不会起作用

如果你要初始化成0,由于所有的隐含单元都是对称的,无论你运行梯度下降多久,他们一直计算同样的函数。这没有任何帮助,因为你想要两个不同的隐含单元计算不同的函数,

做法

你应该这么做:随机生成正态分布的靠近中间的数据,比如截断正态分布,但是数字不要太大,防止梯度消失

把W^([1])设为np.random.randn(2,2)(生成高斯分布),通常再乘上一个小的数,比如0.01,这样把它初始化为很小的随机数。

然后b没有这个对称的问题(叫做symmetry breaking problem),所以可以把 b 初始化为0

W^[1] =np.random.randn(2,2)*0.01,
b^([1])=np.zeros((2,1)) 
W^([2])=np.random.randn(2,2)*0.01, b^([2])=0

0.01的原因:w小的话,Z就比较小,这样的话如果使用的是sigmoid或者是tanh函数,不会出现梯度消失的情况。

1.10梯度的数值检验

使用双边检验的方法进行梯度的验证。

单边检验:只使用 θ \theta θ θ \theta θ+1来进行斜率的计算以此查看与两点之间的函数差

双边检验:使用 θ \theta θ-1、 θ \theta θ θ \theta θ+1,计算从 θ \theta θ+1到 θ \theta θ-1的斜率与这两点的函数差

1.11梯度检验(grad check)

首先,我们要清楚𝐽是超参数𝜃的一个函数,你也可以将𝐽函数展开为𝐽(𝜃1, 𝜃2, 𝜃3, … … ),不论超级参数向量𝜃的维度是 多少,为了实施梯度检验,你要做的就是循环执行,从而对每个𝑖也就是对每个𝜃组成元素计 算𝑑𝜃approx[𝑖]的值,我使用双边误差,也就是

image-20200919101350989

1.12梯度检验的注意事项

1.不要在训练中使用梯度检验,它只用于调试

2.如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug,也就是说,如果𝑑𝜃approx[𝑖]与𝑑𝜃[𝑖]的值相差很大,我们要做的就是查找不同的𝑖值,看看是哪个导致𝑑𝜃approx[𝑖]与𝑑𝜃[𝑖]的值相差这么多。举个例子,如果你发现,相对某些层或某层的𝜃或 𝑑𝜃的值相差很大,但是dw[𝑙]的各项非常接近,注意𝜃的各项与𝑏和𝑤的各项都是一一对应的, 这时,你可能会发现,在计算参数𝑏的导数𝑑𝑏的过程中存在 bug。反过来也是一样。

3.在实施梯度检验时,如果使用正则化,请注意正则项。如果使用了正则化,一定要记住这个正则项

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值