《深度学习工程师-吴恩达》02改善深层神经网络--超参数优化、batch正则化和程序框架 学习笔记

作者:jliang

https://blog.csdn.net/jliang3

《深度学习工程师-吴恩达》02改善深层神经网络--超参数优化、batch正则化和程序框架 学习笔记

 

 

1.重点归纳

1)经常需要调试的神经网络参数,重要性由高至低罗列

  • 学习率α

  • Momentum算法参数β、mini-batch size、隐藏单元数量

  • 层数、学习率衰减decay rate

  • Adam算法参数β1、β2和ε

2)调参方法

(1)网格搜索法,适用于参数数量较少时

(2)深度学习领域推荐采用随机参数,在参数空间中随机选取各个值,用这些随机取的点试验超参数的效果

(3)由粗糙到精细的策略

  • 步骤
    • 在整个参数取值空间粗略搜索
    • 然后聚焦到更小的方格中搜索参数,更密集地取点

   

  • 随机取值并不是在有效值范围内的随机均匀取值,而是选择合适的标尺来探索超参数
    • 把超参数取值分为多个区间,然后在区间中随机取值
    • 例子:学习率,取值范围是0.0001-1。把取值范围内划分为多个区间:0.0001-0.001, 0.001-0.01, 0.01-0.1, 0.1-1,然后在各个区间内分别随机取值。

3)在几个月后数据会逐渐改变,从而导致原有的超参数设定不再适用,也许只是需要重新测试/评估模型的超参数就可以,建议至少每隔几个月更新一次。

4)Batch归一化

(1)Batch归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,归一化后使学习问题的轮廓从长形变成圆形,更易于算法优化。

(2)在神经网络的在每一层激活函数之前进行数据归一化

(3)公式

          第i层归一化(均值为0,方差为1):

         均值:

         方差:

         改变均值和方差:

(4)有效的原因

  • 如果输入数据分布发生改变,模型无法很好的对数据进行预测。隐藏层的输入是由其前面的输入参数决定,学习过程中前面的参数一直在发生改变,所以隐藏层的输入数据分布也是一直在改变(covariate shift问题)。
  • batch归一化做的就是它减少这些隐藏值分布变化的数量,即使前面层参数的变化,隐藏层输入经过batch归一化后的数据保持均值和方差不变化的分布。 它限制了前面参数变化影响数值分布的程度。batch归一化减少了输入值改变的问题,让这些值更稳定,神经网络之后的层就会更稳定。即使输入分布改变一点,它会改变得更少。
  • 它使得网络每层都可以自己学习,稍稍独立于其他层,这有助于加速整个网络的学习。

(5)测试时

  • 每一层在所有mini-batch上都计算得到平均值和方差
  • 分别用每层的平均值和方差来对每层数据进行batch归一化

5)softmax输出数量与输入值数量(类别数量)一致,输出值代表输入该分类的概率,所有分类的概率总和等于1,适用于多分类。公式:a[l]=ez[l]i=1mez[l]

6)

2.调试处理

1)经常需要调试的神经网络参数

(1)参数

  • 学习率α
  • Momentum算法参数β
  • Adam算法参数β1、β2和ε
  • 层数
  • 隐藏单元数量
  • 学习率衰减decay rate
  • mini-batch size

(2)重要性(从上至下重要性降低)

  • 学习率α
  • Momentum算法参数β、mini-batch size、隐藏单元数量
  • 层数、学习率衰减decay rate
  • Adam算法参数β1、β2和ε

2) 最直接的调参方法就是网格搜索法,适用于参数数量较少时

3)深度学习领域推荐采用随机参数

(1)在参数空间中随机选取各个值,用这些随机取的点试验超参数的效果

(2)对于要解决的问题而言,很难提前知道哪个超参数最重要,一些超参数要比其它的更重要。例如超参数α和ε,如果α和ε都进行了5个值的尝试(共25次),对于重要性很高的α只尝试了5个不同的值。对于随机取值的方法,会尝试25个不同的α值,这样会更容易发现效果最好的值。

4)另一种方法是采用由粗糙到精细的策略

(1)步骤

  • 在整个参数取值空间粗略搜索
  • 然后聚焦到更小的方格中搜索参数,更密集地取点

(2)比如,在二维空间中,你会发现也许某点的效果比周围区域的其它点的效果都要好。如果你怀疑这些超参数这这附近有最优结果,接下来要做的就是放大这块小区域,然后更密集地取值(下面蓝色区域里)。

3.为超参数选择合适的范围

1)随机取值可以提升搜索效率,但随机取值并不是在有效值范围内的随机均匀取值,而是选择合适的标尺来探索超参数

(1)把超参数取值分为多个区间,然后在区间中随机取值

         例子1:学习率,取值范围是0.0001-1

  • 把学习率取值范围内划分为多个区间:0.0001-0.001, 0.001-0.01, 0.01-0.1, 0.1-1
  • 然后在各个区间内分别随机取值

例子2:加权移动平均参数Momentum算法参数β,取值范围0.9-0.999

  • 计算1-β,其取值范围是0.1-0.001
  • 划分取值区间:0.1-0.01, 0.01-0.001,对应β取值范围是:0.9-0.99, 0.99-0.999
  • 在各个区间内分别随机取值

注:基于公式1/(1-β),当β接近1时,β就会对细微的变化变得很敏感,所以在整个取值过程中,需要在接近1的区间内更加密集地取值

2)如果你不知道哪里才是合适的取值区间,如果取值数量较多的话,使用均匀取值也可以得到不错的效果。然后再由粗到细,聚焦到有用的超参数取值范围上。

4.超参数训练的实践

1)深度学习可以被应用到多个领域,某个应用领域的超参数设定可能在另一领域上也通用,可以参考不同领域的文章来获取灵感。

2)在已经训练好的模型中,也许在几个月后数据会逐渐改变,从而导致原有的超参数设定不再适用,也许只是需要重新测试/评估模型的超参数就可以,建议至少每隔几个月更新一次。

5.正则化网络的激活函数

1)Batch归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更庞大,工作效果也很好。

(1)公式:

         均值:

         方差:

(2)归一化后使学习问题的轮廓从长形变成圆形,更易于算法优化。

2)在实际应用中更多的是在神经网络的在每一层激活函数之前进行数据归一化(学术界中对于在激活函数之前或之后进行归一化存在争议)。

3)batch归一化

(1)公式

          第i层归一化(均值为0,方差为1):

         均值:

         方差:

(2)我们不想让隐藏单元总是均值为0和方差为1,也许隐藏单元有了不同的分布会更有意义,因此:

  • γβ是模型学习参数,可以随意设置分布的平均值和方差

(3)batch归一化的作用是它不只是用于归一化输入层,甚至适用于神经网络的深度隐藏层,但对隐藏层归一化不都是平均值为0和方差为1。

6.将Batch Norm拟合神经网络

1)每个隐藏层的输入前添加batch归一化

2)在tenseflow中只需一行代码实现batch归一化:tf.nn.batch-normalization

3)batch归一化通常和mini-batch梯度下降一起使用

(1)使用当前mini-batch输入层数据计算均值和方差,然后在后续的隐藏层中使用前面计算得到的均值和方差进行归一化。

         

(2)后续每一个mini-batch都重复上面的流程。

 

4)在归一化中由于有β参数存储,所以参数b可以删除,因为两者的作用一样,合并成一个参数

7. Batch Norm为什么奏效

1)如果输入数据分布发生改变,模型无法很好的对数据进行预测,如下图中在黑色猫图片上训练,无法很好的对彩色猫进行预测。

2)在神经网络隐藏层中,隐藏层的输入是由其前面的输入参数决定,学习过程中前面的参数一直在发生改变,所以隐藏层的输入数据分布也是一直在改变,也就是上面讨论到的covariate shift问题。

(1)batch归一化做的就是它减少这些隐藏值分布变化的数量,即使前面层参数的变化,隐藏层输入经过batch归一化后的数据保持均值和方差不变化的分布。 它限制了前面参数变化影响数值分布的程度。

(2)batch归一化减少了输入值改变的问题,让这些值更稳定,神经网络之后的层就会更稳定。即使输入分布改变一点,它会改变得更少。

(3)它使得网络每层都可以自己学习,稍稍独立于其他层,这有助于加速整个网络的学习。

3)batch归一化还有轻微正则化效果

(1)均值和方差都只在当前的mini-batch上计算。当数据中有一些噪声时,归一化的过程也会有一些噪声。

(2)这和dropout相似,它往每个隐藏层的激活值上增加了噪声,它使一个隐藏的单元以一定的概率乘以零。因为隐藏单元添加了噪声,迫使后续单元不过分依赖任何一个隐藏单元。

(3)但使用较大的mini-batch size时,会减少噪声,因此减少了正则化效果。

8.测试时的Batch Norm

1)在测试时需要对每个样本逐一处理,一个样本的均值和方差没有意义,用指数加权平均来估计。

(1)这个平均数和方差覆盖所有mini-batch

(2)每一层在所有mini-batch上都计算得到平均值和方差

(3)分别用每层的平均值和方差来对每层数据进行batch归一化

2)也可以使用全量训练数据计算平均值和方差,然后再使用它们来对隐藏层进行batch归一化

9.Softmax回归

1)softmax输出数量与输入值数量(类别数量)一致,输出值代表输入该分类的概率,所有分类的概率总和等于1,适用于多分类。

(1)公式:

(2)先对输出值z计算,然后再进行归一化(m为总的类别数)

2)例子:z -> t -> a

3)一个没有隐藏层的神经网络经过softmax后是一个线性多分类模型

10.训练一个Softmax分类器

1)softmax这个名称来源是与hard max对比的,hard max中每个样本只能属于一种分类(是或否),softmax所做的从输入z到这些概率的映射更为温和,给出了属于每种分类的概率(不只是“是”或“否”)。

2)当类别数量等于2时,softmax实际上变回到logistic回归。

3)神经网络损失函数一般使用交叉熵损失函数

11.深度学习框架

1)神经网络框架

  • Caffe/Caffe2
  • CNTK
  • DL4J
  • Keras
  • Lasagne
  • Mxnet
  • PaddlePaddle
  • Tensorflow
  • Theano
  • Torch

2)衡量这些框架好坏的一些标准

  • 方便编程
  • 高效运行
  • 是否开放,开放的框架不仅需要开源,而且需要良好的管理

 

 

猜你喜欢

转载自blog.csdn.net/jliang3/article/details/86175267