以下为张东晓在机器之心 AI 科技年会上的演讲内容,机器之心进行了不改变原意的编辑、整理:
非常高兴有机会参加机器之心线上 AI 科技年会,并和大家分享我们最近的一些思考。今天我分享的内容包括三部分,第一部分是数据驱动模型;第二部分是理论指导的数据驱动模型,即知识嵌入;第三部分是数据驱动的模型挖掘,即知识发现。
一、数据驱动模型
首先,大家非常清楚模型驱动的方法,经过一个模型得到一个输出。我们学编程的时候,无论是复杂的算法还是简单的算法,都是在构建一个模型,这样有一个输入就会有一个输出。当然,这个算法可以是确定的,也可以是随机的。
另一方面是数据驱动的模式。这种模式我们还不清楚其输入和输出之间的映射关系,但是我们有数据。如果我们利用数据,经过学习,可以建立输入和输出之间的映射关系。当然了,这映射关系可能是个黑箱子,它不一定是一个显示的表达式。但是如果有了映射关系,我们就会有一个新的输入,从而得到一个新的输出。这就是现在这一代机器学习的核心数据驱动方法。
我们要解决问题到底是数据驱动还是模型驱动?这是一个值得思考的问题。
首先来看一下数据驱动的一些例子,比如大家熟悉的大数据分析,数据科学机器学习等等。在数据和模型的天平中,这里是侧重于数据的,通过数据来寻找映射关系。
下面举几个例子,比如可再生能源的发电量的预测问题。如果我们有辐照量、温度、湿度、风速、昼夜的情况,以及历史的光伏发电量数据,就可以根据这些数据建立一种映射关系。基于此映射关系和天气预报数据,我们就能预测第二天光伏的发电量。风电也是一样。
映射关系可以通过各种方法来建立,比如支持向量机、卷积神经网络或者循环神经网络等等。它的核心就是寻找多元输入变量和目标变量之间的复杂映射关系,从而构建它预测的模型。
这是一个集中式光伏电站的发电量预测案例,拥有刚才提到的那些信息。我们可以经过处理以后,建立映射关系并对未来做预测。最终隔天预报的准确率可以达到 97% 。
当然了,风电也是一样。因为风力发电的历史发电量和历史的风速数据之间也有很好的相关性。所以,如果能够建立它们之间的映射关系,就可以对发电量做预测。
数据驱动模型在许多问题中得到了很好的效果,但是对很多应用来讲,数据是不容易获得的。比如对于地下资源勘探与开发重要的侧井曲线,打一口井进行测量可能要好几千万人民币;再比如,做一组吸附解析的实验要花很长的时间。很难获得足够的数据基于数据驱动方法对此类问题建模。
大家都知道,大模型需要大数据、大算力,比较有名的 GPT-3,有 96 层,有 1 万多个隐层维度,有接近 1750 亿个参数。要训练这样一个模型,需要的费用是非常高的,需要的数据量也非常大。
另外数据驱动的模型的指标往往有局限性,比如常使用的 MSE(均方误差),它是对误差的一个平均度量。它对误差的物理过程是没有区分的,比如一个系统无论是熵增还是熵减,对于 MSE 来讲都是一样的,虽然熵增与熵减对于一个物理系统来讲非常不一样。基于数据平均意义上的指标往往会忽略物理过程,比如我们一只脚踏在冰上,一只脚踏在火上,平均温度可能很舒服,但是实际情况并非如此。而 MSE 则只会关注这种数据上的平均结果。因此,在实际使用中,MSE 等数据驱动指标往往是有局限性的。
另外一方面,因为我们建立的很多模型是缺乏常识的,它没有人类世界的各种知识,这样很容易被攻击。比如在对抗样本的问题中,图片本来是一个熊猫,加上一点轻微的噪音以后,可能机器会认为它是一个长臂猿。再比如这种阿拉伯数字,对人类来讲,稍微加点噪音进去,我们仍然会认为是 8 或者 9;但机器可能不认为,因为很多时候它没有常识。
既然数据驱动存在问题,那么可否像早期的人工智能一样基于知识建模呢?然而对很多复杂的问题,很难完全基于知识来构建模型。这也是现在基于数据驱动的人工智能模型被广泛推广的一个原因。
对很多行业来讲,比如能源,对于模型的鲁棒性和可解释性要求很高,同时数据的采集费时且成本高,而且这个系统极其复杂,存在大量高维非线性的映射关系。这些特点导致纯粹的数据驱动或者知识驱动模型无法达到令人满意的效果。针对此问题,我们希望通过灵活利用能源行业多年积累的知识,构建知识与数据双驱动模型,提升模型精度和鲁棒性,降低数据需求。
这里我们提出一个智慧能源概念,它是基于领域的知识,利用观测的数据,使用人工智能的方法,所构建的一个技术体系。
领域知识和数据驱动的融合包含两个方面,一个是知识的嵌入,也就是如何构建具有物理常识的 AI 模型。通过在 AI 模型中嵌入领域知识,可以一方面借助机器学习的强拟合能力来描述变量之间高维复杂的映射关系,提高模型的准确率。同时,利用行业的先验知识保证预测结果符合物理机理,不违反常识。这就是知识嵌入在机器学习中的作用。
另外一方面是利用科学机器学习发现知识,也就是知识发现。知识发现是利用深度学习来探索物理原理,从观测数据或实验数据中直接挖掘控制方程,推进人类认知的前沿。知识嵌入和知识发现可以形成一个闭环,实现知识和数据的融合。
后面第二部分我会重点来讲知识嵌入,也就是如何构建具有物理常识的 AI 模型。第三部分来讲知识发现,如何利用人工智能来发现新的知识,比如物理原理、控制方程,第一性原理等等。有了这样的一个闭环以后,很多问题比如仿真模拟,反问题,可解释性等等,都能够有很好的解决。
二、理论指导的数据驱动模型(知识嵌入)
我们看看第二部分的知识嵌入。在这个过程中,既有数据,也有模型,它是两个方法之间的一个平衡。我们要兼顾二者,实现在数据驱动建模的全流程中嵌入知识。
知识嵌入的目的是通过在数据驱动模型中引入物理知识,构建物理上合理,数学上准确,计算上稳定高效的机器学习模型。所以,我们要考虑的核心问题主要有,复杂形式控制方程的嵌入,控制方程以外通用知识的嵌入,不规则物理场的知识嵌入,以及损失函数中正则项权重的自动调整策略等等。
在建模过程的多个环节都可以进行知识嵌入,比如在数据预处理环节,可以嵌入物理约束和人类的领域知识和先验经验。这与特征工程和数据归一化往往相关。还有在模型结构设计环节,也可以基于领域知识调整模型的网络结构或者拓扑结构。再有也可以在模型的优化调整环节嵌入领域知识,比如在学习过程中通过惩罚和激励来嵌入知识,其中最简单的方法是构建特殊设计的损失函数。我们举几个例子。
第一个例子是电力系统中电力负荷的预测。这项工作中的知识嵌入主要体现在数据的预处理方面和模型的反馈更新方面,其中数据预处理方面我们引入了一种电力负荷比值分解的方法来嵌入知识,在反馈更新环节利用一种自研的 EnLSTM 模型来优化,这种模型采用领域算法改进了优化过程。
在数据预处理方面,我们把电力负荷数据分解成一个大的趋势和局部扰动,大的趋势反映了预测区域的内在模式,比如能源结构和人口结构等,是根据历史数据和专家经验来确定的。局部扰动则是系统受到天气等外驱力影响下所产生的变化,通过数据驱动模型来预测。最终,将大的趋势和小的扰动结合起来。此外,我们还采用了一种负荷比值转化的方式,以实现数据的平稳化。比值的周期是根据物理过程确定的。这个方法我就不具体展开了,大家如果感兴趣可以看我们 2021 年发表的论文 TgDLF。
这个方法在北京的 12 个区进行了试验验证,基于 3 年多的真实小时级别数据,利用部分区的数据训练模型,对另外的区进行预测。比如右侧是对丰台区的电力负荷的预测结果。图中一共有 1362 天的预测结果,其中五个局部被放大展示,黑色线是真实测量值,红色线是预测值,灰色的是可信区间。大家看这个效果还是非常好的,准确率可以稳定达到 90% 以上。需要说明的是,我们在模型的训练中并没有利用丰台的数据,而仅仅使用了周边的区进行训练。
另外在模型的效果评估阶段也可以嵌入知识。比如在风力发电问题中,我们将概率分布所蕴含的信息作为约束,嵌入到数据驱动模型中,从而借助先验的概率密度函数拓展优化损失函数。
大家知道在风力发电中,风机的发电功率和风速有很大关系。由于实际工况复杂,所以该曲线并非一个一对一的映射,而是需要用描述风速和发电功率之间关系的概率分布函数来表征。如果我们有历史的数据,就可以从历史数据中得到先验的风功率曲线,然后通过改造损失函数,将其嵌入到模型的训练过程中。通过这种方法建立的人工智能模型不仅具有数据驱动的优势,还能保证输出结果符合先验的概率分布。
这是预测的结果,实际的结果还是非常好的。
在有噪音的情况下,嵌入了先验的概率密度分布函数的模型的效果比纯数据驱动模型的效果要好很多。这说明通过嵌入领域知识,可以有效提升模型的抗噪能力和鲁棒性。
然后我们介绍一下在模型效果评估方面嵌入领域知识的方法,这方面的例子比较充分,主要是基于改进损失函数的方法将控制方程作为约束嵌入到人工智能的模型中。
在模型的训练过程中,一方面可以利用数据驱动模型基于大量的数据进行学习,另外一方面我们还有控制方程、物理规律、工程理论,专家经验等先验信息。如果我们能够将这些先验信息嵌入数据驱动模型中,我们就不仅可以拟合数据,同时也保证模型输出结果遵循物理的准则和工程的理论,这样的模型就有更好的泛化能力。
我们举个例子,比如我们有观测数据、控制方程、边界条件、初始条件,也有工程控制的准则,还有专家经验。这些因素都可以转化为损失函数中的不同正则项,进而约束模型的输出结果。通过这种方式构造的损失函数具有多个正则项,每项之前都有个系数。为什么要需要系数?因为实际上各个项对应的物理意义是不一样的,量纲也往往不一样。这种情况下是不能简单粗暴地把它们加在一起的。所以这些权重非常重要,这也是为什么有的人用这样的框架解决了很多问题,发现很好用,但有的人解决其它问题的时候,发现无效。那是因为这个过程不是一个简单直接的累加,权重的设计和调整非常重要。如果做得好,这种嵌入知识的方法是可以模提高模型的预测能力的,也有很强的泛化能力。
这个系数在学习过程中可能是变化的。比如在数据充足时,在内插问题中可能数据对应的正则项的权重就很大。如果数据量不足,或者数据不准确,或者在外推的情况下,控制方程的作用就非常重要了。但是,方程的作用也不是孤立的。如果给了个方程,实际上如同给了一个轨迹,一个很复杂的轨迹,而且是满天飘的不确定的。我们还必须有边界条件或者初始条件,才能把方程限定在一个正确的轨道上面。如果没有这些边界条件,初始条件,那么这个轨迹便是飘飘忽不定的。
我们举个例子说明知识的重要性。如果我们有个模型要预测深圳这两天的温度,你说今天大概会有多少度?如果你说零下 10℃,在全国来讲,大家可能不会觉得什么样,但这在深圳是从来不会出现的温度。专家告诉你说,深圳的历史气温最低的是零点几度,都甚至没有到零下的温度。这种情况下,如果给模型增加专家经验,就会非常有帮助。
下面我们通过一系列的例子说明这个问题。比如地下水流动的问题,假设我们有最开始一段时间的数据,但是在后面改变了边界条件,即情景发生了很大变化,且没有后面一段时间的观测数据,那么常规的数据驱动模型是无法解决的。但是如果知道边界条件和控制方程,结合最开始时间的数据,就可以进行预测,且实际效果很好,如图中的对比结果。由于流场的条件已经改变了,所以开始一段时间的观测数据的数据分布已经与后一段时间不一致了,但是两段时间的数据都是受到同样的控制方程约束的,因此,如果直接用数据驱动模型预测,就会有较大误差。但是如果加入领域知识,比如控制方程和边界条件,就会有效提升模型的精度。在这个问题中,控制方程和边界条件起了很大的作用。
有这样的一个框架以后能做什么?可以构建替代模型或数字孪生,并利用神经网络推断过程耗时少的优势。因为只要模型训练好了,如果有新的情景出现,或者有新的模型参数进来,就可以直接用这个模型来做预测,不需要重新进行耗时的数值模拟。这对需要大量反复求解的问题来讲,是非常有帮助的。比如不确定性量化,反问题的求解,优化设计等等,都会有很大的帮助。
比如有个新的场景进来,这个方法很快可以做预测,并且具有不错的精度。
这个方法在不确定性量化问题中具有优势。常规的方法,比如蒙特卡罗方法,处理不确定性量化时需要生成多个实现,所以需要很长的时间解不同实现中的方程。但是如果用这种替代模型,因为神经网络的预测速度很快,基本上每个情景直接可以条件反射一般地生成结果,就可以非常高效地实现不确定性量化。
刚才的例子是点对点的求解问题,实际结合卷积神经网络来做图像问题。通过引入控制方程,也可以达到很好的效果。因为时间关系,我就不详细说了。
此外,也可以扩展到油水油气的问题。因为这是个两相流问题,所以约束的条件就会比较复杂。这种情况下,实际上它也是可以起到很好的效果的。
刚才介绍的是软约束,实际上我们也可以用硬约束来嵌入领域知识。
硬约束的劣势是数学上比较复杂,优势是可以保证模型在局部严格满足物理机理。刚才的软约束是保证预测结果在统计意义下满足控制方程或者其他物理机理,硬约束则是保证模型在局部严格满足物理机理,这样实际上它效果是可以更好的。如果大家感兴趣,可以参考我们发表的 Hard constraint projection (HCP) 模型。但是时间关系我就不细说了。
此外,在实际嵌入知识的过程中,是存在大量的难点的。尤其是当嵌入一些复杂方程的时候,比如具有分式结构或者复合函数的方程,难以直接利用神经网络的自动微分机制求梯度,因此也难以直接嵌入到人工智能模型中。此外,如前面介绍的,损失函数中各项之间的权重的确定也不是简单的问题。这方面我们最近开发了一个自动化的知识嵌入框架和工具包,叫做 AutoKE。如果大家感兴趣可以看一下我们在 IEEE Transactions on Artificial Intelligence 上发表的文章。
小结一下,知识嵌入可以让模型的准确性得以提高,有更好的可解释性,更强的鲁棒性。
三、数据驱动的模型挖掘(知识发现)
第三部分是知识驱动的模型挖掘,即知识发现。比如我们如何利用机器学习的方法从数据中直接挖掘模型,即从数据到模型。
我们原来的控制方程都是怎么来的?比如万有引力定律是怎么来的?第谷花了近 40 年的时间来观察火星的轨迹,得到了大量的数据。开普勒又花了十几年的时间,运用这些数据来研究行星运动的轨迹规律,最后得到行星运行的三大定律。实际上他分析的过程中,受到像椭圆形啤酒桶的这种形状的启发,最后发现行星应该是符合一个椭圆的运动规律。在这个基础上,实际上又过了几十年以后,牛顿才进行了理论的延伸和公式的推导,得到万有引力定律。
那么,我们可不可以用人工智能和深度学习的方法,大大的加快这一过程呢?也就是刚才提到在数据中直接挖掘新的知识。
比如我们有这样一些离散的局部数据,利用这些局部数据,可不可以把它的内在规律、控制方程找出来?大家说这大概不可能,但实际上简单的定律,比如欧姆定律,都是从实验数据中得到的。当然这些关系可能比较简单,在实际问题中,潜在的关系可能存在于高维空间里面,会比较复杂一些。
但是深度学习正好有强映射关系的能力。如果能做这件事情,那么机器学习就不再是一个黑箱了。它具有可解释性,特别是找到的控制方程,那是最简洁的知识,是知识最显性的一个表达。
这种情况下怎么做?实际上是比如我们有数据,就可以得到它的梯度和各阶导数。理论上系统中可能存在许多项,但是实际的方程是稀疏的,它只有其中的几项,其他的项的系数都是 0,所以那些项是不存在的。
这样问题就转化成,像这样一个系统中,如何找到稀疏的向量,而且它的系数也能同时找出来。实际上就解决这个问题。说起来很简单,但是利用稀疏回归做这个事情,做起来可能不是那么简单。
我们可以看一下早期的做法。比如,我有个口袋,可以在里面掏各种东西,把掏出来的项做组合。当然了,真正需要的项,这肯定在口袋中。这就是封闭候选集的一种做法。
后来我们做的时候发现,实际上我们不一定知道哪项是真正有用的。这种情况下,我们给一些基本的项,其他的项,我们通过遗传算法的交叉和变异得到新的项,这叫做半开放候选集。虽然我们没有一个完备的候选集,但是我们也能解决这个问题。当然,现在更好的办法是,如果只给我一个自变量,给我一个因变量,我们再定义一些运算符、运算法则。这种情况下,如果我们能够定义像导数,加减,乘除等等这些运算符,那么方程的每一项都是一个树的结构,这样你通过一次次变异去改变树的结构,就可以把方程找出来。即使是比较复杂的方程也能找出来,而且只需要自变量和因变量。
我们举个例子,KdV 方程,一个很复杂的方程。对于封闭候选集,需要先猜测这里面大概会包含哪些项?在这里,我们假设这里面有 17 项,而且方程真正需要的项确实也在这里面,这种情况下是能把问题解出来的。如果像刚才讲的半开放候选集,虽然只给了四个项,真正的项以及其他很多项不在这个候选集里面,这种情况下怎么办?可以通过交叉和变异的算法,产生新的项,这样也能把这个问题解决。
另外一个就是用符号数学的办法,每一项都可以变成一个树的结构。这个树是由节点构成的,父节点是运算符,子节点是系数、变量或者函数。对于树的结构,它的深度和广度,都可以调整,因为它表明树或者说方程的项到底有多复杂。这样,每一个方程实际上都是一片森林,你能够自由地去调整它的稀疏性。即使是很复杂的方程,在没有任何先验信息的情况下,也有可能找到。这种情况下,我们做了很多尝试,发现这个方法连很复杂的嵌套式方程和分数式方程都能找到。一般情况下,可能很难想象 1/x 是你方程的项和系数,实际上这里面还是很有意思的。那么它是怎么找到的呢?
比如刚才讲的例子中,初始有一个自变量、因变量,它第一代迭代后可能找出了这些简单的项,当然这些项是不正确的。然后再交叉、变异、进化,再去评估它合不合理等等,最后找出来的项是很好的。比如系数本来是 0. 25,它找出的系数是 0.2498,系数只是差一点点。另一个系数本来应该是 1 的,它算出来是 0. 9979,这基本上就把这个方程准确无误地找出来了。当然了,这里面还有很多例子,我就不详细展开了。
知识发现也可以用来解决实际的问题。比如这种粘性重力流问题,它的短期行为是没有控制方程的。这种情况下,我们通过精细的微观数字模拟能得到它的一些数据。是不是可以利用这些数据,来学习得到它的宏观控制方程?实际上这是可行的。
当然,我们做的过程中,会考虑一些准则。一方面我们需要已知的那部分数据,数据拟合的精度越高越好。另一方面,我们希望模型越简单越好。同时,拟合数据的吻合程度也要越高越好。
比如在这个情况下,短期的行为控制方程是从未被发现过的,文献里没有报道过,也没有人推导出来过。我们用知识发现的方法得到可能的两个方程,我们发现形式较为复杂的方程(方程②)和数据的误差比稍微要小一点,但是它比上面这个方程(方程①)更复杂,上面这个方程(方程①)更简洁。所以我们刚把刚才的两个因素考虑进去,通过比较物理信息准则值的大小,我们就采用这样一个形式(方程①),发现这个形式它实际上是一个非常好一个折中,它既有很好的精度,又有很好的简洁性,简单美。
小结一下,利用稀疏回归、遗传算法、符号数学,可以从时空的数据中直接挖掘控制方程。深度学习提供了一种计算导数的可行方式,对噪声、稀疏数据具有很好的鲁棒性。对于一个挖掘出的偏微分方程模型,它应该在简约性和精确性之间取得平衡,从而获得较高的可解释性,这样的方程它实际上就找到以后就很好用,也可以给我们获得更好的可解释性。挖掘控制方程的本质就是知识发现。
结语
总结一下,刚才讲知识的嵌入和知识的发现是要形成一个闭环的,是知识科学机器学习的一个核心。
最后,机器学习算法可以有效地解决具有复杂、非线性映射关系的问题。当然了,数据是关键,比如信息化、物联网等等,这非常重要。但是光有数据,只是 “数据大”,并不是 “大数据”。如何做到 “大数据”?刚才讲要建立这种模型,利用行业的知识,利用这种 cutting edge 的算法来好好地利用这些数据,从 “数据大” 到 “大数据”。
另外一方面,要引入行业的知识,这样可以有效地提升机器学习模型的效果。当然在各个环节都可以引入行业的知识,我就不重复了。
另外,大家可能听得比较多,是 AI 加 x, x 就是行业,还是行业加 AI,就是 x 加 AI。在我的心目中,我觉得解决各个行业的问题应该是行业 x 加 AI。因为 AI 是一种是算法,是通用的模型。像我们计算编程的语言,实际上光有这些编程的语言,是不能解决行业问题的,还应该是行业加 AI,这应该是数据驱动和模型驱动的一个有机的结合。
在这里面我再重复一遍,就是知识的嵌入和知识的发现,要形成一个闭环,从而大大提高我们人工智能解决实际问题的能力。
好,谢谢大家。