2.3)深度学习笔记:超参数调试、Batch正则化和程序框架

目录

1)Tuning Process

2)Using an appropriate scale to pick hyperparameters

3)Hyperparameters tuning in practice: Pandas vs. Caviar

4)Normalizing activations in a network(重点)

5)Fitting Batch Norm into a neural network

6)Why does Batch Norm work?

7)Batch Norm at test time

8) Softmax Regression

9) Training a softmax classifier

10)Deep learning frameworks

11)TensorFlow

12)Summary


以下笔记是吴恩达老师深度学习课程第二门课第三周的的学习笔记:Hyperparameter tuning。笔记参考了黄海广博士的内容,在此表示感谢。


本周课程,重点介绍了三个方面的内容:超参数调试、Batch正则化和深度学习程序框架

1)Tuning Process

深度神经网络调试时会遇到许多超参数(Hyperparameters),具体有:

\alpha:学习因子(第一重要)

β:动量梯度下降算法参数(默认为0.9)

\beta_1,\beta_2,\varepsilon:Adam算法参数(默认为0.9,0.999,10^{(-8)})

layers:神经网络层数

hidden units:隐藏层神经元个数

learning rate decay:学习因子下降参数

mini-batch size:批量训练样本包含的样本个数

在实际训练模型中如何选择和调试超参数呢?传统做法为对每个参数等距离选取任意个数的点,然后,分别使用不同点对应的参数组合进行训练,最后根据验证集上的表现好坏,来选定最佳的参数。例如有两个待调试的参数,分别在每个参数上选取5个点,这样构成了5x5=25中参数组合,如下图所示:

这种做法在参数比较少的时候效果较好。但是在深度神经网络模型中,一般不采用这种均匀取点的方法,比较好的做法是使用随机选择。也就是说,对于上面这个例子,随机选择25个点,作为待调试的超参数,如下图所示:

随机化选择参数的目的是为了尽可能地得到更多种参数组合。如果使用均匀采样的话,每个参数只有5种情况;而使用随机采样的话,每个参数有25种可能的情况,因此更有可能得到最佳的参数组合

这种做法带来的另外一个好处就是对重要性不同的参数之间的选择效果更好。假设hyperparameter1为α,hyperparameter2为ε,显然二者的重要性是不一样的。如果使用第一种均匀采样的方法,εε的影响很小,相当于只选择了5个α值。而如果使用第二种随机采样的方法,ε和α都有可能选择25种不同值。这大大增加了α调试的个数,更有可能选择到最优值。

在经过随机采样之后,我们可能得到某些区域模型的表现较好。然而,为了得到更精确的最佳参数,我们应该继续对选定的区域进行由粗到细的采样(coarse to fine sampling scheme)。也就是放大表现较好的区域,再对此区域做更密集的随机采样。


2)Using an appropriate scale to pick hyperparameters

随机取值可以提升你的搜索效率。但随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺,用于探究这些超参数,这很重要。
对于像神经网络层数隐藏层神经元个数这样的超参数可以采用随机均匀取值的方法,但是对于学习率这样的超参数,假设其取值范围在(0.0001,1)之间,画一条数轴的话,其90%的数值将会落在(0.1,1)之间,而在(0.0001,0.1)之间只占有10%的资源,这看上去不太合理。

反而,使用对数标尺搜索超参数的方式会更合理,分别依次抽取0.0001,0.001,0.01,0.1,1,在对数轴上随机取点。在Python中我们可以将对数坐标下最小值设为a,最大值设为b,在a,b间随意均匀的选取r(random)值,再将超参数设为10^r,代码如下:

r = np.random.rand()
r = a + (b-a)*r
r = np.power(10,r)

除了α之外,动量梯度因子β也是一样,在超参数调试的时候也需要进行非均匀采样。一般β的取值范围在(0.9, 0.999)之间,那么1−β的取值范围就在[0.001, 0.1]之间。那么直接对1−β在[0.001, 0.1]区间内进行log变换即可。


3)(Hyperparameters tuning in practice: Pandas vs. Caviar)

经过调试选择完最佳的超参数并不是一成不变的,一段时间之后(例如一个月),需要根据新的数据和实际情况,再次调试超参数,以获得实时的最佳模型。

在训练深度神经网络时,一种情况是受计算能力所限,我们只能对一个模型进行训练,调试不同的超参数,使得这个模型有最佳的表现。我们称之为Babysitting one model。另外一种情况是可以对多个模型同时进行训练,每个模型上调试不同的超参数,根据表现情况,选择最佳的模型。我们称之为Training many models in parallel。使用哪种模型是由计算资源、计算能力所决定的。


4)Normalizing activations in a network(重点)

在深度学习兴起后,最重要的一个思想是它的一种算法,叫做 Batch 归一化,由 Sergey loffe 和 Christian Szegedy 两位研究者创造。Batch 归一化会使你的参数搜索问题变得很容易,使神经网络对超参数的选择更加稳定,超参数的范围会更加庞大,工作效果也很好。

当训练一个模型,比如 logistic 回归时,你也许会记得,归一化输入特征可以加快学习过程。首先计算平均值,从训练集中减去平均值,再计算方差,接着根据方差归一化数据集。但是对于深度神经网络来说,不仅需要归一化输入特征值x,而且每层还有激活值a^{[i]]},是否归一化激活值可以加快参数w^{[i+1]},b^{[i+1]}的训练?在实际应用中,一般是对z^{[i]}进行标准化处理而不是a^{[i]}

Batch Normalization对第l层隐藏层的输入z^{[l-1]}做如下标准化处理,这里忽略上标[l-1]

\mu=\frac{1}{m} \sum_{i}z^{(i)}

\sigma^{2}=\frac{1}{m} \sum_{i}\left(z_{i}-\mu\right)^{2}

z_{\text {norm}}^{(i)}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}}

这里为了防止\sigma为0,我们引入一个常数\varepsilon。但是,大部分情况下并不希望所有的z^{[i]}均值都为0,方差都为1。通常需要对z^{[i]}进行进一步处理:

\overline{z}^{(i)}=\gamma \cdot z_{n o r m}^{(i)}+\beta

式中\gamma, \beta为学习参数,也可以通过梯度下降算法等求得。这里,\gamma, \beta的作用是让\overline{z}^{(i)}的均值和方差为任意值,只需调整其值就可以了。例如,令

\gamma=\sqrt{\sigma^{2}+\varepsilon}, \quad \beta=u

则 \overline{z}^{(i)}=z^{(i)}。但是输入层的标准化处理和隐藏层的标准化处理是有区别的,一般输入层的标准化处理后均值为0,方差为1,而隐藏层我们希望得到非线性输出,则希望归一化处理后不再线性区域内。


5)Fitting Batch Norm into a neural network

对于L层神经网络,经过Batch Norm的作用,整体流程如下:

Batch 归一化是发生在计算z,a之间的。和w,b等参数一样,我们也可以用前面学到梯度下降算法,RMSprop和Adam等优化算法来迭代。


6)Why does Batch Norm work?

我们可以把输入特征做均值为0,方差为1的规范化处理,来加快学习速度。而Batch Norm也是对隐藏层各神经元的输入做类似的规范化处理。总的来说,Batch Norm不仅能够提高神经网络训练速度,而且能让神经网络的权重W的更新更加“稳健”,尤其在深层神经网络中更加明显。

举个例子来说明,假如用一个浅层神经网络来训练识别猫的模型。如下图所示,提供的所有猫的训练样本都是黑猫。然后,用这个训练得到的模型来对各种颜色的猫样本进行测试,测试的结果可能并不好。其原因是训练样本不具有一般性(即不是所有的猫都是黑猫),这种训练样本(黑猫)和测试样本(猫)分布的变化称之为covariate shift。

对于这种情况,如果实际应用的样本与训练样本分布不同,即发生了covariate shift,则一般是要对模型重新进行训练的。在神经网络,尤其是深度神经网络中,covariate shift会导致模型预测效果变差。而Batch Norm的作用恰恰是减小covariate shift的影响,让模型变得更加健壮,鲁棒性更强。Batch Norm减少了各层w^{[l]},b^{[l]}之间的耦合性,让各层更加独立,实现自我训练学习的效果。也就是说,如果输入发生covariate shift,那么因为Batch Norm的作用,对个隐藏层输出z^{[l]}进行均值和方差的归一化处理。

从另一个方面来说,Batch Norm也起到轻微的正则化(regularization)效果。具体表现在:

  • 每个mini-batch都进行均值为0,方差为1的归一化操作
  • 每个mini-batch中,对各个隐藏层的z^{[l]}添加了随机噪声,效果类似于Dropout
  • mini-batch越小,正则化效果越明显

但是,Batch Norm的正则化效果比较微弱,正则化也不是Batch Norm的主要功能。


7)Batch Norm at test time

Batch 归一化将你的数据以 mini-batch 的形式逐一处理,但在测试时,你可能需要对每个样本逐一处理,我们来看一下怎样调整你的网络来做到这一点。

首先,回顾一下训练过程中Batch Norm的主要过程: 

\mu=\frac{1}{m} \sum_{i}z^{(i)}

\sigma^{2}=\frac{1}{m} \sum_{i}\left(z_{i}-\mu\right)^{2}

z_{\text {norm}}^{(i)}=\frac{z^{(i)}-\mu}{\sqrt{\sigma^{2}+\varepsilon}}

\overline{z}^{(i)}=\gamma \cdot z_{n o r m}^{(i)}+\beta

在测试时,如果你只有一个样本,一个样本的均值和方差没有意义。那么实际上,为了将你u,\sigma^2的神经网络运用于测试,就需要单独估算,在典型的 Batch 归一化运用中,你需要用一个指数加权平均来估算,这个平均数涵盖了所有 mini-batch。
指数加权平均的做法很简单,对于第l层隐藏层,考虑所有mini-batch在该隐藏层下的u^{[l]}\sigma^{2[l]},然后用指数加权平均的方式来预测得到当前单个样本的u^{[l]}\sigma^{2[l]}。这样就实现了对测试过程单个样本的均值和方差估计。最后再用训练时得到的参数值\gamma,\beta来计算各层的输出值\overline{z}^{(i)}


8) Softmax Regression

目前我们介绍的都是二分类问题,神经网络输出层只有一个神经元。

对于多分类问题,用C表示种类个数,神经网络中输出层就有C个神经元,即n^{[l]}=C,其中,每个神经元的输出依次对应属于该类的概率,即P(y=c|x)。了处理多分类问题,我们一般使用Softmax回归模型。Softmax回归模型输出层的激活函数如下所示:

z^{|L|}=W^{[L |} a^{[L-1]}+b^{|L|}

a_{i}^{[L]}=\frac{e^{z_{i}^{[L]}}}{\sum_{i=1}^{C} e^{z_{i}^{[L]}}}

输出层每个神经元的输出a_{i}^{[l]}对应属于该类的概率,满足:\sum_{i=1}^{C} a_{i}^{ L }=1,典型分类例子如下图所示:


9) Training a softmax classifier

Softmax classifier的训练过程与我们之前介绍的二元分类问题有所不同。先来看一下softmax classifier的损失函数。

J\left(w^{[1]}, b^{[1]}, \ldots \ldots\right)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)                                      

其中,单个样本的代价函数为:

L(\hat{y}^{(i)}, y^{(i)})=-y^{(i)} \cdot \log \hat{y}^{(i)}

softmax的反向传播过程也可以使用梯度下降算法。推到结果与二元分类结果一样。


10)Deep learning frameworks

深度学习框架有很多,本课程用到了以下两类框架:

TensorFlow

Keras


11)TensorFlow

关于TensorFlow更多的原理和编程技巧这里就不在赘述了,现在最新版TensorFlow2.0已经发布了,感兴趣的朋友可以关注更详细的TensorFlow相关文档。


12)Summary

本周课程主要介绍了:

  • 超参数的的调试处理,参数选择的优先级,以及选择合适的区间范围
  • 隐藏层的归一化处理
  • Softmax分类器;
  • 以及介绍了本课程中用到的深度学习框架

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2.深度学习练习:Logistic Regression with a Neural Network mindset

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ You will learn to: Build the general architecture of a learning algorithm, including: Initializing para…

JVM内存区域详解

Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。 一、程序计数器 1.1 简述 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所…

3.深度学习练习:Planar data classification with one hidden layer

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ You will learn to: Implement a 2-class classification neural network with a single hidden layerUse unit…

一步步编写操作系统 11 实模式下程序分段的原因

cpu中本来是没有实模式这一称呼的,是因为有了保护模式后,为了将老的模式区别开来,所以称老的模式为实模式。这情况就像所有同学坐在同一个教室里,本来没有老同学这一概念,但某天老师领着一个陌生人进入教室并和大家宣布…

4.深度学习练习:Building your Deep Neural Network: Step by Step(强烈推荐)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ fter this assignment you will be able to: Use non-linear units like ReLU to improve your modelBuild a d…

一步步编写操作系统21 x86虚拟机bochs 跟踪bios

为了让大家更好的理解bios是怎样被执行的,也就是计算机中第一个软件是怎样开始的,咱们还是先看下图3-17。在图的上面第5行,显示的是下一条待执行的指令,这是程序计数器(PC)中的值,在x86上的程序…

【CodeForces - 361D】Levko and Array (二分,dp)

题干: Levko has an array that consists of integers: a1, a2, ... , an. But he doesn’t like this array at all. Levko thinks that the beauty of the array a directly depends on value c(a), which can be calculated by the formula: The less value…

5.深度学习练习:Deep Neural Network for Image Classification: Application

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ After this assignment you will be able to: Build and apply a deep neural network to supervised learning…

【CodeForces - 689D】Friends and Subsequences(RMQ,二分 或单调队列)

题干: Mike and !Mike are old childhood rivals, they are opposite in everything they do, except programming. Today they have a problem they cannot solve on their own, but together (with you) — who knows? Every one of them has an integer seque…

6.深度学习练习:Initialization

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1 - Neural Network model 2 - Zero initialization 3 - Random initialization(掌握&…

【CodeForces - 602D】Lipshitz Sequence(思维,单调栈,斜率单调性)

题干: A function is called Lipschitz continuous if there is a real constant Ksuch that the inequality |f(x) - f(y)| ≤ K|x - y| holds for all . Well deal with a more... discrete version of this term. For an array , we define its Lipschi…

7.深度学习练习:Regularization

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1-Package 2 - Non-regularized model 3 - L2 Regularization(掌握) 4-Dropou…

深入详解JVM内存模型与JVM参数详细配置

本系列会持续更新。 JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核。 BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾回收算法 3.JVM垃圾回收器 4.JVM参数详解 5…

8.深度学习练习:Gradient Checking

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1) How does gradient checking work? 2) 1-dimensional gradient checking 3) N-dimensional gradie…

9.深度学习练习:Optimization Methods

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1 - Gradient Descent 2 - Mini-Batch Gradient descent 3 - Momentum 4 - Adam 5 - Model with dif…

一步步编写操作系统 22 硬盘操作方法

硬盘中的指令很多,各指令的用法也不同。有的指令直接往command寄存器中写就行了,有的还要在feature寄存器中写入参数,最权威的方法还是要去参考ATA手册。由于本书中用到的都是简单的指令,所以对此抽象出一些公共的步骤仅供参考之用…

10.深度学习练习:Convolutional Neural Networks: Step by Step(强烈推荐)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 目录 1 - Packages 2 - Outline of the Assignment 3 - Convolutional Neural Networks 3.1 - Zero-Paddin…

一步步编写操作系统 23 重写主引导记录mbr

本节我们在之前MBR的基础上,做个稍微大一点的改进,经过这个改进后,我们的MBR可以读取硬盘。听上去这可是个大“手术”呢,我们要将之前学过的知识都用上啦。其实没那么大啦,就是加了个读写磁盘的函数而已,哈…

11.深度学习练习:Keras tutorial - the Happy House(推荐)

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ Welcome to the first assignment of week 2. In this assignment, you will: Learn to use Keras, a high-lev…

一步步编写操作系统 24 编写内核加载器

这一节的内容并不长,因为在进入保护模式之前,我们能做的不多,loader是要经过实模式到保护模式的过渡,并最终在保护模式下加载内核。本节只实现一个简单的loader,本loader只在实模式下工作,等学习了保护模式…