参数调试技巧
神经网络涉及了许多不同的超参数,这些参数包括神经网络层数,学习率和adam优化算法参数等,一些系统性的参数调试技巧如下所示:
-
网格取值
在传统的机器学习领域,假设有两个超参数,称之为超参1,超参2,常见的做法是在网格中取样,假设是5×5的网格,可以尝试所有的25个点,然后选择哪种效果更好,当参数数量较少时,这种方法较为实用。
随机取值
在深度学习领域,常见的做法是对随机选择法,即选择同等数量的点,然后用这些随机取样的点试验超参数的效果,之所以这样做的原因是因为在深度学习领域,很难知道哪些参数对模型的影响更重要。例如学习率比参数对模型的影响更大。随机取值比网格取值探究了更多的可能。
调试超参数时,另一个技巧就是遵循由粗到细的原则,如下图所示,假设一个二维参数中,可能效果最好的那个参数点,附近的其他点的效果也很好,可以放大这块区域,然后在这些区域尝试更多的取值。比较这些取值的效果。如下图所示:
为超参数选择合适的范围
在超参数的调试范围中,随机取值会提升参数选择的效率,但是随机取值并不是均匀分布的随机取值,通常会根据参数的分布选择合适的范围。
假设,需要选择的参数是神经网络的层数,这些参数的分布可能是均匀的,比如2,3,4等,但是,随机均匀的分布对一些超参数的选择是不合理的。
以超参数学习率为例,假设参数的取值分布范围是,如果是随机均匀分布,则90%的数据都会分布在之间,参数的选择过程,可能会浪费大量的时间和资源。对于这种情况,一种有效的解决方案是采用对数坐标,在对数坐标上取值,这时候随机值的分布将会从变成,在对数轴上实现了随机均匀的取值。用python
的实现如下:
r = -4*np.random.rand() # 取值范围是(-4,0)
learning_rate = 10^r
另一个超参数是指数加权平均法中用到的参数,一般认为该参数的取值范围是,对于这样的分布,由于公式的存在,当的取值接近1时,会对细微的变化及其敏感,如之间时,可能影响不大,但是当取值从范围在之间时,会对结果有显著的影响。一种有效的办法是将其转化为从的分布,此时,随机取值分布将会变成,在通过对数坐标将其转化为以便给得到随机均匀分布的取值。
归一化网络的激活函数
深度学习领域中,最重要的一个思想是归一化思想,之前的学习中,经常将数据集的输入特征归一化,这样的能够使得神经网络对超参数的选择更加稳定,也能够使得超参数的调节范围更加庞大,工作效果也会更好。除了对输入特征使用归一化之外,对神经网络的每一个隐藏层总的隐藏值也可以使用归一化,具体的工作如下所示:
求取每一层网络中隐藏值的均值:
求取方差
归一化
其中,分母上加上的原因是为了防止分母变为0,一般取
实现以上过程之后,隐藏层的输入值其均值就会变为0,方差变为1,但是,也许,隐藏单元不同的分布才会有意义,可以通过参数和参数加以调节,具体的实现公式如下所示:
假如令,则有
在使用梯度下降算法或者其他优化算法时,可以更新参数和参数。
batch归一化的作用是不仅可以归一化输入特征,同样适用于神经网络中的深度隐藏层。通过归一化更加有助于神经网络的学习,与输入特征归一化相比,隐藏层的归一化可以通过参数实现可控归一化,可以根据实际应用,确定隐藏层的均值和方差。
将batch归一化拟合进神经网络
实现了隐藏层的batch归一化之后,需要将其拟合进神经网络中,假设有一个神经网络的结构如下图所示:
实现这个过程可以分为以下步骤:
- 归一化输入特征并计算隐藏层的值
- 归一化隐藏层中的,并根据激活函数计算激活函数的输出。
- 根据计算并归一化
- 计算输出
注意: 使用batch归一化之后,此时,神经网络的参数将会变成,和归一化参数。
mini-batches 中的归一化
在实践中,归一化通常和训练集的mini-batch一起使用。对于每一个隐藏层,其使用方式如下:
- 使用,根据参数计算得到.
- 使用归一化减去均值,除以标准差,再用经过重新缩放,得到.
注意:*每层的参数都是,还有和,但是在归一化的过程中,无论的值为多少,都是要被减去的,所以在归一化中,可以消除这个参数,或者将设置为0.此参数的作用会由 代替,影响转移或者偏置的条件。
综上,使用归一化之后,梯度下降的更新过程的伪代码表示如下所示:
for t in mini-batches:
在 mini-batch{t}上应用前向传播
在每一个隐藏层中应用归一化,将z转化为z_norm
使用反向传播更新参数的值,更新公式如下所示:
wl = wl - learning_rate*dwl
beta_l = beta_l - learning_rate*dbeta_l
gamma_l = gammal - learning_rate*dgamma_l
Batch归一化奏效的原因
关于batch归一化所起的作用由如下解释
- 通过归一化输入特征值,使其均值为0,方差为1,可以加速学习。
- batch归一化有效的第二个原因是因为能够使权重比拟的网络更滞后或者能够使网络更深层的权重更能经受得住变化,具体解释如下:
当数据分布改变(Covariate shift),如果这些数据已经学习了到的映射,的分布发生了改变,此时需要重新训练学习算法。
对于一个深度神经网络而言,从隐藏层的角度而言,能够利用前层中取得的值和和获得的参数,能够使的输出值尽可能的接近真实值.
以下图中的神经网络结构为例,这个网络通过学习,参数不断发生改变,隐藏值的输入也会发生改变,就以第三层隐藏层的角度而言,通过一层层的学习,这些隐藏单元的值不断的发生改变,于是就有了”Covariate shift“的问题。
batch归一化的作用就在于能够确保隐藏层的值发生改变时,其均值和方差不会发生变化,也就是限制了在前层的参数更新所引起的数值分布改变的影响。batch归一化减少了输入值改变的影响,当输入值发生改变时,能够迫使后层适应的程度减小了,也就是削弱了前层参数与后层参数作用之间的联系,使得网络每一层的学习更加独立,有助于加速整个网络的学习。
除此之外,由于mini-batch的作用,归一化过程所求得的方差和均值只是当前样本大小的,与整体样本相比,会存在一些噪音,会带来轻微的正则化的效果,迫使后部单元不过分依赖任何一个隐藏单元,类似于dropout。对此,当dropout和mini-batch一起使用是,较大的mini-batch可以减少正则化的效果。
测试时的 batch归一化
batch归一化会将数据以mini-batch的形式逐一处理,但是,在测试时,可能需要对每一个样本逐一处理,此时归一化中的均值和方差对于单个样本没有意义,此时需要单独估算和.
可以采用指数加权平均的方法估计和,这个指数加权平均的过程涵盖了所有的mini-batch,具体的实现方式如下所示:
计算神经网络每一个隐藏层中每一个mini-batch的均值和方差.
利用指数加权平均的方法计算每一个隐藏层中的均值和方差。
softmax回归
之前学习的逻辑回归都是进行二元分类的,这种分类标准的输出是0和1,但是,当需要多元分类时,可以使用softmax激活函数来实现,具体如下所示:
在实现多元分类时,用表示需要类别数,假设有4个类别,则可以用表示,表示在输入的情况下,分别输出这四种类别的概率,并且,这四种类别的概率相加应该等于1.
就以神经网络而言,隐藏值的计算方法如下公式(1)所示:
在计算softmax激活函数之前,需要计算一个临时变量,具体如公式(2)所示,其中是4×1的,所以临时变量也是4×1的向量。
根据以上求得的临时变量,计算输出,如下公式(3)所示:
对于这个向量具体的某个值的计算,如下公式(4)所示:
以一个实际例子为例,假设向量,根据公式(1)计算,得到 .
在根据公式(3)计算可以得到每个节点输出概率的向量,如下所示:
通过以上计算,得到了每一个类别的概率。
训练一个softmax分类器
将softmax分类器运用到神经网络输出层时,损失函数一般如公式(5)所示。
就以上述示例而言,输出的向量将会是,我们希望损失函数尽可能小,此时,损失函数的输出将会退化为
损失函数尽可能小,则希望输出的概率最大。
当采用向量化实现是,此时输出的维数就会变成并且softmax函数反向传播的关键表达式是