雷锋网[AI科技评论]按:中国人工智能学会AIDL第二期【人工智能前沿讲习班】在北京中科院自动化所举行,主题为【机器学习前沿】。周志华教授担任学术主任,前来授课的嘉宾均为中国机器学习界一流专家、资深科研人员和企业精英,包括:耿新、郭天佑、刘铁岩、王立威、叶杰平、于剑、余扬、张长水、郑宇、朱军。
来自清华大学计算机科学与技术系的朱军副教授做了题为《贝叶斯学习前沿进展》的开场分享课,总时长为两个小时,内容主要分为三大部分:贝叶斯基本理论、模型和算法;可扩展的贝叶斯方法;深度生成模型。本文乃三大内容中的第二及第三部分,由雷锋网AI科技评论编辑。
传送门: 清华大学计算机科学与技术系朱军教授:机器学习里的贝叶斯基本理论、模型和算法
朱军
清华大学计算机系长聘副教授、智能技术与系统国家重点实验室副主任、深度学习技术与应用国家工程实验室副主任、国家万人计划青年拔尖人才、中国自然科学基金优秀青年基金获得者、中国计算机学会青年科学家、IEEE AI's 10 to Watch入选者。
以下是根据朱军副教授现场分享整理的文字报告,雷锋网[AI科技评论]做编辑整理。
第二部分 可扩展的贝叶斯方法
我们先看一下这个经典的贝叶斯定理,它有一个很好的性质是序列更新的,这对于处理流式数据非常适合。比如:用B1,…,Bt表示第一个时刻到第t个时刻的数据集,我们可以得到一个递推公式:假设已经算出来了第t-1时刻的后验分布,那么下一个时刻t的后验分布正比于第t-1时刻的后验分布乘上新来数据集Bt的似然函数,这个迭代过程实际上是把上一时刻的后验作为当前时刻的先验分布了。这是非常漂亮的递推公式,可以实时处理流式数据。
但它有一个前提是你可以算出来每个时刻的后验分布。这对于简单的模型是可行的,比如:线性动态系统。但是,对于一般的模型,每一步都很难算出精确的后验分布,所以这个更新公式并不好算。需要一些好的算法。
在线变分贝叶斯(OVB)
最近,在算法上大家做了很多的工作,有一个叫在线(流式)变分贝叶斯的算法,采用的是我们前面所提到的变分近似的思想实现在线贝叶斯推理。假设有一个算法A,它的输入是一个数据集和先验,输出是一个近似的后验分布。在第一个时刻可以用第一个数据值加上先验来更新,得到一个近似的后验。在接下来一个新的数据集,可以用t-1时刻的近似后验来做新的先验,随着时间的推移你会得到t+1、t+2……时刻的后验分布,这就是流式计算的方法。
分布式贝叶斯更新(Distributed Bayesian Updating)
贝叶斯公式还有另外一个好的性质,适合多个机器的分布式计算。比如,假设现在有100台机器,每个机器有1%的数据。我们先并行的在每个机器上处理这1%的数据得到100个局部后验分布;然后,再把它们集成在一起,就会得到我们想要的精确后验分布。同样,这是非常漂亮的性质。
但是,它存在同样的挑战:对于一般的贝叶斯模型,我们得不到局部后验分布的解析解。为了处理这个困难,我们会考虑用一个近似的算法去做,再集合在一起。
它的适用范围非常广泛,这里有一套公式,具体的细节我不说了,如果感兴趣的话,大家可以研究一下:如果这个算法输出的是一个指数族分布,你集成在一起还是指数族分布,只要把参数变化一下就行了,这是它的最大好处。
我们组也在这些方面做了一些工作,包括:在线/随机算法和分布式算法等;大家也可以阅读我在演讲开头提及的综述文章,以供参考。
我现在给大家介绍一个在线学习的例子。我们考虑用贝叶斯模型做在线的分类。这是一个有监督的学习任务,因此会有一个损失函数。
我们先看一下在线学习的基本过程。假设有一个初始的模型,我可以用它对新来的数据做预测,判断它属于哪类。预测完之后会有两个结论,一个是预测准确了,另外一个是预测错了。
-
如果预测准确的话,我们可以不做任何事情,这个模型已经比较好了。
-
如果预测错了的话,我们可以把当前的模型送到学习算法里面做一次更新。
这是很基本的一个在线学习的框架。
Online Passive—Aggressive Updates
其中,有一个很经典的具体算法,叫Online Passive—Aggressive Learning,它是针对SVM提出的在线学习算法。因为SVM是学一个特定的模型,假设当前的模型参数是Wt,新数据出现后会做一个判断,结果可能是正确的或错误的。如果判断正确就是说你的模型足够好,那么可以采用Passive Update的策略,所谓的消极是指:我不更新,直接把这个模型拷贝到下一个时刻;还有另外一种情况,如果判断错了,就采取一个激进(Aggressive)的方法,比如:刚才的模型不够好,我就做一个投影,投影到好的模型的区域里,得到一个新的模型。这是两种操作,每一个数据都进行判断,再选择Passive或是Aggressive的策略,然后不断地迭代,这种很简单的策略实际上还有一些好的性质,实际应用的效果也挺好。
现在,我们可以做一个很简单的类比,把上述更新过程扩展到贝叶斯模型,在线地学习贝叶斯SVM,每个时刻都学到所有模型的一个后验分布。这个想法实际上和前面的更新过程基本上是一样的,差别在于我们更新的是后验分布。假设当前的后验分布是 qt(W),新来的数据可以用一个准则判断它到底是正确还是错误,同样对应到两种情况,如果正确的话,表明当前的后验分布足够好了,我可以不去更新,实际操作时如果有似然函数,我可以用贝叶斯定理做一次更新,不会影响这个结果。当我们犯错误的时候,可以做一个Aggressive的更新,得到新的分布。
在错误发生时,我们可以做硬约束或是允许一定错误的软约束,来优化这个错误率。理论分析我这里就不细说了。
这种在线贝叶斯学习的最大好处时它可以处理隐含变量(数据中没有观察到的变量),挖掘数据中的隐含结构。在这种情况下,只需要对前面讲的在线更新的过程稍加扩展即可,基本流程保持不变。
这里讲一个话题模型的例子。比如:我明天要出差,现在想订一个宾馆,那么我可能会打开网站去看它的评论和打分;现在,这方面的数据有很多。假设我们拿到了很多评论文档数据,我们可以做两件事情,一个是挖掘大家关心的主题是哪些,另一个是看看某个具体的评论是倾向于正面还是负面,这实际上是做一个判别。这就可以用我刚才所讲的在线贝叶斯学习来实现。
具体过程我就不讲了。这里给大家看一个效果,横轴是时间,纵轴是分类的正确率(F1值)。这里列出来多个算法,大家显然能看出来,基于在线贝叶斯学习的算法要比使用批处理的方法大约有100倍的性能提升,同时,分类的精度没有下降(甚至可能有提升)。
这里边道理是什么呢?实际上,大数据里边通常有很多冗余,在做模型更新的时候没必要把所有的数据都处理一遍,尤其当你的数据集特别大的时候完全没有必要,现在大家训练的深度学习也是一样,最常用的方法是用随机梯度,思想是一样的。我们没必要把上万张图片扫描一遍,再更新模型的权重,少量图片其实就足够了。由于每次计算的数据量非常少,因此,总体时间上有很大优势。
分布式后采样
我们前面讲贝叶斯方法本身有一个很好的性质做分布式计算,但是,难点在于我们怎么去做计算。我们在这方面做了一个工作,是基于MCMC蒙特卡洛采样的,发表在NIPS 2014。它的基本思路是,我们把数据划分到多个机器,先采用MCMC的方法去估算局部后验分布(的一些统计量),然后采用期望传播(EP)的框架在多个机器之间传递信息,把采样的样本聚集合在一起,以解决近似后验分布的问题。这个算法收敛之后,每个局部的分布实际上就是我们想要的全局分布。这个算法支持同步更新、异步更新以及去中心化的更新方式,配置非常灵活。
第三部分 深度生成模型(Deep Generative Models)
我接下来讲一些大家可能都很关心的深度学习。我主要介绍一些深度生成模型,包括无监督和半监督学习的模型。
通常情况下,大家做深度学习时,用的更多的是所谓的判别式深度学习,比如深度卷积网络,它的目的是学习一个从输入到输出的影射函数,在测试时,判断测试样本属于哪个类。这种网络已经在人脸识别、语音识别或者自然语言(处理)的很多任务中应用。当然,在实际做的时候,还要注意一些细节,包括一些保护模型、避免过拟合的机制。
深度卷积网络已经被广泛应用,包括发展出来的一些变种的网络结构。最近,这种网络也用于强化学习,比如AlphaGo。细节这里就不说了,我今天想和大家分享一下,除了这种判别式学习,深度学习实际上还有许多问题值得我们关注。
简单来说,深度学习现在的应用场景有以下三点。大模型;大数据;大集群。
首先,现在的模型比较大,主要体现在它有很多参数。这是2012年的一个例子,它大概有10亿个参数。其次,训练数据比较多,当时的训练使用了1000万的图片。最后,需要很大的计算资源,我可以用CPU或者GPU集群来运算,这几乎成了现在做深度学习的标配。
过拟合
在这种场景下,往往有一个误解:如果有大数据,过拟合就不再是问题了。实际上,我们说,大数据情况下过拟合可能变得更严重。
具体来说,对于一个机器学习算法,我们实际上不是在关心数据的个数有多大,10万也好,100万也罢;我们更关心的是,这个数据里包含的信息有多少,给我们模型训练所带来的统计信息有多大。数据量多会给我们带来很大的处理负担。
这有一个研究结果,它衡量了当数据大小增加时,数据中的相关信息(relevant information)是如何增加的。
该图呈现了常见的三个情况:
-
第一个是水平线:数据增加时,信息没有增加。这个场景很容易理解,如果你的数据是周期性的、不断重复的,当你知道一个周期的数据之后,基本上覆盖了全部的信息,那么再增加更多周期,对训练模型没有太大帮助。
-
再一个是Log N的曲线:当数据的产生过程可以用有限的参数刻画时,信息量大概是Log N的速度增加。
-
还有更快一些的曲线,N0.5,它描述的是更复杂的情况,数据不能用有限阐述的模型刻画,这种情况下信息量也会更多。
总体上,这三种情况下的信息增加速度都远低于线性,充分反映了数据中存在很多冗余。所以,在这种大数据下,过拟合是一个更值得关注的问题。
另外,深度学习还有其他的问题,比如:不够鲁棒。对于一个训练好的神经网络,正常情况下识别精度很高,但如果对输入图片加一些少量干扰(人甚至识别不出来),可能同一个图像却完全识别错了。我们也可以随意地用样本误导它,比如:通过添加噪声,可以诱导一个网络把特定图像识别成指定的类别。这种特性对于关键领域的应用是非常危险的。
Dropout
因此,对深度学习来说,避免过拟合,增加鲁棒性是本质的问题。Dropout就是一个非常简单,但很有效的避免过拟合的策略。它是一个随机策略:我们在训练网络时,每次迭代都随机丢掉一些节点(或权重)的更新。这种方法对结果的提升是比较显著的。
Dropout刚提出时,大家并不清楚如何解释它。后来,大家在类似的框架下来解释dropout,包括我们自己在SVM方面的工作。最新的进展是Gal和Ghahramani去年的工作,把dropout理解成贝叶斯推理的近似,这也体现了贝叶斯方法在保护模型,避免过拟合方面的效用。
Dropout只是一个例子。事实上,贝叶斯和深度学习之间还存在很多的关联,甚至互补的关系,如果能够将二者有机融合,将更好地推动人工智能的发展。
这里有一个很好的贝叶斯的最新进展。2015年Science的一篇封面文章介绍了贝叶斯程序学习(BPL),它本质上是一个多层的贝叶斯生成模型,具有层次的结构,因此,也可以看成是一个深度模型。它和深度学习不一样的地方在于,每一层的随机过程都有清晰的定义,比较容易解释,比如说:在刻画手写体字数生成的过程是,最上层是一些基本笔画,然后,通过随机采样会组合出一些部件(parts),再按照一定的规则组合在一起,形成字符的基本框架;最后是按照一定的噪声模型,生成所观察的具体数据。
这是一个典型的主观贝叶斯模型,通过对手写体字符生成过程的相对精细的描述,构造了一个有意义的层次化结构,这样的好处是可以实现小样本下的学习——通过主观先验知识弥补数据上的不足。
这个文章展示的是单示例学习(one-shot learning):只给模型一个有标注的训练数据,让它识别其他没有识别的数据。实验结果是非常好的,BPL远好于一般的深度学习网络以及针对 one-shot learning做过改进的深度网络。同时,BPL的结果比人做的错误率还要低。
这是一个很好但也很极端的例子。它把主观贝叶斯的想法发挥到了极致,它的先验分布是基于对问题的深入理解而构建的。虽然在特定任务上表现很好,但问题是与特定领域的结合太强,如果换到另外一个领域,整个BPL要重新设计。
实际上,深度学习和贝叶斯可以看成一个谱(spectrum)的两个极端。基于数据驱动的深度学习需要大量的标注数据来训练网络;而贝叶斯方法通过引入知识,加上小的训练样本也可以达到很好的效果。大家可以想想,两者的中间是什么?事实上,越来越多的人在思考,我们能不能朝中间靠拢一些?处在中间的模型应该具有两方面的优点:
-
能够利用深度学习的长处,对复杂特性进行建模和拟合,利用数据驱动的方式进行训练;
-
能够融合贝叶斯方法的优点,刻画数据中存在不确定性,以及小样本学习等。
我们把融合了二者优点的方法称为贝叶斯深度学习。
在深度学习中应用贝叶斯方法
事实上,已经有不少工作将贝叶斯方法用在深度学习上。早在神经网络时期,MacKay、Neal等人已经开始用贝叶斯来保护网络避免过拟合。后来,也有了一些深入分析。近期的结果也有不少,其中一个是用非参数化贝叶斯来学深度神经网络的结构,并且获得了2010年的AISTATS最佳论文奖。
接下来,我们来看一下一类重要的,最近进展很快的贝叶斯深度学习模型——深度生成模型。
它们和判别式模型不一样,其主要目标是构建一个能够刻画数据分布的模型,通过逼近数据的真实分布,提取数据中的结构。有了这个模型之后,我们可以对它做采样,产生新的样本,比如:这是一个手写体的数据集,是从真实分布里采样得到的。我们学完生成模型之后,可以得到一个逼近真实分布的模型。我对这个模型再次采样后会得到一些新的样本(一些在训练数据里面没有出现过的样本)。
为什么我们要用生成模型
生成模型有很多用处。首先,是生成新的样本,即:创作,在学习完之后,可以“举一反三”。其次,可以充分利用无监督数据进行学习,挖掘数据中的结构规律。再次,可以做半监督学习,融合一小部分有标注的数据和一大部分未标注的数据。最后,可以做有条件的生成,比如:从文本到语言的生成、从一种语言到另外一种语言的生成、从图片到文本的生成等。
最近有很多进展,包括比较流行的GAN、VAE等,都是生成模型。
这是对生成模型的一个抽象描述。基本框架是一个概率模型,可以随机采样。X是我们的观察变量,在训练集里观察到一些具体的取值。为了解释X,生成模型假设它是由一些隐含的变量产生的,这里用Z表示隐含变量,服从某种分布。从Z生成X的过程可以是随机的,比如:p(X|Z),也可以是某种退化的确定性变换X=f(Z)。由于Z的随机性,两种定义都是可以描述X的随机性,并对X进行采样。后面会看到一些具体的例子。这里我们先关注前者。
除了使用有向的贝叶斯网络来刻画,生成模型还可以用无向图的随机场来定义,典型的例子是受限玻尔兹曼机(RBM)。
这两类模型都定义了X和Z的联合分布。在给定数据X的具体值时,我们希望推断出隐含变量Z的信息,即:后验分布。这可以通过贝叶斯公式实现。
下面是一些典型的例子,在机器学习或模式识别的课上可能都讲过。最上边是一个简单的混合模型,下边是一个因子分析模型。这些基本模型是构建深度生成模型的基本单元。
深度生成模型
深度生成模型的概念其实很直接,就是,隐含变量Z可以有多层,不同层之间存在连接关系,这里的连接比深度神经网络中的要更广泛,我们即支持确定性的函数变换(比如:ReLu),也支持随机的变换。总体上,Z是随机的,服从某种先验分布。
在给定观察样本时,我们希望反向推断出来Z的后验分布。这和一般的神经网络是完全一样的,希望Z具有一定的语义,且越高层的Z其语义也高级,以至于能解释观察到的现象。
这有一个简单的例子,来说明深度生成模型的定义和灵活性。
这个Z是一个非常简单的分布:标准高斯。通过随机采样,我们得到一个Z的具体值,然后经过一个非线性的网络(比如:一个简单的MLP全连接网络)变换,我们把该网络的输出定义为刻画X分布的参数,比如:我们假设X的两个维度是独立的,分布服从高斯分布,那么,MLP的四个输出神经元分布对应这两个高斯分布的均值和方差。
这是一个非常直观的定义方式,但是,非常有效。我们知道,一个简单分布的随机变量通过函数变换之后,会得到一个复杂分布的随机变量。这里是使用参数化的深度神经网络来定义函数变换,它的参数可以通过训练数据自动学习出来,因此,比人为选择的特定函数具有更好的适应性。它充分利用了神经网络强大的函数拟合能力。
定义完模型之后,接下来的问题是如何学习参数。根据前面的介绍,我们的主要目标是让模型分布与数据分布尽量接近。因此,需要一个合适的度量,来衡量两个分布的远近。目前,已经发展了多个性质较好的准则学习深度生成模型。
-
最直接常用的方法是最大似然估计(MLE),它适用于定义了数据似然函数的模型。我们后面会有一个典型的例子。
-
另一种方法是矩匹配(Moment-matching),它实际上历史比MLE还要早,最早用于估计高斯分布。最近,被用来学习深度生成模型,它适用于所有深度生成模型。只要我们能从模型中采样,就可以通过某种矩匹配的准则,对模型进行优化。对于复杂分布,需要用到核方法。
-
另外一种是GAN,它是基于博弈论的思路,定义了一个minimax对抗游戏。其中一个玩家是生成模型G,可以产生一些数据;另一个玩家是判别模型D。G的目的是“以假乱真”,尽量生成不被D检测出来的“真实”样本。D的目的是区分真实数据和虚假数据。二者在对抗过程中,不断学习进步,最终达到“均衡”——G分布与真实分布吻合。最近,对GAN的关注比较多,出现了很多变种。
下面,我们主要介绍MLE的思想,关于GAN和矩匹配,可以参考其他材料深入了解。
AEVB(Auto-Encoding Variational Bayes)
变分推断是一种常用的对复杂模型做后验推断的工具。为了处理深度生成模型,最近在算法上有一些根本的变化。这里有一个典型的叫AEVB。
深度生成模型的特点在于隐含变量存在复杂的函数变换(比如:用神经网络来刻画的非线性变换),所以,这种模型的后验分布p有很多局部概率比较大的点,一般的方法是很难逼近的。AEVB的基本思想是:采用另一个神经网络定义一个深度产生模型q,来反向逼近目标。
这里是一个构造从X到Z的变分分布q的例子。我们从数据X出发,通过神经网络变换,其输出当作Z的后验分布的参数,比如:高斯分布的均值和方差。同样的,这种定义也是充分利用了神经网络强大的函数拟合能力。这个网络叫做Q网络。相应的,生成数据的网络称为P网络。这网络的参数可以一起优化,比如:使用随机梯度的方法。
把Q-P网络放在一起,我们可以构成如下的图示。它看上去和一个标准的Auto-Encoder是类似的结构,差别在于这里的变量是随机的,我们要处理的目标是概率分布。正因为这种类似,这种方法被称为Auto-Encoding Variational Bayes (AEVB)。
上面是AEVB的基本框架,当然,在具体做的时候,还有一些细节,比如:如何计算随机梯度?如何控制随机梯度的方差?如何自适应调整步长等等。这里就不在一一介绍了。
下面还有一点时间,快速看一些具体的例子。
首先,在AEVB中,Q-P 网络一般是对称的,P怎么生成的,Q网络就反过来。但是,实际上非对称的网络可能更适合。我们知道,用于识别的网络Q,其主要目的是从底层输入中逐层抽象,提取高层的特征表示。但是,在提取过程中,我们会丢失细节信息。所以,到了高层的Z之后,再反过来生成X,实际上细节信息就没有了,而且没办法恢复。一个简单的解决思路是打破这种对称结构,让生产网络具有某种机制,把细节信息记下来,在生成新样本时,可以使用。
这里我们做了一个初步尝试,在生成网络上引入可以学习的记忆(memory)单元,这个memory是记细节信息的。在生成具体图像时,通过一个有选择性的模型,得到一个稀疏的权重向量,对memory中的单元进行加权求和,并且与高层表示结合在一起,就可以生成底层想要的细节信息,基本的结构如下图所示,多个基本层叠加在一起,可以构造一个深度生成模型。
这个想法很简单,受到了脑科学的启发,它的实际效果很显著。基本上在不增加网络参数的情况下,用memory记得信息得到的恢复结果要比不用的好很多,生成质量会更好。
深度生成模型最主要的任务是做样本生成,从未标注数据中学习。最近,也被用来做半监督学习,其主要目的是利用大量未标注数据,学习更好的分类器。这里面有两个问题需要回答,首先,深度生成模型的识别精度如何?其次,如何将未标注和有标注数据很好地融合在一起?我们课题组做了一些探索,发现深度生成模型在适当训练的情况下,其识别精度可以与判别式神经网络类似,而且产生新样本的能力没有受影响,这在一些困难场景下具有优势,比如:当输入样本被污染,或者存在缺失数据时,可以用生成模型对数据进行恢复,其识别性能往往不会受到很大影响;相反,判别式的神经网络是不具备这些能力的,其精度往往恶化严重。在识别任务中,深度生成模型也可以利用卷积运算以及池化操作等,处理复杂的图像。
对于第二个问题,最近也有不少进展,包括我们自己的工作,半监督的深度生成模型在很多任务上都获得了当前最好的识别精度。更有趣的是,在半监督任务下,我们可以把类别信息和风格(style)信息区分开,生成特定变化的样本。例如:在生成的时候,可以先给定一个类,通过变化Style,得到同一个类的不同Style的图像(如MNIST字符);也可以通过固定Style,变化类别得到不同类别的相同Style的图像。因此,可以从两个维度刻画生成的样本。
以上是我想跟大家分享的。我想说的主要观点是:即使在做深度学习或者大数据时,经典的贝叶斯方法还是非常有用的,而且应该得到大家的重视。现在比较活跃的一个发展方向。从历史上看,人工智能的基本原理很大层度上依赖于概率统计。深度学习也会一样。我相信会有越来越多的工作在这方面深入探索。
最后,我们还做了一个事情,值得和大家分享。我们知道,深度神经网络的快速发展离不开开源平台的贡献,比如TensorFlow、Caffe、Theano等等。这些平台都是支持神经网络的训练和测试,目前仍然缺乏一个有效的平台,支持贝叶斯深度学习、深度生成模型等。如果每个模型都从底层开始实现,将会是一个非常痛苦的事情。为了降低深度生成模型的使用和开发门槛,我们研发了“珠算”(ZhuSuan)Python库,已经在Github上开源,欢迎大家试用( https://zhusuan.readthedocs.io)。珠算是基于TensorFlow的,充分支持TensorFlow中的各种运算,非常好用,实现一个深度生成模型就像一个普通的神经网络一样方便。
以上为朱军老师的《贝叶斯学习前沿进展》分享,更多干货请关注雷锋网(公众号:雷锋网)。
。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/84619.html