深度学习的参数调试

在构建神经网络模型时,有许多的参数需要去调试,比如learning rate (学习率)、iterations(梯度下降法循环的数量)、L(隐藏层数目)、(隐藏层单元数目)、choice of activation function(激活函数的选择)除了这些基本的还有一些其他的参数,如momentum、mini batch size、regularization parameters等等。

在这里记录下常用的几个参数的选择。

隐藏单元 hidden units

这是首先要考虑的问题,我们要构建多少个隐藏单元才会更适合?

首先要明白一点,hidden units不是越多越好,具体多少要通过具体的情况尝试,虽然有许多的论文写了各种数学公式来验证样本集合与神经元的关系,但是我觉得还是在具体情况下,根据直觉来设置一个,然后再删减找到最优。

通常的建议是设置小于输入的75%,但具体的情况具体考虑,例如我在做数字识别时,我们有0-9十个数字,设置十个隐藏单元要好于设置大于十和小于十。

学习速率 learning rate

这是非常重要的参数,因为学习速率的选择对梯度下降的影响最大,它可能会在0到1之间,

所以在Python中,你可以这样做,使

python
r = -4*np.random.rand()
a = 10**r

因为$r \in \lbrack - 4,0\rbrack$所以$a \in \lbrack 10^{-4}, 10^{0}\rbrack$,这样我们就可以在0.0001和1之间随机取出一个值。

batch size

在样本非常多的情况下会使用mini batch梯度下降,我们每次迭代选择多少size来计算呢?

首先,如果训练集较小,小于2000个样本,直接使用batch梯度下降法,也就是size=m(样本总数),样本集较小就没必要使用mini-batch梯度下降法,我们可以快速处理整个训练集,所以使用batch梯度下降法也很好。

样本数目较大的话,一般的mini batch大小为64到512,考虑到电脑内存设置和使用的方式,如果mini batch大小是2的次方,代码会运行地快一些,64就是2的6次方,以此类推,128是2的7次方,256是2的8次方,512是2的9次方。

最后需要注意的是在mini batch中,要确保和要符合CPU/GPU内存,取决于我们的应用方向以及训练集的大小。如果处理的mini batch和CPU/GPU内存不相符,不管用什么方法处理数据,算法的表现会急转直下变得惨不忍睹,我们需要做一些尝试,才能找到能够最有效地减少成本函数的那个,一般会尝试几个不同的值,几个不同的2次方,然后看能否找到一个让梯度下降优化算法最高效的大小。

正则化参数

正则话可以防止过拟合,除了之前在逻辑回归中使用的的L2正则化,还可以使用随机失活(dropout)正则化,实施dropout,在计算机视觉领域很成功。计算视觉中的输入量非常大,输入太多像素,以至于没有足够的数据,所以dropout在计算机视觉中应用得比较频繁,有些计算机视觉研究人员非常喜欢用它,几乎成了默认的选择,但要牢记一点,dropout是一种正则化方法,它有助于预防过拟合,因此除非算法过拟合,不然我是不会使用dropout的,所以它在其它领域应用得比较少,主要存在于计算机视觉领域,因为我们通常没有足够的数据,所以一直存在过拟合,这就是有些计算机视觉研究人员如此钟情于dropout函数的原因。

dropout一大缺点就是代价函数不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。

扩充我们的数据可以防止过拟合,但扩增数据代价很高,而且有时候我们无法扩增数据,但我们可以通过添加这类图片来增加训练集。例如,水平翻转图片,扭曲图片,随意裁剪图片,并把它添加到训练集。所以现在训练集中有原图,还有变换后的这张图片,这虽然不如我们额外收集一组新图片那么好,但这样做节省了获取更多图片的花费。

还有另外一种常用的方法叫作early stopping,运行梯度下降时,我们可以绘制训练误差,或只绘制代价函数的优化过程,还可以绘制验证集误差,它可以是验证集上的分类误差,或验证集上的代价函数,逻辑损失和对数损失等,你会发现,验证集误差通常会先呈下降趋势,然后在某个节点处开始上升,我们在此停止训练吧,这并不是一个很好的建议。

optimizer

优化器的具体选择就比较复杂了,有许多的论文,具体可以看看这篇论文:
An overview of gradient descent optimization algorithms

看两张动图直观上感受下算法的优化过程。第一张图为不同算法在损失平面等高线上随时间的变化情况,第二张图为不同算法在鞍点处的行为比较。

optimization on loss surface contours

optimization on loss surface contours

optimization on saddle point

optimization on saddle point

tensorflow 提供了多个优化器的api,使用起来非常简单。 tf.train.Optimizer

0%