吴恩达deep learning笔记第二课 改善深层神经网络:超参数调试、正则化以及优化

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

学习吴恩达DL.ai第二周视频笔记。

1.深度学习实用层面

在训练集和验证集来自相同分布的前提下,观察训练集的错误率和验证集的错误率判断过拟合(high variance高方差)还是欠拟合(high bias高偏差).

比如训练集错误率1%,验证集11%则过拟合(高方差)情况。

如果人眼可轻易识别图片训练后错误率15%,验证集16%,则欠拟合(高偏差)情况。

如果人眼可轻易识别图片训练后15%,验证集30%,则欠拟合和过拟合都存在(高方差和高偏差)。

选择一个网络模型后,如果一旦偏差较大,可以选择调整模型或者换网络,直到偏差降低到一定程度时,再观察方差的情况,即再一个训练集上可以取得不错的效果时,用验证集来测试,如果方差较大,可通过正则化,dropout或者增大数据集等方法来调整,不断的尝试,直到找到一个低偏差,低方差的模型。

L2正则化是训练深度学习模型最常用的方法。

一个建议:在regularization时,代价函数J需要加上相应的regularization项,如果不加会看不到loss单调递减的现象。

dropout也是计算机视觉常用的一种正则化。

Dropout使用时注意的细节:加入Dropout后损失函数J的公式会定义不再明确,定义明确的损失函数J图像是单调递减的,所以我们会失去调试工具, 通常会先关闭Dropout,即把dropout设为1,运行代码,确保损失函数单调递减,然后再打开代码加入dropout。

1.8其他正则化办法

其他减少过拟合的方法:Data augmentation(即通过翻转,裁剪等操作扩大数据集),early stoping(即x轴是迭代次数,y轴是错误率,画validation和train数据集错误率曲线,会发现train数据集错误率一直单调下降,而validation验证集错误率先下降,后因为overfitting上升,取中间转折点结束,但这有一个主要缺点,在中间结束意味着无法优化降低损失函数J, 无法优化。优点是相比于L2正则化,减少了调试次数,一次就找出W的较小值,中间值和较大值,无需多次运算调试L2正则化lambda的值 

1.9正则化输入

Normalizing training sets:分两步骤,第一步是零均值化,第二步是归一化方差,算出均值u和方差,在测试集和训练集上用同样的的这两个参数,而不是分别算。

在Unnormalize的情况下需要用很小的learningrate来下降,而normalize后梯度下降算法能够更直接的找到最小值,可以使用较大的学习率。

所以如果输入特征处于不同的范围,比如0-1和0-1000,那么归一化特征值就非常重要了。如果在相似范围,则不那么重要,但这列归一化并不会产生不好的影响,所以经常选择归一化处理。

1.10梯度消失和梯度爆炸

在反向传播的过程中,权重会指数型增长或者消失,从而大大增加神经网络训练时间和难度。

可以通过有效的初始化权重在一定程度上避免。

1.11神经网络权重的初始化

(因为一定程度上避免了梯度消失和爆炸,所以这是加快神经网络训练的办法

根据选用的激活函数如Relu或Tanh来选择权重初始化,如选择relu可以用W[l] = np.random.randn(shape ) + np.sqrt(2/n[l-1]).

如选择tanh则用根号(1/n[l-1]),即xavier initialation。

当然,这只是给了一个默认的权重起点,来减少梯度消失和梯度爆炸,训练出一个不会梯度爆炸或消失过快的网络

1.12梯度的数值逼近

在backprop时,有个操作叫梯度检验,它的作用是确保backprop正确实施,因为有时候写下backprop方程式不能确保操作时所有细节都是正确的,所以用梯度检验以确定backprop的正确,在了解梯度检验前先说一下如何对计算梯度做数值逼近。

会发现双边检验(第一张图,算出梯度3.0001)比单边检验(第二张图,算出梯度3.0301)更加精确。

1.13梯度检验(grad check)

梯度检验可以帮忙剑圣很多时间, 并还行啦backprop实施过程中的bug,

为了梯度检验,需要将网络中的W[1],b[1],W[2].b[2],,,W[L],b[L]参数转换成一个巨大的向量数据theta。

于是原来的J(W[1],b[1],W[2].b[2],,,W[L],b[L]) 变成了J(theta)

同时d(W[1])。。。。也组成了一个d(theta)

接下来就是梯度检验的过程

1.14关于梯度检验实现的注记

1.不要再训练中使用梯度检验,他只用于调试。(因为它太慢了,所以只在测试时开启,使用后关闭)

2.如果梯度检验失败了,要检查所有项,检查每一项,找出BUG。

即d(theata[i])与d(theata)的值相差很大,我们要做的就是查找不同的i值,看看是哪个数导致。

3.如果有正则化,记得代价函数的形式。比如有L2正则化,在求d(theta)时别忘了L2正则化带来的代价函数J的附加项

4.梯度检验不能和dropout同时使用,因为每次迭代时,dropout会随机消除隐层单元的不同子集,难以计算出代价函数J。使用梯度简单的时候,把dropout的keep_prob设为1.检验完再打开。

2.优化算法(即加快模型的训练速度)

能让神经网络运行的更快。使用好用的优化算法能大大提高大数据在深度网络模型的训练速度。

2.1.、mini-batch gradient descent(比batch gradient descent下降快很多)

如5000000个样本,分成5000个mini-batch,每个1000个。

for t = 1,2...5000,其中每一步是将1000个样本向量化后同时处理,而不是一个个处理。所以用了mini-batch相当于更新了5000次权重w和偏差b。

2.2理解mini-batch 梯度下降法

mini-batch因为每次训练的相当于不同的样本集,所以他的损失函数J图像是震荡着下降的。(震荡的原因是因为也许X[1],Y[1]mini-batch比较容易运算,而X[2],Y[2]mini-batch比较难运算,所以损失函数J比前面的大)

mini-batch的两种极端情况和一种适合的情况:

1.mini size=m(总数)时,即为batch gradient descent

2.mini size=1时,即为Stochastic gradient descent,因为相当于在不同的样本集训练,所以损失函数下降的时候波动厉害,有时向下,有时下降,总体向下,并且SGD永远不会收敛,会在最小值附近小范围波动。SGD虽然通过降低学习率也能改善噪声,但确定也很明显,会失去向量化带给你的加速。

实际上,mini size大小应该在1和m之间选取一个合适的值,使得损失函数J更快的走向最小值,在一些范围波动的时间变少,即使出现,也可以通过learningrate的减少来解决。

如下图3种颜色代表3种情况。

那怎么来选择minibatch的大小的:

1.如果总体训练集样本量较小时,直接用batch gradient descent,比如m<=2000时。

2.典型的minibatch size大小为:64,128,256,512。(考虑到计算机内存通常是2的次方),通常都尝试,来看哪个使得损失函数J的下降速度快并且波动小。

3.选区的minibatch要适合CPU/GPU memory。

2.3指数加权平均

如365天的气温a1,a2,a3....a365,可得一组加权平均数v0=0,v1=0.9*v0+0.1*a1,v2=0.9*v1+0.1*a2.....到v365=0.9*v364+0.1*a1,Vt可以看作1/(1-theta)的平均气温,其中此例theta为0.9,即vt = theta * vt-1 + (1 - theta) * at

当theta过大时,如0.98,则是50天的加权平均气温,曲线较为平缓。如下图绿线

当theta过小时,如0.5,则是2天的加权平均气温,曲线较为震荡。如下图黄线

取中间值较好,如0.9,10天,即红线

2.4理解指数加权平均

如下图所示,v100展开的公式如下:

会发现各项系数成指数关系,如beta(前面我叫theta)设置为0.9,会发现第十项,也就是0.9的十次方的时候系数只有0.34了,后面可以忽略不记,所以可以得到近10天的平均温度。

因为指数加权平均公式为vt = theta * vt-1 + (1 - theta)*  at

只占用单行数字的存储和内存,占用极少的内存,当然这不是最好,最精准的计算平均数的方法,如果要精准通过保存前10天或50天的数据取平均数更为精准,但是要保存这些数据,必须占用更多的内存。在下面要计算多个变量的平均值,指数加权平均是一个很好的方法。

2.5指数加权平均的偏差修正

还需要了解一个概念,叫偏差修正。如果你在意训练的初期情况,偏差修正就显得很重要,如果不在意,可以选择熬过初期。

因为在估测初期,如设v0的值为0,如果v1实际值为40,则v1=0.9 * v0 + 0.1 * 40 = 4。和实际的40相差很多,并且预测前期都有这个情况.

如果将公式再加上Vt = Vt/(1- beta^t)就可以完成偏差修正,在t较小时分母较小完成放大,在t较大时分母接近1无作用。

2.6动量梯度下降法(Momentum)

方法是利用计算梯度的指数加权平均数,并利用该梯度更新你的权重。这个算法大多情况下都好于没有momentum的梯度下降算法。

因为之前batch/mini batch gradient descent 都是摆动是接近最低点,通过加权平均后摆动区域平缓,接近最低点速度加快。即纵轴运动减少,横轴方向运动更快。

Momentum的一个本质:不是对所有情况都满足,能优化碗装结构,可以想象成给一个球一个向下的加速度。

会发现有两个超参数,beta和学习率lambda,beta常用值为0 .9(一般效果都不错),即平均迭代前面的十次梯度。并且一般不用偏差修正,十次后一般都过了初期。

其中紫色划掉和不划掉是两个版本,不划掉的好一点。

2.7RMSprop

希望W学习速度快,b学习减慢,  并且允许使用一个较大的学习率。

因为上述的希望,所以根据更新公式希望Sdw较小,Sdb较大,因为看图本来DW就较小,Db就较大(看斜率),所以这个更新公式满足了要求,并且加了一个小参数(约10的-8次)以防止分母为0.

2.8Adam优化算法

算是Momentum和RMSprop的结合。一遍用Adam要使用偏差修正。

Adam有四个超参数:1.学习率lambda,需要调试。2.beta1:常用值0.9,这是dw的移动平均数,也就是dw的加权平均数,是momentum设计的项。3.beta2:常用值0.999,这是dw^2的移动平均数。4.epsilon:常用值10的-8次方,防止分母为0.

综上:使用Adam时,参数beta1,beta2,epsilon不需要调整,只需试学习率lambda调整。

2.9学习率衰减

优化算法速度的一种方法就是随时间衰减学习率。

1.可以将学习率设为lambda = (1/(decay-rate * epoch-num))* lamda0。要调整的超参数试lamda0和decay-rate

2.或者下图的几种方法,如指数衰减exponential decay等。

吴恩达:虽然学习率衰减的确有很大助益,但不是优先超参数调整的方法。

2.10局部最优的问题

局部最优并不是高维图像应该考虑的问题。印象中二维的局部最优(左边图)并不是所有情况,比如20000维的时,并不可能每个点都是梯度为0(几率为2^20000分之一)可能在一部分为0,另一部分很大,就比如马鞍的中心点,也就是saddle point鞍点。此时要加快速度往两边下降,而不是局部最优。高维情况大多这样。

,就比如马鞍的中心点

第二章作业:见学习资料/吴恩达编程作业(jupyter notebook文件)

重要知识点:

1.生成mini_batch时要记住的两点:​

  • Shuffling and Partitioning are the two steps required to build mini-batches(记得先讲数据集打乱再取一个个mini_batch出来加入到mini_batches中)
  • Powers of two are often chosen to be the mini-batch size, e.g., 16, 32, 64, 128.

​​​​2.mini_batch与batch与SGD:

  • The difference between gradient descent, mini-batch gradient descent and stochastic gradient descent is the number of examples you use to perform one update step.
  • You have to tune a learning rate hyperparameter αα.
  • With a well-turned mini-batch size, usually it outperforms either gradient descent or stochastic gradient descent (particularly when the training set is large).

3.momentum要点:

Note that:

  • The velocity is initialized with zeros. So the algorithm will take a few iterations to "build up" velocity and start to take bigger steps.因为速度初始化为0,所以需要需要通过几轮去建立起速度(不用偏差修正),从而开始进行更大的步子(一开始更新小)。
  • If β=0, then this just becomes standard gradient descent without momentum.(只剩下dW)

How do you choose β?

  • The larger the momentum β is, the smoother the update because the more we take the past gradients into account. But if β is too big, it could also smooth out the updates too much.
  • Common values for β range from 0.8 to 0.999. If you don't feel inclined to tune this, β=0.9 is often a reasonable default.beta一般在0.8至0.999,一般0.9最好
  • Tuning the optimal β for your model might need trying several values to see what works best in term of reducing the value of the cost function J.如果要调整最佳theta,通过J减少最多来调节

What you should remember:

  • Momentum takes past gradients into account to smooth out the steps of gradient descent. It can be applied with batch gradient descent, mini-batch gradient descent or stochastic gradient descent.
  • You have to tune a momentum hyperparameter ββ and a learning rate αα.

4.If you run the model for more epochs on this simple dataset, all three methods will lead to very good results. However, you've seen that Adam converges a lot faster.如果你对模型在一个简单数据集上跑很多轮,三种方法都会有很好的结果,然后Adam收敛的快许多。

3.超参数调试、Batch正则化和程序框架

3.1调试处理

对于超参数而言,如何找到一套好的设定?下面是关于如何系统地组织超参调试过程的技巧

超参数有很多要调整,如学习率learning rate,momentum的beta,adam的beta1,beta2,epsilon,神经网络的layers和hidden units和mini-batch的大小,leaningrate decay

红色learningrate最为重要, 黄色三个其次重要,紫色第三位重要,其实用Adam时beta1,beta2,epsilon都不用调试,使用这三个数值即可。

比如两个超参数的调试,选择如下层次不齐的点(而不是均匀取值,因为比如每行每列均匀取5个点,共25个,则如果超参数1重要程度远大于超参数2,如学习率lambda和adam的epsilon。会发现只尝试了5种超参数1,而层次不齐时尝试了很多种),比如右下角几个点表现较好,就放大右下角部分再多取几个点,由粗到细。

3.2为超参数选择合适的范围(标尺)

尽量不要选均匀分割的办法。

如0.0001至1,不要均匀分布,而是取【-4,0】,由10的-4次方,10的-3次方,10的-2次方,10的-1次方,10的0次方这几个段种取点实验。

3.2超参数训练的实践:Pandas VS Caviar

方法一:panda通过不断加入新的方法或者参数观察损失函数J上升还是下降。

方法二:caviar鱼子酱,通过同时实验多种情况对比损失函数J。

3.4正则化网络的激活函数

Batch归一化(BN,Batch Norm)会使你的参数搜索问题变得很容易,对超参数选择更稳定,不仅仅是第一周说到的优化算法以快速找到最小值(碗)。

Batch归一化能将隐藏层的输入在特定的均值u和方差标准化。均值和方差由gama和beta两参数(也会反向更新)控制。实践中这些都不需要自己操控,都可通过框架实现,只需理解原理即可。

3.5将BN拟合进神经网络

在激活函数前进行BN是较为常见的方式。

过程是将输入归一化为均值0和方差的形式,再通过beta和gama缩放。这意味着无论b[l]是什么值,都会被减去(均值最后为0)。所以在用BN时b可以暂时置0

3.6Batch Normal(BN)为什么奏效?

加速网络只是BN作用的冰山一角,除了加速网络,BN还可以使权重比网络更滞后或更深层,即BN使得各隐藏层得到前面输出更加稳定(受同样的均值和方差影响),受影响幅度较小,使得后层的学习工作变得更容易些,各层更加独立学 习,有助于加速整个网络的学习。

BN也有一定的正则化效果,但比较小,可以跟dropout一起使用来达到较大的正则化效果,因为mini-batch时求得均值和方差只是一部分,相对于总体有一定的噪声,所以跟Dropout一样引入了一定的噪声来达到正则化的效果。

BN归一化将你的数据以mini-batch的形式逐一处理,在测试时,可能需要对每一个样本逐一处理,所以在测试时,需要做调整来应用batch归一化进行预测。

3.7 测试时的Batch Norm

BN归一化将你的数据以mini-batch的形式逐一处理,在测试时,可能需要对每一个样本逐一处理,所以在测试时,需要做调整来应用batch归一化进行预测。

因为对一个个单个样本求均值和方差再归一化没有意义,所以采用指数加权平均来求u和sigma squared(方差)的估值,再来算Znorm。

总结一下,就是训练时,u和sigma squared是在整个mini-batch上计算出来的。但在测试时,可能需要逐一处理样本,方法是根据训练集估算u和sigma squared,通常采用指数加权平均的方法,并可以在训练过程中追踪看到u和sigma squared。

3.8 softmax回归

前面都是二分类0和1。如果要分多类,有一种logistic回归的一般形式,叫做softmax回归,来识别多种分类。

会发现者之前的激活函数都是接受单行数值输入,如sigmoid和relu,输入一个实数,输出一个实数。而softmax特殊在是将结果归一化,要输入以个向量,最后输出一个向量。 

3.9训练一个softmax分类器

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值