深度学习 day09超参数调试、Batch 正则化和程序框架

01 调试处理

系统地组织超参调试过程的技巧


  • 学习速率是需要调试的最重要的超参数(红色),其次是momentum、mini-batch的大小及隐藏单元(黄色),重要性拍第三位的就是层数、学习率衰减、Adam算法(其余都是)

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 如果要调整一些超参数,该如何选择调试值呢?
    1. 在早一代的机器学习算法中(左图),如果有两个超参数,常见的作法是在网格中取样点,然后系统的研究这些数值,然后选择哪个参数效果最好。(参数的数量相对较少时)
    2. 在深度学习领域中(右图)推荐下面做法:随机选择点,然后用随机取的点试验超参数的效果,之所以这么做是因为你 很难提前知道哪个超参数最重要。
  • 就举两个极端的超参数,α和ε,无论ε取何值,结果基本都是一样的。对于左边的图来说25个样点,但是α只能尝试五个值,而对于右图,每个样点都是独立的也就是α可以取25个值。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 当你给超参数取值时,另一个惯例就是采用由粗糙到精细的策略,也就是在整个的方格中进行粗略搜索后,发现某个点的效果最好,周围的点效果也不错,这时就可以聚集到这个点周围更小的方格中,在更小的方格中,更加密集的随机取点。

深度学习 day09超参数调试、Batch 正则化和程序框架

02 为超参数选择合适的范围

随机取值并不是在有效范围内的随机均匀取值,而是选择合适的标尺用于探究这些超参数。


  • 假设选取隐藏单元的数量n^ [l],选择范围是从50到100中某点;如果要选取神经网络的层数L,选择范围是从2到4。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 假设你在搜索超参数学习率α,取值范围是0.0001到1,如果沿其随机均匀取值那么90%的数值会落在0.1到1,这样看起来不对,反而用对数标尺搜索超参数的方式会更合理,因此这里不使用线性轴,而是分别依次取0.0001、0.001、0.01、0.1、1,在对数轴上随机均匀取点,这样每个数值之间都有更多的搜索资源可用。用python实现如下:将超参数设置为10^ r,r取值在a到b之间,其中a与b是通过对最小值和最大值进行对数运算得出。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 另一个棘手的例子就是给β取值,用来计算指数的加权平均值,取0.9就相当于在10个值中取平均值,取0.999相当于在1000个值中取平均,如果想要在0.9到0.999之间进行搜索就不能用线性轴取值,我们要探究的应该是1-β,值在0.001到0.1区间,要做的就是在[-3,-1]里随即均匀的给r取值,就相当于给β取值。为什么不能用线性轴呢?因为β接近1时,任何细微的变化都会产生大影响(1-β),所以在β趋近于1的范围内需要密集的取值。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 即使标尺没有选对也没关系,只要数据足够就影响不大。

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

组织超参数搜索过程的建议和技巧


  • 由于某些情况你的原来设定的超参数不好用了,建议就是每隔几个月至少一次重新测试或评估你的超参数来确保你对数值依然很满意。
  • 关于如何搜索超参数的问题:
    1. 照看一个模型,对其细心照料(通常是有庞大的数据组,但是没有许多计算资源或者足够的CPU和GPU的情况下),即使它在试验时也可以进行改良。因为没有足够的计算能力,不能在同一时间试验大量的模型,所以要观察它的表现,不断调整学习率。
    2. 同时试验多种模型,一视同仁:你设置一些超参数,就让他自己运行(蓝线),也可以开始一个有着不同超参数设定的不同模型,第二个模型(紫线),第三个模型(红色)等等,最后选择工作效果最好的那个。

深度学习 day09超参数调试、Batch 正则化和程序框架

04 正则化网络的激活函数

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


  • 对于逻辑回归和神经网络的归一化输入特征值来说,归一化输入特征是可以加速学习过程的。
  • 对于深层网络来说:Batch归一化的作用是:对于任何一个隐藏层而言,能够归一化a值以更快速的训练w和b。严格的来说,我们真正归一化的不是a而是z。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 单一隐含层Batch归一化的使用方法:网络中已知有些中间值,如假设有一些隐藏单元值z^ (1)到z^ (m),接下来要计算平均值,然后计算方差,然后取每个z^ (i)规范化,化为含平均值0和方差1((z^ (i)-均值)/标准偏差),为了确保数值稳定这里我们依旧加一个ε。因为隐藏单元有不同的分布可能会有意义(例如在sigmoid激活函数,我们不希望值都集中在线性那),因此我们不想隐藏单元总是含有平均值0和方差1,所以我们开始接下来计算ztilde,其中这里的γ和β是模型的学习参数,然后使用梯度下降算法等方法更新γ和β。如果γ=z的分母、β=u,那么他就可以精准的转化公式使得z=ztilde。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • Batch归一化的作用是它适用的归一化过程不只是输入层,也适用于神经网络中的深度隐藏层。

05 将Batch Norm拟合进神经网络

  • Batch归一化是发生在计算z和a之间的,与其应用没有规范过的z^ [i],不如用经方差和均值归一后的ztilde^ [i]。而且这里的β与用在momentum、Adam、RMSprop里的β不同。可以用任何优化算法来更新参数β和γ,在TensorFlow框架中可以用右下角的函数来实现Batch归一化。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 在实践中,Batch归一化通常和训练集的mini-batch一起使用,应用Batch归一化的方式就是:用第一个mini-batch计算z^ [1],然后在经Batch归一化得到ztilde^ [1],再应用激活函数得到a^ [1],然后再一直运行下去。再用第二个mini-batch,直到用完。值得注意的一点:使用Batch归一化可以消除参数b,因为mini-batch中增加任何常数,数值都不会变,加上的任何常数都会被均值减法所抵消。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 用Batch归一化来应用梯度下降法->假设你在使用mini-batch梯度下降法:

深度学习 day09超参数调试、Batch 正则化和程序框架

06 Batch Norm为什么奏效?

  • batch归一化有效的第一个原因是它不仅仅针对输入值,还针对隐藏单元的值,将那一层所有的值通过归一化得到类似范围的值,可加速学习。第二个原因是它可以使权重比你的神经网络更滞后或者更深层(比如第十层相比于第一层的权重更能经受得住变化)。即使存在运行都很好的同一个函数,但你不会希望你的学习算法去发现绿色的决策边界,只看左边的数据的话,可能使得你产生数据改变分布的想法(covariate shift),正如x到y的映射一样,改变下,y也随之改变。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • batch归一化做的是它减小了这些隐藏值分布变化的数量,就以z^ [2] _1与z^ [2] _1为例,即使它的值改变了,至少他们的均值和方差也会是均值0和方差1,亦或者是由β和γ决定的其他均值与方差。直观来说batch归一化减弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习,稍稍独立于其他层,有利于加速整个网络的学习。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • batch归一化另一个作用就是他有轻微的正则化效果,因为在mini-batch上计算的均值和方差,均值和方差都会有一些小噪音;缩放过程从z^ [l]到ztilde^ [l]也会有些噪音,因为它是用有噪音的均值和方差计算得出的,所以和dropout相似,他往每个隐藏层的激活值上增加了噪音,dropout含几重噪音是因为它以一定概率乘以0或1,batch归一化含几重噪音是因为标准差的缩放和减去均值带来的额外噪音。因为给隐藏单元添加了噪音,迫使后面单元不过分依赖任何一个隐藏单元,因为噪音很小,所以不是巨大的正则化效果,可以将batch归一化和dropout一块使用;dropout的一个特性是mini-batch越大,正则化效果越弱。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 注意:batch归一化一次只能处理一个mini-batch数据

07 测试时的 Batch Norm

Batch归一化将数据以mini-batch的形式逐一处理,但是在测试时,需要对每一个样本逐一处理


  • 我们用m来表示一个mini-batch中的样本数量,在测试过程中不可能将一个mini-batch中所有样本同时处理,所以需要用其他方法得到u和σ^ 2。为了将神经网络应用于测试就需要单独估算u和σ^ 2。在这里我们用指数加权平均来估算(这个平均数涵盖了所有mini-batch),训练l层的每一个mini-batch都会得到一个u值。可以用指数加权平均来追踪在这一层所有mini-batch中所见的σ^ 2的值,也可以用来追踪均值向量的最新平均值,因此在用不同的mini-batch训练神经网络的同时,能够得到你所查看的每一层的u和σ^ 2的平均数的实时数值。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 总结:在训练时u和σ^ 2是在整个mini-batch上计算出来的,但在测试时需要逐一处理样本,方法是根据你的训练集通过运用指数加权平均估算出u和σ^ 2,然后用测试中的u和σ^ 2来进行你所需的隐藏单元z值得调整。

08 Softmax回归

Softmax回归能让你在试图识别某一分类时做出预测(识别多种分类)


  • 我们用C来表示有几个种类,我们想要输出层单元的数字告诉我们这四种类型中每一个的概率有多大,最后输出一个4*1矩阵。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 让网络做到这一点的标准模型要用到Softmax层以及输出层来生成输出。算出z之后就需要应用Softmax激活函数(这个激活函数对于Softmax层而言有些不同):首先计算一个适用于每个元素的临时变量t=e的z^ [l]次方,然后经过计算得到a^ [l](t经过归一化使和为1),举例右边:之前我们的激活函数都是接受单行数值输入(例如Sigmoid和ReLU激活函数输入一个实数输出一个实数),Softmax激活函数因为需要将所有可能的输出归一化,所以就需要输入一个向量,最后再输出一个向量。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • Softmax分类器在没有隐藏层的情况下能后做到的事–线性决策边界,更深层的网络可以学习更复杂的非线性决策边界。

深度学习 day09超参数调试、Batch 正则化和程序框架

09 训练一个Softmax分类器

  • hard max函数将概率最大的变为1,其他变为0。soft max函数相对比较柔和,该是多少概率就是多少。值得注意的是:如果C=2,那么Softmax实际就变回了逻辑回归。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 怎样训练带有Softmax输出层的神经网络?我们应首先定义损失函数(左边是单个训练样本的损失,右边是整个训练集的损失J),下方是使用向量化实现矩阵大写Y。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 在有Softmax输出层时实现梯度下降法:输出层会计算出z^ [l] ( C * 1维),然后用Softmax激活函数得到a^ [l],然后由此算出损失。初始化反向传播所需的关键步骤或者说关键方程是dz那个表达式

深度学习 day09超参数调试、Batch 正则化和程序框架

10 深度学习框架

  • 深度学习的一些框架及选择框架的标准:一个重要的标准就是便于编程(神经网络的开发、迭代、为产品进行配置),第二个标准是运行速度(特别是训练大数据集),第三个标准是这个框架是否真的开放(长时间开源)。

深度学习 day09超参数调试、Batch 正则化和程序框架

11 TensorFlow

  • 假设有一个J需要最小化,来使用TensorFlow将其最小化:第一行和第二行是引入库,接下来是将w初始化为0,然后定义损失函数,然后定义train为学习算法(用梯度下降优化器使损失函数最小化),下面的两行是惯用的表达,开启了一个TensorFlow session,接下来是初始化全局变量,然后用TensorFlow评估一个变量,然后运行梯度下降法再输出w。

深度学习 day09超参数调试、Batch 正则化和程序框架

  • 现在我们运行梯度下降1000次迭代,然后输出w

深度学习 day09超参数调试、Batch 正则化和程序框架

  • TensorFlow中的placeholder是之后会赋值的变量,这种方法便于将训练数据加入损失方程(feed_dict函数)

深度学习 day09超参数调试、Batch 正则化和程序框架

  • TensorFlow已经内置了所有必要的反向函数,通过内置函数来计算前向函数,它就能自动用反向函数实现反向传播。

深度学习 day09超参数调试、Batch 正则化和程序框架

上一篇:data_loader读取器


下一篇:动手学深度学习 | 批量归一化 | 26