吴恩达-DeepLearning.ai-Course2-Week3笔记

  本周课程记录如下:
1.      Hyperparameter tuning process

到目前为止,大家都知道调整神经网络的过程,包含了对很多不同超参数的设置,然而,你该怎样为这些参数找到比较合适的设定值呢?这里会分享一些指导原则以及系统化进行超参数调优的技巧,它们将帮助你更有地获得合适的超参数,面对大量的超参数,包括:学习率α,如果使用动量算法的话,还包含动量超参数β,还有Adam优化算法里的超参数β1,β2,还有Ɛ,也许还包括网络层数layers,以及每层网络中隐藏单元的数量hiddenunits,也许你还想使用学习率衰减leaning ratedecay,这种情况下不可能只有单一的学习速率α,接下来你需要选择Mini-batch的大小,根据实践经验,一部分超参数比其他的更加重要,对于大多数学习算法应用,学习率α是需要调优的超参数中最重要的一个,没有之一,除了阿尔法,动量项β也是一个比较重要的参数,以及Mini-batch的大小来保证优化算法的运行效率,还有隐藏单元的数量,如下图所示,重要程度从大到小为:红色框->橙色->紫色->无框


1.1如何选择超参数组合呢?

推荐方法1:如下图所示,随机选择一些点,同样的,我们选择25个点,然后在这些随机选取的点中,尝试所有的超参数,这样做的原因是事先你很难知道,在你的问题中,哪个超参数是最重要的,随机选择找到合适超参数的概率会大一点。当存在多个超参数的时候,比如三个的话,会在三维立方体中寻找,如下有右图所示


 

1.2区域定位抽样

另一个常见的做法是,使用区域定位的抽样方案,比如在下面这个二维的例子中,你抽取了这些点,发现右下角三个点效果很好,那么对这三个点所在的区域进行限定,然后在这个区域内进行密度更高的抽样,需要把更多的资源集中在这个蓝色方块中搜索,前提是你大体能确定这个区域内取的值能产生最优结果

 

2.      2.1Using an appropriate scaleto pick hyperparameters

随机抽样并不意味着在有效值范围内的均匀随机抽样(sampleing uniformly atrandom),相反,更重要的是选取适当的尺度(sacle),来研究这些超参数,这一节将展示这个方法:

Picking hyperparameters at random

假设你现在要选择第L层隐藏单元的个数n[l],再假设你认为50~100是个不错的范围,那么,参考数轴上从50~100的范围,也许你会在这个线段上随机地取一些数值,这是搜索这个超参数的非常直观的方法


或者如果你要决定神经网络的层数,用L来表示,也许你认为这个层数应该在2~4之间,那么均匀随机地抽样,即2,3,4这样也是合理的,或者甚至用网格搜索显式计算

所以这里有好几个例子说明在你所关注的域中,均匀随机抽样是合理的方案,但它并不是对所有的超参数都适用。

 

2.2Appropriate scale for hyperparameters

如上图所示,比如学习率α的下限是0.0001上限是1,第一条数轴中,均匀随机地抽取样本,那么90%的样本值将落到0.1~1的范围内,那么你会用90%的资源搜索0.1~1,10%的资源搜索0.00010.1显然是不太对,更合理的方法是以对数尺度(log scale)来搜索(第二条数轴),而不是用线性尺度(liner scale),那么你会有更多的资源致力于搜索每个区间,用Python实现就是:r=-4*np.random.rand()α=10^r,整理一下,要基于对数尺度取样,首先取得下限值,得到其对数a,再取上限值得到其对数b,然后对数尺度上在10^a~10^b范围内取样,即在a~b的范围内均随机地取r值,最后得到超参数值为10^r,这就是对数尺度上取样方法的实现。

2.3Hyperparameters forexponentially weighted averages

最后一个棘手的情况是超参数β的取样,β用于计算指数加权平均值,假设你认为β值应该在0.9~0.999之间,要记住的是,用0.9计算指数加权平均值,相当于计算最后10个值得平均值,比如计算10天气温的平均值,而使用0.999就相当于计算1000个值得平均值,如下,我们利用2.2的方法,就可以得到这个超参数在适当尺度上的随机取样值: 1-β=10^r, β=1-10^r

为什么上图中右上角的以线性尺度取样是个坏主意?这是因为随着beta趋近于1,其结果对于β的改变非常敏感,即使是对β非常小的改变,如果β从0.9变成0.9005,这没什么大不了的,你的结果几乎没有任何变化,但是如果β从0.999变成0.995,它将会对你正在运行的算法产生巨大的影响。那么上述整个取样过程所做的,就是使你在beta趋近于1的区域内以更大的密度取样,换一种说法,也就是在1-β趋近于0的时候,因此你能得到更高效的样本分布,即在搜索可能的超参数空间时更有效率。

下图为熊猫模式和鱼子酱模式:熊猫模式一般是计算资源不够,鱼子酱模式是具备很好的计算资源,可以尝试很多超参数组合,最终只要有一个损失函数满足即可

 

3.      BatchNormalization

在深度学习不断兴起的过程中,最重要的创新之一是一种叫批量归一化(Batch Normalization)的算法,可以让你的超参数搜索变得更简单,让你的神经网络变得更加具有鲁棒性,可以让你的神经网络对于超参数的选择上不再那么敏感,而且可以让你更容易的训练非常深的网络,下边是其原理:

你也许记得当训练一个模型比如说逻辑回归模型时(如下左图),对输入特征进行归一化可以加速学习过程,这意味着计算平均值,用训练集减去平均值,计算方差,然后用方差归一化你的数据集(如下图右边计算公式),在前边我们讲过这是如何让你的机器学习问题的图形从扁的变得更圆些,这会便于类似梯度下降的算法去做优化(如下图右边圆圈图形)

所以对于神经网络或者逻辑回归,针对输入值归一化处理时有用的,那么对于层数更多的模型呢?如下图,你不仅有输入特征值x,在这一层还有你还有激活函数的输出结果a[l],所以如果你想训练这些参数w[3],b[3],除非你能对a[2]进行标准差归一化,否则对于w[3],b[3]的训练都不会太有效率,

在上图逻辑回归的例子中,我们看到了对x1x2,x3做归一化可以对wb的训练更加有效,所以这里的问题是,对于任何一个隐藏层我们是否也可以对a的值做归一化呢,比如拿a[2]举例,对其归一化是否可以让w3b3的训练更快呢(因为a[2]是下一层的输入,它影响着你对w[3],b[3]的训练),这就是batchnorm,虽然在实际中我们归一化时针对的并不是a[2],而是z[2],对于在激活函数之前做归一化,也就是z[2],还是在激活函数之后做归一化,也就是a[2],这一点在学术界还是有争议的,实际中,对a[2]做归一化要普遍的多(推荐)

3.1Implementing Batch Norm

实现方法:

假使有一些神经网络中的中间值,隐藏单元z[1]z[m],这些来源于某一个隐藏层,所以更准确的写法是,为了简化,我们省略这个[l],当给你这些值时,你要做的是像如下公式这样计算平均值、方差、归一化:

 分母多加一项是为了防止为0

这样我们就把z归一化为一组均值为0,方差为1的值了,每一组z都是均值为0,方差为1,但我们并不希望所有的隐藏单元都是这样的,也许本身它们的分布就有不同,所以我们可以这样做:

这样我们就可以使用梯度下降算法或者其他类似算法比如:momentum梯度下降算法或者adam算法来更新伽玛和β的值,就像更新神经网络的权重一样,

如果让,那么可以算则不同的γβ可以让隐藏单元呈现不同的分布.

希望你从这里学到得是:如何对输入特征X做归一化来帮助神经网络的训练,以及batch nom所做的就是不仅仅在输入层,而且在一些隐藏层上也做归一化,但是输入层的归一化和隐藏层的归一化还是有一点不同,就是隐藏层归一化后并不一定时均值为0方差为1,比如你用的激活函数是sigmoid,你就不希望归一化后的值都聚集在如下图所示:

可能希望它们有更大的方差,以便于更好的利用sigmoid函数非线性的特征,而不是所有的值都在中间这段近似直线的区域上,这就是为什么设置γ和β,你可以控制z[i]在你希望的范围内,或者说它真正实现的是通过两个参数γ和β来让你的隐藏单元有可控的方差和均值,而这两个参数可以在算法中自由设置,目的就是可以得到一些修正的均值和方差,这意味可以使均值0方差1,也可以是被参数γ和β控制的其他值。(注意这里的β要和Adam/RMSprop/Momentum算法中的β区别开来)

 

4.      FittingBatch Norm into a neural network

 

假设我们有一个像下图这样的神经网络,我们都知道,每一个节点都可以看作是在计算两个事情,首先计算z,然后把z传递为激活函数来计算a,认为下图中每一个圆圈都代表两步计算,采用Batch Nom(BN)算法计算如下(在深度学习框架中可能一行代码就可以实现比如TensorFlow):

目前为止我们已经讲了在整个训练集上利用批量梯度下降的BN算法,事实上通常应用到训练集上的是少批量(mini-batch)BN算法。

所以在实际使用BN算法时,我们取第一个mini-batch并计算z1,和上图一样我们用参数w1b1,然后我们取一个适合的mini-batchX1并利用它计算Z1的均值和方差,接着BN算法就会减去均值,除以标准差,然后用参数γ和β来重新调整,从而得到下图中带波浪线的z,这些都是在第一个mini-batch上计算的,最终在一个mini-bath上计算梯度下降接着转到第二个mini-batch上也就是X2

现在要澄清一个细节:曾说过每一层的参数Wlbl以及β和γ,注意z是由下面的步骤计算得出的,但是BN算法所做的就是用mini-batch并且归一化z[l],来满足均值为0以及标准方差,然后通过β和γ来重新调整,这意味着,不管b[l]的值为多少,实际上都要被减去,因为经过BN这一步,我们将计算z[l]的均值并将减去b,所以在mini-batch中对所有的例子加上一个常量并不会改变什么,所以如果你使用BN算法,你可以忽略参数b,或者可以认为它永远等于0

 

总结如下:

 

5.      Whydoes Batch Norm work?

其中一个理由是我们看到经过归一化的输入特征(X表示),它们的均值为0,方差为1,这将大幅度加速学习过程,所以与其含有某些在01范围内变动的特征,或者11000范围内变动的特征,通过归一化所有输入特征X,让它们都拥有相同的变化范围将加速学习,BN有效的原因也是这个,只不过它应用于隐藏层的值,而不是这里输入特征,现在我所描述的只是BN算法所做的一部分,其他原因如下:

5.1.

如上图所示,第三层会受到第二层的影响,而第二层的值是不确定的,即从第三级隐藏层角度来看,这些隐藏单元值一直在变,所以它受协变量(协变量是一个独立变量<解释变量>不为实验者所操纵,但仍影响实验结果)的影响,所以BN算法所做的就是,它减少了这些隐藏单元值的分布的不稳定性,无论某一隐藏层的值怎么变,BN算法会保证均值和方差不变(0,1或者是γ和β控制的值),但这样做限制了先前层中参数的更新,对于第三层现在所看到和要学习的值的分布的影响,所以BN算法减少输入值变化所产生的问题,它的确使这些值变得稳定,所以神经网络的后层,可以有更加稳固的基础,尽管输入分布变化了,后面层适应前面层变化的力量被减弱,BN算法削弱了前边层参数和后边层参数之间的耦合,所以它允许网络中每一层独立学习,更加会提高学习速度,

5.2  BatchNorm as regularization

具有轻微的正则化效果(只是"副作用"而已)


 

6.      BatchNorm at test time

上侧公式是在整个最小批上计算的,但是在测试的时候你可能没有一个最小批64,128,256个实例来同时处理,所以你需要一种不同的方式来得到μ和σ^2,那么怎么做才便于我们在测试时使用我们的神经网络?我们需要一种单独的方式来估算μ和σ^2,我们是用指数加权平均数来估算的,这个平均数是根据最小批次来计算的,我们来选取一层L,假设我们现在处理最小批x[1],x[2]等等,以及它们相对应的Y值。然后我们用不同的最小批来训练神经网络时,我们会保持一个移动均值来记录每一层的μ和σ^2,最后在测试时,我们会用当前的z和之前训练的最新的μ和σ^2的指数加权平均数,来进行比例缩放(第三个公式),然后再计算,所以重点就是在训练时我们是用整个最小批,比如64个或者128个或者其他数量的训练实例来计算μ和σ^2,但在测试时,我们可能会需要处理单个测试实例,那么处理的方式就是通过训练集来估算μ和σ^2,

7.      Multi-classclassification

7.1 Softmax regression

到目前为止,我们已经讨论过的分类实例使用了二分类方法,也就是当你只有两分类标签的情况,如果我们有多种可能的分类目标呢?有一种更普遍的逻辑回归方法叫做softmax回归,这种方法让你试图预测一个多种分类中的类别时做出预测,而不是识别两类中的类别。

如下图所示,我们用C来表示你将要预测的总的类别数,这种情况下,你共有4个类别,其中包括了一类不属于三类中任何一类,


下图展示了softmax分类器在没有隐藏层的时候可以做什么,当然有的网络会更深,有更多的隐藏层,以及更多的隐藏单元,然后你就可以发现更复杂的非线性决策平面来区分,

7.1Training a softmax classifier

注意下面公式中的加权平均值,相加后结果为1

损失函数如下:

如上图所示,要想损失函数变小,那么就要足够大,即猫对应的概率越大(类似于最大似然估计)。注意一个细节,如下图,YYhat都是一个(C,m)矩阵

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值