吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化

1. 系统组织超参调试Tuning process

1)深度神经网络的超参有学习速率、层数、隐藏层单元数、mini-batch大小、学习速率衰减、 β(优化算法)等。
其重要性各不相同,按重要性分类的话:
   第一类:最重要的参数就是学习速率α
    第二类:隐藏层单元数、mini-batch大小、β(优化算法)
    第三类:层数、学习速率衰减
2)如何选择调试的参数组合呢?
当超参较少时,传统的做法是在参数组成的网格中规则采样,比如有两个超参数,如下图左,然后尝试所有参数组合,选出表现最好的一组,这种方式在参数较少时表现不错,但是参数较多时就不太适用。
推荐的做法是随机选点,这样的做法好处是,即使尝试了相同数量的超参数组合,由于是随机选取,对于任何一个超参数来说其尝试的值会更多。比如对于只有两个超参数的情况,两种方式各尝试了25各组合,对于第一种方式来说每个参数都只尝试了5个不同的数,而随机选点,每个参数尝试的数会更多。

吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第1张图片

另一个常用的策略是,采用由粗糙到精细的策略,即先粗略采样尝试,发现几个表现不错的点,然后在那几个点附近密集采样,继续尝试。

2. Using a appropriate scale to pick hyperparameters选择合适的超参标尺

1)对于隐藏层层数、隐藏层单元数这种取值范围没有数量级差的超参,直接随机采样就可以

2)对于学习速率 α这种取值范围有数量级差的超参,如0.0001~1,相差了10^3,如果随机采样,那么90%的采样点都将在0.1~1的范围内,而我们更关注的表现可能更好的0.0001~0.1范围内的采样点仅有10%。所以对这种情况应该按数量级分段采样,如0.0001~0.001~0.01~0.1~1,这样分成四段分别随机采样。
编码时的做法是,用log找到数量级, 如果线性区间为[a, b],令m=log(a),n=log(b),则对应的数量级log区间为[m,n]。对log区间的[m,n]进行随机均匀采样,然后得到的采样值r,最后反推到线性区间,即 10r 10r 就是最终采样的超参数。

m = np.log10(a)

n = np.log10(b)
r = np.random.rand()
r = m + (n-m)*r
r = np.power(
10 ,r)
注意:除了 α 之外,动量梯度因子 β 也是一样,在超参数调试的时候也需要进行非均匀采样。一般 β 的取值范围在[0.9, 0.999]之间,那么 1β 的取值范围就在[0.001, 0.1]之间。那么直接对 1β 在[0.001, 0.1]区间内进行log变换,然后随机采样。
因为越靠近1,指数加权平均的个数变化越大,假设 β 从0.9000变化为0.9005,那么1/(1-β) 基本没有变化。但假设 β 从0.9990变化为0.9995,那么1/(1-β) 前后差别1000。 所以对 β 接近1的区间,应该采集得更密集一些。

3. Hyperparameters tuning in practice: Pandas vs. Caviar

建议每隔一段时间对超参数进行一次重新测试或评估。

对于如何搜索超参数,有两个主要的思想流派:

1)babysit one model,简单来说就是在一个模型不断的调试,先选择一组超参数建立一个模型,然后观察其效果,每天对其进行手动更改。适用于计算能力不足,不能在短时间内训练大量模型时。这种方式被称为Panda approach熊猫方式,因为熊猫的孩子非常少,通常只有一个,所以一般会花费大量心血,以确保其能成活。

2)实验多种模型,选择一组超参数建立模型,自动训练直至完成,画出学习曲线,然后换一组参数重复。这种方式被称为caviar strategy鱼子酱方式,产下很多卵,不会对任何一个多加照料,只期待其中一部分存活。
这两种方式的选择,取决于所拥有的的计算资源及应用。如果拥有足够强大的计算资源,那么鱼子酱模式是首选,但是如果计算资源不足够,或一些数据量非常巨大的应用,如在线广告设置及计算机视觉领域,熊猫方式通常更合适。 在熊猫方式中如果一段时间后发现也许重新建立一个模型更好,也可以重新建立一个模型。
吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第2张图片

4. Normalizing activations in a network--Batch Normalization

1)为什么?
Batch Normalization(batch归一化),可以是参数搜索问题变得容易,使神经网络对于选定的超参更加稳定,即使超参取值范围很大,也可以表现的很好,也使得神经网络乃至深度神经网络的训练更为容易。
我们已经归一化了输入值X,那么Can we nomalize the value of a/z, so as to train w and b faster?
关于是归一化z还是归一化a,也就是在激活函数之前归一化还是之后归一化,有一些争论,这里介绍的是在激活函数之前归一化,也就是归一化z,并推荐此种方法。
2)如何实现?implementing batch norm
吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第3张图片
这里的z是某一层的z,为了简化表达,省略的其所在的层号,这样计算下来,使得其均值为0,方差为1,但若是不想让隐藏单元的值均值为0方差为1,也许隐藏单元有了不同的分布会更有意义,这时可以这样做:

γ和β都是可学习的参数,使用梯度下降或其他优化方法,可以更新γ和β,就像更新w和b一样。注意γ的作用就是为新得到的z设置方差,β的作用就是为新得到的z设置均值,如果这样设置:

吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第4张图片
那么新得到的z将会和原来的z一样。
batch norm真正的作用,是使隐藏层单元值的均值和方差标准化。

5. Fitting Batch Norm into a neural network

本节讲的是如何在mini-batch中应用batch norm(BN),值得一提的是正向传播中Z[l]=W[l]A[l1]+b[l],但由于batch norm有去均值的操作,相当于把常数项b减掉了,所以这里的常数项可以去掉或设置为0,变为Z[l]=W[l]*A[l-1],常数项b的作用由β来代替,这样所有的参数就变为w、γ和β,在反向传播过程中利用优化算法对这几个参数进行迭代更新。

--正向传播:
X-->Z[1]=W[1]*X -->~Z[1](归一化,增加参数 γ1和β1)-->A[1]=g9~Z[1])-->Z[2]=W[2]*A[1]-->~Z[2](归一化,增加参数 γ2和β2)-->A[2]=g(~Z[2])……
(~Z表示batch归一化之后的Z)
--反向传播:
W[l]=W[l]-αdw
γ[l]=γ[l]-αdγ
β[l]=β[l]-αdβ

这里用的传统的梯度下降算法,也可以使用其他优化算法,如动量梯度下降、RMSprop或者Adam等。

6. Why does Batch Norm work?

原因之一:之前归一化是把输入特征做均值为0,方差为1的规范化处理,来加快学习速度。而Batch Norm也是对隐藏层各神经元的做类似的规范化处理。

原因之二:batch归一化使得权重比网络更深(deeper or later),使得后面的权重对前面权重的变化更具有鲁棒性。下面举例说明:

假如用一个浅层神经网络(比如逻辑回归)来训练猫的识别器。但是所有的训练样本都是黑猫。然后,用这个训练器来对各种颜色的猫进行测试,测试的结果可能并不好。这种训练样本(黑猫)和测试样本(各种颜色的猫)分布的变化称之为covariate shift。

这里写图片描述

对于这种情况,已经学习到了x到y的映射,如果x的分布发生了变化,一般是要对模型重新进行学习的,哪怕x到y的映射函数并没有变化,也需要重新学习才能有较好的效果。
在神经网络,尤其是深度神经网络中,在迭代过程中参数是不断更新的,对于某一个隐藏层来说,它的输入值就是不断在变化的,这就导致了covariate shift问题,而Batch Norm的作用恰恰是减小隐藏层数值(分布)变化的量,通过对隐藏层数值均值和方差的限定,使得其变化被控制在了很小的范围内,从而限制了由于前层权重更新在当前层引起的数值分布变化的程度,使得隐藏层数值更加稳定,减弱了前层参数作用和后层参数作用的联系,使得各层相对独立,可以自己学习,从而有助于加速整个网络的学习。

另外,Batch Norm也起到轻微的正则化(regularization)效果:

--batch归一化对Z的缩放是由某一mini-batch计算的均值和方差来决定的,而不是整个数据集的均值和方差,所以这样的均值和方差是含有一些噪声的
--由于均值和方差含有噪声,所以计算得来的Z也是有噪声的,相当于往每个隐藏层的激活值上随机添加了噪声,(这个dropout类似,dropout添加噪声的方式是使得一些隐藏层单元有一定概率乘以0,一些隐藏层单元有一定概率乘以1,所以dropout含多重噪声),batch归一化也含有多重噪声,去均值一重噪声,标准偏差又一重噪声。
--所以类似dropout,batch归一化也有正则化效果,由于添加噪声,使得后部单元不能过分依赖任何一个输入单元,但由于噪声很小,所以正则化效果也很微弱,实际中可以同时使用dropout和batch归一化。
--mini-batch size越大,如用512代替64,那么噪声就会减少,正则化效果就会更弱。

但是,正则化是Batch Norm的意外收获,不推荐把Batch Norm作为正则化的一种手段,batch norm真正的意义还在于归一化隐藏层单元激活值,加速学习。

7. Batch Norm at test time

训练过程中,Batch Norm是对某个mini-batch进行操作的,如计算均值方差,但在测试过程中,对单个样本,应该怎么做呢?


吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第5张图片

μσ2是对某个mini-batch中所有m个样本求得的。在测试过程中,如果只有一个样本,求其均值和方差是没有意义的,就需要对μσ2进行估计。估计的方法有很多,理论上我们可以将所有训练集放入最终的神经网络模型中,然后将每个隐藏层计算得到的μ[l]σ2[l]直接作为测试过程的μσ2来使用。但是,实际应用中一般不使用这种方法,而是使用之前介绍过的指数加权平均(exponentially weighted average)的方法来估计测试过程单个样本的μσ2

具体做法:对于第l层隐藏层,考虑所有mini-batch在该隐藏层下的μ[l]σ2[l],然后用指数加权平均的方式来预测得到当前单个样本的μ[l]σ2[l]。这样就实现了对测试过程单个样本的均值和方差估计。最后,再利用训练过程得到的γβ值计算出各层的z~(i)值。

8. Softmax Regression

logistics regression解决的是二分类问题,softmax regression解决的是多分类问题。
softmax可以理解为激活函数的一种,但是它是专门用于多分类神经网络的最后一层,对Z进行归一化,使得最终各项之和为1。


其计算方法很简单,就是在获得最后一层的Z[L]=W[L]*A[L-1]+b[L]之后进行如下计算:

吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第6张图片
输出层每个神经元的输出 a[L]i 对应属于该类的概率。

9. Training a softmax classifier

1)为什么叫softmax

softmax是为了和hard max对应,对于多分类最后结果,hard max选择可能性最大的一项设置为1,其余为0,而softmax则是列出属于各类的概率,方式相对温和一些。

吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第7张图片
C--类数

2)成本函数

对于单个样本,loss function:

吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第8张图片
对于整个数据集,成本函数cost function:
3)softmax的梯度
吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第9张图片


吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第10张图片
吴恩达《深度学习-改善深层神经网络》3--超参数调试、正则化以及优化_第11张图片


你可能感兴趣的:(深度学习)