超参数调试、Batch归一化和程序框架
调试处理
不同的超参数,有不同的考虑优先等级,吴恩达的经验如下。
第一优先级的超参数:学习率。
第二优先级的超参数:Momentum的,神经网络每层的单元数(hidden units),mini-batch的子训练集大小(mini-batch size)。
第三优先级的超参数:神经网络的层数(layers),学习衰减率(learning rate decay)
第四优先集的超参数:Adam的超参数:,和,使用缺省值就可以了(,和)。
在对超参数取值时,要随机取值。在一定范围内等间隔地取值称为网格取值。假设我们只对两个超参数进行取值试验,左下图是网格取值,右下图是随机取值。
因为这两个超参数的重要性不一样,比如超参数2可以忽略不计,如果使用网格取值,那么取种值的效果和取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层的的行成员是。Batch归一化的操作如下:
首先求出平均值和方差
接着归一化处理
我们得到了平均值为0,方差为1的。但是,我们可能不需要平均值为0,方差为1,可能需要其他值。因此,进行下面操作
这样我们可以获得任何想要的平均值和方差。
把Batch归一化应用到梯度下降中的如下图所示
每层的参数为。因为,而,所以参数包括参数的功能,参数可以去掉。
加入Batch归一化的梯度下降每次迭代的流程如下:
首先前向传播,计算出的值。
接着计算代价函数J。
接着反向传播,计算(已经删除)。
接着更新参数,可以应用优化算法,比如Momentum,RMSprop和Adam。
已经训练好的x到y映射模型,如果x的分布改变了,映射模型也需要重新训练,这个叫covariate shift。对于一个神经网络的中后层来说,如果前一层了的值有很大的变化,那么该层之后的参数都会发生剧烈的变动。通过Batch归一化,前中层的参数发生变化,中后层的参数不会发生太大的变动。Batch归一化减少了输入值改变的问题,减弱了前层参数的作用与后层的作用之间的联系,这有助于加速整个网络的学习。
Batch归一化在Mini-batch中会加入一些噪声,因为Mini-batch每次使用一部分数据进行训练,从而产生了误差,而之后计算的平均值和方差都有一些误差,这样导致每个隐藏单元都带有噪声,使得后面的单元都不太相信前面的隐藏单元,每个隐藏单元都相对独立。这就好像dropout,dropout给每个单元带来了噪声(每个单元有一定的概率乘以0),Batch归一化在Mini-batch中产生了轻微了正则化效果,而且mini-batch size越小,正则化效果越大。
在测试时,Batch归一化对于单一的样本不起作用,因为一个样本的平均值和方差没有什么意义,这时需要通过其他方法求出平均值和方差。在Mini-batch中,有子训练集。对于每个子训练集,可以计算平均值和方差。这样可以获得一系列和,使用指数加权的思想计算各自的平均值,用最新的平均值作为测试时使用的参数。
softmax回归
softmax可以用于多分类问题。
假设需要一个识别猫(1),狗(2),小鸡(3)和其他动物(0)的分类器,这里一共有4种类别,用表示。设计一个神经网络如下图所示:
最后一层不再是只有一个神经元,而是4个神经元,分别表示是其他动物的概率,是猫的概率,是狗的概率,是小鸡的概率。
对于最后一层,**函数与其他**函数不一样。**函数的公式是
各个概率加起来等于1。
如果神经网络没有隐藏层,输入特征只有两个,那么softmax分类器的一些例子如下图所示:
没有隐藏层的分类器都是线性分类。有隐藏层的神经网络可以训练非线性的分类器。
对于多元分类,样本的标签y是一个的矩阵。使用上面的分类例子,假设一个样本是猫,那么标签。对于softmax最后计算得到的,哪一类的概率最大,比如狗的概率最大,那么预测结果是。如果根据直接判断得出,这叫做hard max。
softmax的损失函数是:
这和logistic回归相似。如果C=2,那么softmax和logistic就一模一样了。当C=2时,只需要计算其中一个类的概率P,另外一个类的概率等于1-P。softmax的梯度,这和logistic一样。
深度学习框架
目前已经有许多深度学习框架。
- Caffe/Caffe2
- CNTK
- DL4J
- Keras
- Lasagne
- mxnet
- PaddlePaddle
- TensorFlow
- Theano
- Torch
选择深度学习框架有几个标准:
- 便于编程。
- 运行快速。
- 开源并长期维护。