目录
超参数调试
调试处理
在训练神经网络过程中需要设置很多不同的超参数,超参数的调试过程,一般按照重要性进行(以下列举只是一般来说):
- 首先,最重要的超参数是学习率;
- 其次为Momentum超参数、隐层的单元数以及mini-batch size;
- 第三重要为隐层的数量、学习率衰减率;
- 如果使用Adam优化算法的话,它的超参数一般采用默认设置(0.9,0.999,),不进行调试。
在传统的机器学习领域,超参数比较少的情况下,一般使用网格的方式来调试超参数,尝试n*n(假设两个超参数)种参数组合来找到效果最好的那一个。这种方法在超参数比较少的时候效果不错,但是它会把所有超参数的重要程度看作是相同的,举一个极端的例子,假设超参数1是学习率,超参数2是Adam分母中的,我们知道一般来说学习率是最重要的超参数,而 根本不用调,几乎对模型起不到任何效果。而按照网格搜索的话,虽然尝试了n*n种不同的模型,而重要的超参数学习率只取了n个,所以效果不是很好。
在深度学习领域,超参数较多的情况下,由于在我们处理问题的时候无法知道哪个超参数是更重要的,所以就不是设置规则的网格点,而是随机选择点进行调试。在调试时如果发现有几组超参数的取值对于优化的目标来说表现特别好,那么就可以在那几组超参数附近,划定一个较小的范围,进行更密集的随机取值,如下图所示。
为超参数选择合适的范围
对于某些超参数来说随机均匀取值可能是适用的,如隐层单元数和隐层数量,但对于一些超参数的选择做均匀随机取值是不合适的。以学习率α的选择为例,如果在[0.0001,1]进行均匀随机取值,此时会把90%的搜索资源放在[0.1,1]区间中,而[0.0001,0.1]区间只占10%的搜索资源。此时一般采用对数坐标,对学习率的最小(大)值以10为底取对数得到区间[a,b],再在该区间中进行随机均匀取值。此时,0.0001∼0.001、0.001∼0.01、0.01∼0.1、0.1~1这四个小区间将占用相同的搜索资源,实现代码如下:
r = -4 * np.random.rand() # r in [-4,0]
learning_rate = 10 ** r # 10^{r}
再以指数加权平均超参数为例,假设的合理取值区间为[0.9,0.999],和学习率α一样,直接在该区间均匀取值是不合理的。我们可以先用1-,区间变为[0.001,0.1],按照上述类似的方法在区间[-3,-1]均匀取值得到r,然后,,此时[0.9,0.99]和[0.99,0.999]这两个区间所占的搜索资源是相同的。
如果我们没有为超参数的选择确定一个合适的标尺,但是在原始区间中采用随机均匀取值取得数值比较多时,也可以得到一个不错的效果,尤其是结合采用了从粗糙到精细的搜索策略。
超参数训练实践:Pandas vs. Caviar
在超参数调试的实际操作中,我们需要根据我们现有的计算资源来决定以什么样的方式去调试超参数,进而对模型进行改进。通常在计算资源有限的情况下,使用pandas方式,仅调试一个模型,每天不断优化;而在计算资源充足的情况下会使用Caviar方式,并行调试多个模型,每个模型有不同的超参数设置,绘制不同模型的学习曲线以选取其中最好的模型。
Batch正则化
在Logistic 回归中,归一化输入特征可以加速模型的训练。那么对于更深层次的神经网络,我们也可以通过归一化隐藏层的输出或者经过激活函数后的 来加速神经网络的训练过程(归一化更常用)。通过Batch归一化,可以使超参数搜索问题变得容易,使神经网络对超参数的选择更加稳定,超参数的范围会更庞大,工作效果也很好,从而能很容易的训练深层网络。
Batch norm的实现
以神经网络中某一隐藏层的中间值为例:
所有的分量都是平均值为0和方差为1的分布,但是我们不希望隐藏层的单元总是如此,也许不同的分布会更有意义,所以我们再进行计算:。注意是模型的学习参数,和之前的权重参数W一样需要用梯度下降法或高级优化方法进行更新,两个参数的值来确定所属的分布。
可以看出,batch norm 的作用其实就是使隐层单元的均值和方差标准化,使的每一行有固定的均值和方差,具体的均值和方差取值由决定。
将Batch Norm拟合进神经网络
在深度神经网络中应用Batch Norm,这里以一个简单的神经网络为例,前向传播的计算流程如下图所示:
Batch Norm通常会和mini-batch一起工作,实现梯度下降的过程如图所示:
也可以使用其它的高级优化算法,如Adam,Momentum,RMSprop。
注意:这里没有加上偏置参数,是因为之后需要对进行标准化,结果成为均值为0,标准差为1的分布,再通过进行重新的分布缩放,所以计算时加上没有任何作用。
Batch norm工作原理
- 同对输入层的输入特征进行归一化类似,Batch Norm通过对每个隐层进行归一化,使得每一次梯度下降都可以更快的接近函数的最小值点,从而加速模型训练过程。
- 使权重比网络更滞后或者更深层,比如第十层的权重比第一层的权重更经受的住变化
下面通过判别某图片是否是猫的问题来解释:
假设第一个训练样本的集合全是黑猫,而第二个训练样本集合是各种颜色的猫。如果我们将第二个训练样本直接输入到用第一个训练样本集合训练出的模型进行分类判别,那么我们在很大程度上是无法保证能够得到很好的判别结果。虽然两个训练集合中的都是猫,但是很大程度上样本的分布情况是不同的,第二个样本集合相当于第一个样本的分布的改变,称为:Covariate shift。
Batch Norm的作用其实就是限制了前层参数的更新导致对后层数值分布的影响程度,使得输入后层的数值变得更加稳定,可以理解为Batch Norm 削弱了前层参数与后层参数之间的联系,使得网络的每层都可以自己进行学习,相对其他层有一定的独立性,这会有助于加速整个网络的学习。
- Batch Norm有轻微的正则化效果
在使用Mini-batch梯度下降的时候,每次计算均值和偏差都是在一个Mini-batch上进行计算,而不是在整个数据样集上。这样就在均值和偏差上带来一些比较小的噪声,那么用均值和偏差计算得到的也将会加入一定的噪声。dropout通过将每个隐层单元以一定的概率乘以0或1来添加噪声,所以batch norm 和dropout类似,会有正则化效果。但是由于batch norm添加的噪声比dropout小很多,所以只能起到轻微的正则化作用。可以将dropout和batch norm结合使用,会有更强大的正则化效果。当mini-batch比较大时,会引入更少的噪声,那么就会削弱正则化的效果。
测试时的Batch Norm
在训练过程中,我们是在每个Mini-batch使用Batch Norm,计算所需要的均值 和方差 。但是在测试时,我们可能需要对每个样本逐一处理。而对单个样本求均值和方差是没有意义的,通常的方法就是在我们在训练的过程中对每个mini-batch在第l层上计算出的均值和方差,利用指数加权平均进行跟踪,估算出第l层的,然后直接用于Batch Norm公式的计算从而进行单个样本的测试。
Softmax回归
- Softmax层
oftmax回归可以进行多分类(>=2),而不仅仅是2分类。在多分类时,可以把softmax看作是一个激活函数,具体在输出层的计算过程如下:
- Softmax 的损失函数
Sotfmax使用的Loss function如下图所示,其中为对应的目标值、为训练结束前某次的输出的概率值
损失函数的作用其实就是找到训练集中最真实的类别,使得该类别相应的概率尽可能地高,这其实是最大似然估计的一种形式。
对于m个样本的代价函数定义如下:
- Softmax 的梯度下降
单个样本:
多个样本: