聊聊神经网络中的正则化
如何减少泛化误差,是机器学习的核心问题。这篇文章首先将从六个角度去探讨什么是泛化能力,接着讲述有那些提高泛化能力的方法,这些正则化方法可以怎样进行分类,最后会通过讲述一篇论文,来说明目前的正则化方法在解释深度神经泛化能力方面的问题。本文假设读者对深度学习具有基本的了解,清楚卷积神经网络的前向传播和训练过程。如何提高泛化能力是一个面试中常见的问题,由于这个问题有太多的答案,如何有条理的组织自己的回答,本文第二部分可以供参考。
泛化能力最直接的定义是训练数据和真实数据间的差异,训练模型的目地是要模型在完全陌生的数据上进行测试的。因此在进行交叉验证的时候,要保证测试集和训练集有相同的数据分布。而当测试集和训练集本身的分布就不一致的时候,则可以使用将训练集和测试集混合的Adversarial Validation来应对。
泛化能力还可以看成模型的稀疏性。正如奥斯姆的剪刀指出的,面对不同的解释时,最简单的解释是最好的解释。在机器学习中,具有泛化能力的模型中应该有很多参数是接近0的。而在深度学习中,则是待优化的矩阵应该对稀疏性有偏好性。
泛化能力的第三种解释是生成模型中的高保真能力。具有泛化能力的模型应在其每个抽象层次具有重构特征的能力。第四种解释是模型能够有效的忽视琐碎的特征,或者说在无关的变化下都能找到相同的特征。比如CNN就能够忽视其关注特征所在的位置,而capsule网络则能够忽略特征是否旋转。去除掉越来越多的无关特征后,才能保证模型对真正在意的特征的准确生成能力。这和上述的第三点是相辅相成的。
泛化能力还可以看成模型的信息压缩能力。这里涉及到解释为什么深度学习有效的一种假说,信息瓶颈(information bottleneck),说的是一个模型对特征进行压缩(降维)的能力越强,其就越更大的可能性做出准确的分类。信息压缩能力可以概括上述的四种关于泛化能力的解释,稀疏的模型因其结构而完成了信息的压缩,生成能力强,泛化误差低的模型因信息压缩而可能,而忽略无关特征是信息压缩的副产品。
理解泛化能力的最后一种角度是风险最小化。这是从博弈论的角度来看,泛化能力强的模型能尽可能降低自己在真实环境中遇到意外的风险,因此会在内部产生对未知特征的预警机制,并提前做好应对预案。这是一种很抽象的也不那么精确的解释,但随着技术的进步,人们会找出在该解释下进行模型泛化能力的量化评价方法。
当然,以上的6种对泛化能力的解释不是全部说的通的解释,未来会有更多理解泛化能力的角度。对同一个概念理解的越深,达到其的可能道路就越多,接下来让我们看看怎么做才能提高泛化能力。
在机器学习中,正则化很容易理解,不管是L1还是L2,都是针对模型中参数过大的问题引入惩罚项。而在深度学习中,要优化的变成了一个个矩阵,参数变得多出了几个数量级,过拟合的可能性也相应的提高了。而要惩罚的是神经网络中每个神经元的权重大小,从而避免网络中的神经元走极端抄近路。
最直接的正则化是在损失函数中加入惩罚项,比如L2正则化,又称权重衰减(weight decay)关注的是权重平方和的平方根,是要网络中的权重接近0但不等于0,而在L1正则中,要关注的是权重的绝对值,权重可能被压缩成0。在深度学习中,L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。神经网络需要每一层的神经元尽可能的提取出有意义的特征,而这些特征不能是无源之水,因此L2正则用的多一些。
而深度学习中最常用的正则化技术是dropout,随机的丢掉一些神经元。类似的方法是drop link,即随机的丢掉一些网络中的连接。丢掉的神经元既可以在隐藏层,也可以在输入层。dropout是一种将模型进行集成的算法,每一个不完整的网络,都可以看成是一个弱分类器。由于要引入随机性,dropout适合本身就相对复杂的网络,一个三个隐藏神经元的三层神经网络就不要让神经元随机的耍大牌了。
另一个增加模型泛化能力的方法是数据增强,比如将原始图像翻转平移拉伸,从而是模型的训练数据集增大。数据增强已经是深度学习的必需步骤了,其对于模型的泛化能力增加普遍有效,但是不必做的太过,将原始数据量通过数据增加增加到2倍可以,但增加十倍百倍就只是增加了训练所需的时间,不会继续增加模型的泛化能力了。
另一个增加泛化能力的方法是提前停止(early stopping),就是让模型在训练的差不多的时候就停下来,比如继续训练带来提升不大或者连续几轮训练都不带来提升的时候,这样可以避免只是改进了训练集的指标但降低了测试集的指标。
最后一个改善模型泛化能力的方式是批量正则化(BN),就是将卷积神经网络的每层之间加上将神经元的权重调成标准正态分布的正则化层,这样可以让每一层的训练都从相似的起点出发,而对权重进行拉伸,等价于对特征进行拉伸,在输入层等价于数据增强。注意正则化层是不需要训练。
除了上述的四种方法,权重共享,随机梯度下降及其改进方法,例如Adam,都可以看做是另一种正则化的方法。而我还脑洞过一种正则化的方法,在卷积网络中的pooling层,可以做average pooling,也可以做max pooling,能不能在池化层引入随机性,在每次训练时一定比例的池化层神经员做max pooling,另外的做average pooling。这个方法是集成模型的套路,将不同的池化策略看成弱分类器的区别。当然我还没有试验过这样的方法,但由于池化层的影响不大,所以对这个方法的效果不乐观。
权重共享的示意图,就是神经员去模仿周围神经元的权重。
随机梯度下降的动态示意图,通过引入随机性避免局部最优,也可看成通过引入随机项来避免模型中的参数过大(回忆统计学中均值回归,说的是两诺贝尔奖得主的子女智商很大可能要比他们的父母低,因为他们的父母碰巧拿到了影响智商的随机项中的最高值,而他们的后代从概率上不应该还是这么幸运)