超参数调试、Batch归一化和程序框架

调试处理

不同的超参数,有不同的考虑优先等级,吴恩达的经验如下。
第一优先级的超参数:学习率α
第二优先级的超参数:Momentum的β,神经网络每层的单元数(hidden units),mini-batch的子训练集大小(mini-batch size)。
第三优先级的超参数:神经网络的层数(layers),学习衰减率(learning rate decay)
第四优先集的超参数:Adam的超参数:β1β2ε,使用缺省值就可以了(β1=0.9β2=0.999ε=108)。

在对超参数取值时,要随机取值。在一定范围内等间隔地取值称为网格取值。假设我们只对两个超参数进行取值试验,左下图是网格取值,右下图是随机取值。
超参数调试、Batch归一化和程序框架
因为这两个超参数的重要性不一样,比如超参数2可以忽略不计,如果使用网格取值,那么取nn种值的效果和取n种值的效果一样,这会浪费时间。如果使用随机取值,就不会有这种影响。

为超参数取值要注意从粗略到精细。首先在一个大范围中进行随机取值试验,然后选取表现好的某块小区域再进行随机取值试验,从而一步步逼近最优的超参数值,提升搜索效率。

为超参数选择合适的范围

对于hidden units,如果取值范围是50-100,可以在这个范围内随机均匀取值。对于layers,如果取值范围是2-4,那么可以尝试取2、3和4。

但是对于学习率α,它的最佳取值可能在0.0001附近,也可能在0.001,或者0.01,或者0.1,或者1。所以如果α取值范围在0.0001-1,那么在这个区间中随机均匀取值是不可取了,会忽略许多可能有效的值。所以,把0.0001-1这个区间分为0.0001-0.001,0.001-0.01,0.01-0.1,0.1-1这几个区间,然后在这些区间内均匀取值。

对于β也一样,β在0.9-0.9005这个区域学习效果相差不大,但是在0.999-0.9995这个区域灵敏度大,学习效果相差很大。

所以对于每个超参数,要在有效的取值范围内取不同学习效果的值来试验。

超参数训练的实践

训练超参数有两种类型,在课程中分别称为Pandas和Caviar。

如果缺少足够计算力(CPU和GPU),搜索超参数时就运行一个模型一段时间,观察学习曲线。如果代价函数值在下降,可以稍微调整一下超参数,比如增大学习率α,然后继续训练,观察学习曲线。如果代价函数值上升,那么降低学习率α。通过不断调整超参数,观察学习曲线,可以知道哪些超参数值的表现效果良好。这种超参数训练类型,精心保护一个训练模型,就像熊猫精心照顾自己的孩子,确保孩子会存活。

如果不缺少计算力,可以同时训练不同超参数的模型,观察每种模型的训练效果,选择学习效果最好的模型。这种超参数训练类型不需要关心训练的过程,只观察最后的表现效果,就像鱼子酱繁殖,鱼子酱产出1亿的卵子,不会照顾孩子,只是希望其中的一个或一群能够存活下来。

Batch归一化

除了对输入向量进行归一化处理,可以对神经网络中的内部变量进行归一化。对Z值进行归一化的操作称为Batch归一化。

假设神经网络的第l层的Z[l]的行成员是z(1),z(2),,z(m)。Batch归一化的操作如下:
首先求出平均值和方差

μ=1mi=1mz(i)σ2=1mi=1m(z(i)μ)2

接着归一化处理
znorm(i)=z(i)μσ2+ε

我们得到了平均值为0,方差为1的znorm[l]。但是,我们可能不需要平均值为0,方差为1,可能需要其他值。因此,进行下面操作
z~(i)=γznorm(i)+β

这样我们可以获得任何想要的平均值和方差。

把Batch归一化应用到梯度下降中的如下图所示
超参数调试、Batch归一化和程序框架
每层的参数为W[l],b[l],γ[l],β[l]。因为z[l]=W[l]a[l1]+b[l],而z~[l]=γ[l]znorm[l]+β[l],所以参数β[l]包括参数b[l]的功能,参数b[l]可以去掉。

加入Batch归一化的梯度下降每次迭代的流程如下:
首先前向传播,计算出Z,Znorm,Z~,A的值。
接着计算代价函数J。
接着反向传播,计算dW,dγ,dβdb已经删除)。
接着更新参数,可以应用优化算法,比如Momentum,RMSprop和Adam。

已经训练好的x到y映射模型,如果x的分布改变了,映射模型也需要重新训练,这个叫covariate shift。对于一个神经网络的中后层来说,如果前一层了a[l1]的值有很大的变化,那么该层之后的参数W[l],W[l+1],,W[L]都会发生剧烈的变动。通过Batch归一化,前中层的参数发生变化,中后层的参数不会发生太大的变动。Batch归一化减少了输入值改变的问题,减弱了前层参数的作用与后层的作用之间的联系,这有助于加速整个网络的学习。

Batch归一化在Mini-batch中会加入一些噪声,因为Mini-batch每次使用一部分数据进行训练,从而Z[l]产生了误差,而之后计算的平均值和方差都有一些误差,这样导致每个隐藏单元都带有噪声,使得后面的单元都不太相信前面的隐藏单元,每个隐藏单元都相对独立。这就好像dropout,dropout给每个单元带来了噪声(每个单元有一定的概率乘以0),Batch归一化在Mini-batch中产生了轻微了正则化效果,而且mini-batch size越小,正则化效果越大。

在测试时,Batch归一化对于单一的样本不起作用,因为一个样本的平均值和方差没有什么意义,这时需要通过其他方法求出平均值和方差。在Mini-batch中,有子训练集X{1},X{2},,X{T}。对于每个子训练集,可以计算平均值μ[l]和方差σ[l]。这样可以获得一系列μ{1}[l],μ{2}[l],,μ{T}[l]σ{1}[l],σ{2}[l],,σ{T}[l],使用指数加权的思想计算各自的平均值,用最新的平均值作为测试时使用的参数。

softmax回归

softmax可以用于多分类问题。

假设需要一个识别猫(1),狗(2),小鸡(3)和其他动物(0)的分类器,这里一共有4种类别,用C={0,1,2,3}表示。设计一个神经网络如下图所示:
超参数调试、Batch归一化和程序框架
最后一层不再是只有一个神经元,而是4个神经元,分别表示是其他动物的概率,是猫的概率,是狗的概率,是小鸡的概率。

对于最后一层,**函数与其他**函数不一样。**函数的公式是

t=ez[L]a[L]=tj=1n[L]ti

a[L]各个概率加起来等于1。

如果神经网络没有隐藏层,输入特征只有两个,那么softmax分类器的一些例子如下图所示:
超参数调试、Batch归一化和程序框架
没有隐藏层的分类器都是线性分类。有隐藏层的神经网络可以训练非线性的分类器。

对于多元分类,样本的标签y是一个C×1的矩阵。使用上面的分类例子,假设一个样本是猫,那么标签y=[0100]。对于softmax最后计算得到的y^=[P(other|x)P(cat|x)P(dog|x)P(baby chicks|x)],哪一类的概率最大,比如狗的概率最大,那么预测结果是ypredict=[0010]。如果根据Z[L]直接判断得出ypredict,这叫做hard max。

softmax的损失函数是:

l(y^,y)=i=1Cyilog(y^i)

这和logistic回归相似。如果C=2,那么softmax和logistic就一模一样了。当C=2时,只需要计算其中一个类的概率P,另外一个类的概率等于1-P。softmax的梯度dz[L]=y^y,这和logistic一样。

深度学习框架

目前已经有许多深度学习框架。

  • Caffe/Caffe2
  • CNTK
  • DL4J
  • Keras
  • Lasagne
  • mxnet
  • PaddlePaddle
  • TensorFlow
  • Theano
  • Torch

选择深度学习框架有几个标准:

  • 便于编程。
  • 运行快速。
  • 开源并长期维护。