Hyprtparameter tuning
Tuning process
在一个范围内对超参数进行调试
在超参数的调试中,最关键的是学习率
的调节,除了学习率,动量梯度下降的速率
, 隐藏层的单元数,mini-batch 的大小也很重要。
对于每次测试时参数大小的选择,我们更倾向于使用随机取值而不是将参数区间均等化分(gird),均匀取值。这是因为使用gird,我们默认所有的超参数有相同的重要性,但实际是有的参数对训练结果影响很大,有的参数对训练结果影响很小,因此使用随机取值可以防止不重要参数对实验结果的影响。
若在测试的过程中发现在一个区域内存在多个取值,模型的效果相似。那么在这些取值的矩形区域内再进一步取值,找到最优的超参数结果。
Using an appropriate scale to pick hyperparameters
对于隐藏层个数或隐藏层隐藏单元个数等取值为整数的超参数可以使用线性刻度随机取值;对于学习率等参数若使用线性取值则无法取得满意的效果:在0.0001到1之间随机取40个值,那么取值在0.1到1之间的概率远大于0.0001到0.001之间的概率。因此引入了对数刻度,在0.0001到0.001之间取10个值,在0.001到0.01之间取10个值…以momentum的取值为例,若该参数的取值范围在0.9到1之间,那么越接近1,结果的灵敏度发生的变化越大,但若均匀取值,在0.999到1之间的取值概率很低,因此通过在对数刻度上均匀取值,使得在接近1的区间内尽可能多的取值。
具体实现方法为:
若取值的数据量足够多,那么即使在均匀刻度上取值也可以取得不错的实现结果。
Hyper parameters:Tuning in practice
- 根据其他领域的研究成果确定超参数的取值
- Panda:在训练过程中对超参数进行调整
- Caviar:多个模型同时训练
Batch Normalization
实现
仿照对输入的归一化,在每一层结果激活之前对
进行归一化处理(
是指第
个batch中的某一层的输出),然后通过训练
和
使得结果更好的拟合模型。
具体实现方法:
因为使用batch-normalization会使得均值归一化,因此在线性变化中
作用会被消去,所以通常在使用batch-normalization时不用
。
为什么batch-normalization有用
- 与输入归一化类似,使得数据分布更为稳定,训练的更快。
- 当训练集发生改变之后,对于一个网络,训练好网络的参数需要重新进行训练,这种现象称为convariate shift。当使用batch-normalization之后,虽然该层的输入发生了变化,但是其分布仍然是由 和 决定的,由此限制了前层参数的更新对数据分布的影响,减少了隐藏值分布变化的数量,使参数的训练更稳定;也可以理解为batch-normalization之后,层与层之间的联系被削弱,使得每一层都可以独立的进行训练。
- 与drop out类似,由于batch-normalization只在一个batch上训练,因此与整个训练集相比会在均值和方差上存在误差(噪音),降低了过拟合的可能性(regularization)(drop out也肯认为是在训练过程中添加噪声)。基于这个原因,使用越大的batch,batch-normalization的regularization的效果越差。
注意batch-normalization应该当作一个加速训练的方法,而不是一个必须使用的规则
测试
batch-normalization测试时的主要问题是均值和方差的计算。
当每一个batch进行训练时,在神经网络的每一层上都会得到一个均值和一个方差,用
来表示第
个batch
训练的网络中
层的均值,通过
,
的指数加权平均,求得当前层的均值;方差的计算类似。在计算出每一层的均值和方差之后,输入测试集时,就通过这些均值和方差对测试集进行归一化。
softmax
应用于多分类问题。
激活函数为:
损失函数为:
backprop:
求导过程的具体推导见 https://www.jianshu.com/p/c02a1fbffad6