以下文章来源于包包算法笔记 ,作者包包闭关修炼
如何给神经网络加入先验?
出几道题目开场!
以上问题,都对应着给神经网络加入先验的狭义应用。想看答案翻到最后!
今天的班车原创日更,我们就仔细探讨一下这个问题。
广义上讲,给神经网络加入先验,包含约定结果假设,引导神经网络,限制学习路径等。
用一句话讲,我不要神经网络觉得,我要我觉得!
在前面文章,为什么GBDT可以超越深度学习,讲解了人对数据的理解,作用于特征工程时候,会更有利于提升决策树,并且引用了好风凭借力,祝我上青云的例子。
那么问题来了,在决策树我会做特征,到了神经网络具体怎么操作呢? 我们从这四个方面展开,给大家抛砖引玉。
数据和特征
1.数据和特征层次
输入层次的先验引入主要是通过数据和特征下手,我们在前面文章,特征工程给了很好的例子可能是全网写特征工程最通透的...。
特征工程又不是传统机器学习算法的专属,神经网络良好的借用含有人先验知识的特征,也可以起到事半功倍的效果。
神经网络在非线性建模上有着无可比拟的优势,但一些特定的任务还是非常考验人的先验的。比如声纹识别领域,必须借助高级的特征工程,例如MFCC,这里面包含了大量的人工步骤和经验参数,预加重,分帧,加窗,快速傅里叶变换(FFT),梅尔滤波器组,离散余弦变换(DCT),等等,通过这些具体的操作把人对声音的刻画引入到神经网络。Kaggle老话:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。真的是金玉良言。
除此之外,在表数据也有很多特征辅助网络刷点的例子,比如CTR场景基本就是大量的特征构成的。引用DCN论文里的一句话:People generally consider DNNs as universal function approximators, that could potentially learn all kinds of feature interactions. However, recent studies found that DNNs are inefficient to even approximately model 2nd or 3rd-order feature crosses,他这里的意思就是说高阶的特征尽量往NN的后面放。其实原理直白了,我们前面的文章也都多多少少暗含了。就是富含先验特征是人工借力,你都有很多“人工”智能的成分了,就不要让NN瞎搞了,尽量靠后,这样NN的非线性搞砸的几率就变小了。
模型结构
2.模型结构层次
模型结构层次其实是大家一直在做的事情,具体的例子太多了。比如文本分类里面非常经典的textcnn模型,他假设了基本的文本分类原理。语义的局部组合性质,用3,4,5的卷积窗来模拟N-gram(词组)的语义学习。除此之外,图像分类常用的CNN中使用的卷积层就是局部假设,利用了图像像素距离越近相关性越强的先验 ,还有CTR中典型的神经网络交叉操作,都是人对数据和任务理解,在网络设计中具体的表达形式。
NLP中经典的注意力机制,也是如此。注意力机制现在几乎成了任何深度学习任务的必备组件了,他们提出的初衷都是人的先验,在神经网络中学习组件的具象化。
网络参数
3.网络参数层次
网络参数层次引入先验,这个分支路线点开了神经网络上预训练的技能树。
包括不限于word2vec,Bert,乃至图像里面的预训练resnet,MAE等。前面写的文章讲的很清楚:
他们搞的事情,就是把知识融入到网络参数中。为了达到这个目标,使用了很多目标任务选择方式的技能。比如NLP里从传统神经语言模型,发展到完形填空。CV里从大数据集分类预训练到图像复原重建。
当然除了目标任务选择,也涉及2里很多网络结构的设计。
模型蒸馏也算一种在网络参数层次+目标约束引入先验的具体操作。狭义的蒸馏是大的教师模型,用来指导小模型的训练,可以达到模型压缩,以及知识转移的作用。这里对模型蒸馏不再展开,可以查阅相关文章。
目标约束
4.目标约束层次
比如最近兴起的对比学习,他是很典型的在目标约束层次+数据和特征层次引入先验的。对比学习最简单的例子可以翻看前文
除了对比学习,文章开头题目中提到的问题,很多都是在目标约束层次来解决的。
回答开头的问题1,保持神经输出关于具体输入的单调性。神经网络的预测目标的单调性协议Loss,就是通过损失函数对单调性的约束,惩罚了破坏单调性的行为。
回答开头的问题2,回答层次分类约束的题目,包括各种先验的正则化,通过目标层级无环图,设计分层L2正则,约束了链接关系相近的类别,其预测值也要接近。
回答开头的问题3,回答多目标任务单调性的题目。我们可以通过这样的损失约束,来惩罚目标不不单调的行为。
当然,以上具体的正则化和Loss形式,都没法做到完全的单调性保证,只是尽量用人的先验来约束目标。
好了,班车也基本到站了。我们给文章做个总结,文章在数据和特征层次,模型结构层次,网络参数层次,目标约束层次四个方面总结了神经网络加入先验的方法。