美文网首页
深层神经网络的超参数调试、正则化及优化

深层神经网络的超参数调试、正则化及优化

作者: 好好先生 | 来源:发表于2021-01-11 16:33 被阅读0次

    1. 机器学习基础

    1.1 训练集、验证集和测试集

    1.1.1 概念

    训练集 (Training set

           作用是用来拟合模型,通过设置分类器的参数,训练分类模型。后续结合验证集作用时,会选出同一参数的不同取值,拟合出多个分类器。

    验证集 (Dev set)

           作用是当通过训练集训练出多个模型后,为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数,即用来调整模型参数。如svm中的参数c和核函数等。

    测试集 (Test set)

           通过训练集和验证集得出最优模型后,使用测试集进行模型预测。用来衡量该最优模型的性能和分类能力。即可以把测试集当做从来不存在的数据集,当已经确定模型参数后,使用测试集进行模型性能评价。

    一个有助于理解的形象比喻:

           训练集 —— 课本,学生根据课本里的内容来掌握知识。

           验证集 —— 作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。

           测试集 —— 考试,考的题是平常都没有见过,考察学生举一反三的能力。

    1.1.2 作用

           训练集 直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止 过拟合)

           验证集 参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不代表其学习能力强)。

           所以要通过最终的考试(测试集)来考察一个学生(模型)真正的能力。

    1.1.3 选取

           如何将只有一个包含m个样例的数据集D,产生出训练集S和测试集T(验证集可以省略)?主要有以下三种方法:

    自助法bootstrapping

           给定m个样本的数据集D,我们对它进行采样产生数据集D',每次随机从D中挑选一个样本,将其拷贝入D',然后再将样本放回原始数据集D。显然,该样本在下次采样时任然有可能被采到。这个过程重复m次后,我们就得到了含有m个样本的数据集D',这就是自助采样的结果。         样本有重复采样,也有一次也没有被采到的。从未采到的结果是(1-\frac{1}{m} )^m ,取极限得到

                                               \lim_{m\to∞} (1-\frac{1}{m} )^m \rightarrow \frac{1}{e} \approx 0.368

    因此,使用自助法约有1/3的数据集没有被选中过,它们用于测试,这种方式叫“外包估计”。

           自助法在数据集小,难以划分训练集、测试集的时候有很大的效果,如果数据集足够大的时候,留出法和交叉验证是更好的选择。

    留出法hold-out

           将整个数据集D划分为两个互斥的集合,其中一个作为训练集S,另一个作为测试集T。即,D=S∪T,S∩T=∅。在S上训练出模型,T作为测试集,来评估模型效果。

           当样本数据量较小(10000条左右及以下)时,通常取其中70%作为训练集,30%作为测试集;或60%作为训练集,验证集和测试集各20%。

    交叉验证法cross validation

    交叉验证法流程图

           如图所示,交叉验证法的实现流程大致如下:

           (1) 将整个数据集分成k个大小相似的子集,即D=D1∪D2∪...∪Dk,Di∩Dj=∅(故又称k折交叉验证法,通常取k=10)。

           (2) 对于每一个模型Mi,算法执行k次,每次选择一个Sj(1≤j≤k)作为测试集,其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。

           (3) 算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。

           交叉验证的主要的目的是为了选择不同的模型类型(比如一次线性模型、非线性模型),而不是为了选择具体模型的具体参数。比如在BP神经网络中,其目的主要为了选择模型的层数、神经元的激活函数、每层模型的神经元个数(即所谓的超参数),每一层网络神经元连接的最终权重是在模型选择(即K折交叉验证)之后,由全部的训练数据重新训练。

    1.2 偏差和方差、欠拟合与过拟合

    1.2.1 概念

    数据集散点图 拟合结果

           假设这就是数据集,显然用简单分类器(如逻辑回归)并不能很好地拟合上述数据。这种情况称为 欠拟合 

           相反地,如果采用一个非常复杂的分类器(如深度神经网络或含有隐藏单元的神经网络),拟合效果会非常好。但与此同时,模型的复杂度也会过高,这种称为 过拟合 

           在两者之间,可能会存在一些复杂程度适中、数据拟合适度的分类器,拟合结果较为合理,称为 适度拟合

    模型误差与复杂度的关系

           如上图所示,训练集误差和验证集误差均较高时为 高偏差(欠拟合) 情况;训练集误差较高,验证集误差较高低时为 高方差(过拟合) 情况。

    1.2.2 如何减小偏差和方差(适度拟合)

    (1) 如何减小偏差(防止欠拟合)

           ① 增大神经网络规模。

    (2) 如何减小方差(防止过拟合)

           ① 增加数据集样本数量;

           ② 正则化。

    2. 超参数调试

    2.1 神经网络中参数&超参数的概念

            参数  是指神经网络中由数据驱动并进行调整的变量,如𝑊和𝑏。

           超参数  是指无需数据驱动,而是在训练前或者训练中人为进行调整的变量。例如算法中的learning rate 𝑎(学习率)、iterations(梯度下降法循环的数量)、𝐿(隐藏层数目)、𝑛[𝑙](隐藏层单元数目)、choice of activation function(激活函数的选择)等都需要人为设置,这些数字实际上控制了最后的参数𝑊和𝑏的值,所以它们被称作超参数。

    2.2 神经网络超参数的分类

           神经网络中的超参数主要分为三类:网络参数、优化参数、正则化参数。

    ​网络参数

           可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等。

    优化参数

           一般指学习率(learning rate)、批样本数量(batch size)、不同优化器的参数以及部分损失函数的可调参数等。

    正则化参数

           权重衰减系数,随机失活比率(dropout)等。

    3. 正则化

           正则化有利于减小训练集和验证集准确率的方差,防止过拟合。在无法增加样本数量或增加样本数量的成本过高时,正则化是一种行之有效的方法。

    3.1 常见的神经网络正则化方法

    3.1.1 l_{2} 正则化

    (1) l_{p} 范数的定义

            一般将任意n维向量 xl_{p} - 范数定义为

                                                                  ||x||_{p} =\sqrt[p]{\sum_{i}^n \vert x_{i}  \vert ^p }

           根据定义:

           当p=0时,xl_{0} 范数为||x||_{0} =\sqrt[0]{\sum_{i}^n \vert x_{i}  \vert ^0 } ,表示向量x中非0元素的个数。

           当p=1时,xl_{1} 范数为||x||_{1} =\sqrt[1]{\sum_{i}^n \vert x_{i}  \vert ^1 } =\sum_{i}^n\vert x_{i}  \vert  ,等于向量x中所有元素的绝对值之和。

            当p=2时,xl_{2} 范数为||x||_{2} =\sqrt[2]{\sum_{i}^n \vert x_{i}  \vert ^2 } =\sqrt{{\sum_{i}^n \vert x_{i}  \vert ^2 }} ,等于向量x中所有元素的平方和开根号。

    (2) l_{2} 正则化

           正则化(Regularization)的主要目的是控制模型复杂度,减小过拟合。最基本的正则化方法是在原目标(代价)函数 中添加惩罚项,对复杂度高的模型进行“惩罚”。

           对于神经网络模型,l_{2} 正则化即在其代价函数中添加l_{2} 正则项:

                                      J(\omega ,b)=\frac{1}{m}\sum_{i=1}^mL(\hat{y} ^i,y^i ) +\frac{\lambda }{2m}  ||\omega ||_{2}^2

    其中,||\omega ||_{2}^2=\sum_{j=1}^n \omega _{j}^2=\omega ^T\omega   。之后再求解优化问题min_{\omega ,b} J(\omega ,b)即可。

    3.1.2 dropout 正则化

    (1) dropout 的概念

    dropout 前 dropout 后

           假设某三层神经网络存在过拟合问题,采用dropout正则化会遍历网络的每一层,并设置消除该层中每一个节点的概率(比如0.5),最后得到一个节点更少、规模更小的网络,然后再用反向传播方法进行训练,就能有效防止过拟合。

    (2) 如何实施 dropout

           最常用的方法是inverted dropout(反向随机失活)。对于一个三层神经网络(l=3),以第三层为例,实施dropout的步骤如下:

    ① 定义一个三层dropout矩阵d3:

                                         d3=numpy.random.rand(a3.shape[0],a3.shape[1])

    其中,a3表示神经网络第三层的激活函数矩阵。

    ② 设置keep-prob(keep-prob\in [0,1])的大小。keep-prob表示保留某个隐藏单元的概率。将第①步产生的随机矩阵d3的每个元素与keep-prob进行比较,小于置1,大于置0,得到新的d3矩阵(1表示保留该节点,0表示删除该节点)。

    ③ 将a3与新的d3矩阵相乘(矩阵对应元素相乘),得到新的激活函数矩阵:

                                                           a3 =np.multiply(a3,d3)

    ④ 将新的a3矩阵除以keep-prob:

                                                                  a3 /= keep_prob

    目的是保证a3的期望值(均值)不变,从而保证第三层的输出不变。

    (3) dropout 能达到什么效果

    ① 使用dropout可以使得部分节点失活,可以起到简化神经网络结构的作用,从而起到正则化的作用。

    ② 因为dropout是使得神经网络的节点随机失活,这样会让神经网络在训练的时候不会使得某一个节点权重过大。因为该节点输入的特征可能会被清除,所以神经网络的节点不能依赖任何输入的特征。dropout最终会产生收缩权重的平方范数的效果,来压缩权重,达到类似于l_{2} 正则化的效果。

    (4) 使用 dropout 时应注意的地方

    ① dropout在测试阶段不需要使用,因为如果在测试阶段使用dropout可能会导致预测值产生随机变化(因为dropout使节点随机失活)。而且,在训练阶段已经将权重参数除以keep-prob来保证输出的期望值不变,所以在测试阶段没必要再使用dropout。

    ② 神经网络的不同层在使用dropout的时候,keep-prob可以不同。因为可能有的层参数比较多,比较复杂,keep-prob可以小一些,而对于结构比较简单的层,keep-prob的值可以大一些甚至为1,keep-prob等于1表示不使用dropout,即该层的所有节点都保留。

    3.1.3 数据扩增

    3.1.4 early stopping

    4. 优化

    4.1 归一化输入

    4.1.1 为什么要归一化输入

    (1) 目的

          加快训练速度。

    (2) 解释

           对于一个神经网络模型,考虑其代价函数:

                                                   J(\omega ,b)=\frac{1}{m}\sum_{i=1}^mL(\hat{y} ^i,y^i )

    是否归一化输入的区别

           如果未归一化输入,其代价函数的形状会较为细长狭窄。在这样的代价函数的限制下,为避免陷入局部最优解,梯度下降法的学习率必须设置得非常小。

           如果归一化输入,代价函数便呈现球形轮廓。这种情况下,不论从哪个位置开始梯度下降法,都能使用较大的学习率,从而更快速、直接地找到全局最优解。

    (3) 实现步骤

          对于包含n个特征的m个样本的数据集,其输入归一化的过程主要分为两步:

    ① 零均值化

                                                                 \mu =\frac{1}{m} \sum_{i=1}^mx^i

                                                                x^i:=x^i-\mu

    ② 归一化方差

                                                               \sigma ^2=\frac{1}{m}\sum_{i=1}^m(x^i )^2

                                                                  x^i:=x^i/\sigma

    其中,x^i代表第i个样本的特征矩阵。

    (4) 归一化输入时的注意事项

           训练集、验证集、测试集特征矩阵的平均值\mu 和标准差\sigma 要保持一致,确保它们归一化后符合同一分布。

    相关文章

      网友评论

          本文标题:深层神经网络的超参数调试、正则化及优化

          本文链接:https://www.haomeiwen.com/subject/qordaktx.html