这个项目中遇到了很多困惑。现在看来,把每个困惑研究透了,都能带来对技术认识的本质性进步。
上一篇谈到,要把模型做得实用,需要它足够可靠。这个话题需要深入展开,作为文章的第二部分。
“可靠”对于工业系统的重要性非常大。在工业界,对可靠性要求越高的技术,科技含量往往也越高;反之,科技含量越高,往往对可靠性的要求也就越高。对可靠性要求高,意味着一旦不可靠,会引发很大的损失;可靠性高,意味着要对各种可能发生的意外尽量杜绝、弱化、预警。对于可靠性要求高的问题,人考虑的细节就会爆炸性增长、细节之间的关系就要梳理清楚、处理好,工作量就会极大地放大,进而难度也就非常大。可靠性的难,就难在不许出错。从某种意义上说,可靠性要求高与价值大,常常是核心技术的一体两面。
“性能预报模型”能发挥多大的价值,也决定于可靠性。比如,如果我们说:“用模型避免一次大生产试验的失败,可以减少100万的损失”, 那么反面的问题就是:“如果模型预报错误、导致一次大生产试验的失败,就可以增加100万的损失”。
模型可靠性的内涵到底是什么?这个问题我思考了很长时间:想清楚了,才能进入操作层面啊!
模型的可靠性显然与精度和适用范围(类似与函数的定义域)有关。其中,精度、适用范围都可以用数学的语言加以描述的,所以能表达清楚。那可靠又意味着什么呢?我思前想后,提出的观点是:可靠就是模型适用范围和精度的可知。也就是我知道模型的误差有多大、知道模型在什么范围内有效等等。如果能够知道这些信息,用模型的时候就可以放心了:有效的时候用,失效的时候不用就是了!
要取得模型的可靠性,就要知道模型什么时候失效。于是,下面的问题就是:怎么才能知道模型什么时候失效呢?下面从我们做事的过程谈起。
我们做性能预报,开始用的是大家普遍采用的套路:选择一个简单的钢种开始研究、然后希望拓展到各种钢种。这时的问题就来了:选择什么方法呢?对于这个问题,有三种常见的方法:统计回归方法、人工神经元方法、机理模型方法。很多人在潜意识中就认为:问题解决不了、模型见不好,就是(算法层面的)方法不好;简单的方法解决不了问题,就一定要用复杂的问题来解决——我一直认为,这个看似有道理的观点,其实非常荒唐。要真正解决问题,关键是深刻地认识问题本身。
“复杂问题简单化”是我一贯的主张。我做这件事,肯定也是从最简单的方法开始的:做线性回归——现实中,最简单的方法往往最可靠,也最容易进行失效分析。
我从同事那里了解到的,线性回归和复杂的神经元算法精度上差别并不大。更重要的是:我知道神经元方法太容易“过拟合”,可靠性绝不是强项、而是弱项。事实上,后来12年的深入研究也确认:在一个钢种(尤其是简单的钢种)范围内,线性模型的确可以很好地逼近实际对象。前些天在策划某工业大数据的文件时,我就指出:强调可靠性、减少不确定性,是工业大数据分析不同于商务大数据分析的本质差别之一。
线性模型就那么可靠吗?多种迹象表明,成分对力学性能的作用是近似线性的。但我发现:同样一个钢种,在不同的时间段得到的回归系数却相差很大。这很难用物理实际来解释:这个月增加1个 强度增加2MPa,下个月却增加了4个MPa。模型应该描述的是客观物理规律,物理规律怎么会随时发生这么大的变化呢?
还有种现象让我久思不得其解:把不同钢种的分析数据对起来,就会产生更大的矛盾。这个矛盾可以用下图来描述:
找到几个钢种,仅有的差别是某合金含量;也就是说,随着合金含量的增加,一个钢种就会变成另外一个钢种。这样,把不同钢种的样本拿来做回归,就是一条直线。然而,奇怪的是:在单个钢种中,合金对性能的敏感度普遍较低;按照这个规律去预报其他钢种,性能要低。也就是说:从不同的尺度看问题,得到的结论是不一样的。钢种变化时,成分性能的变化如下图所示:
“钢种”是人类起的一个名字,换了钢种难道规律就会发生突变?这与我们对物理世界的认识不相符合的。我一直说“预料之外的现象,是推动认识深入的引擎”。这个问题,就让我的认识深入了很多。
我当时就想:如果连这种变化的原因都搞不清楚,怎么可能得到可靠的结果呢?作为数学系的毕业生,我当然可以找到一些解释的原因。一个典型的理由是:相关因素未纳入模型。
我也的确能够找到这样的一些实际现象:同一个钢种里面,有很多种合金;合金成分之间具有一定的相关性。比如,用高C锰铁做原料,Mn加多了C往往就会偏多。但经过更加精细化的研究,我感觉这些解释无法解释系数如此大的差别(差别大约有一半)。所以,导致这种差别的,一定还有其他原因。
这件事让我郁闷了很长时间。但我意识到,这种现象是有特点的:在单个钢种中分析得到的敏感度,总是被低估。这种特点背后的规律是什么呢?我想一定是可以用数学描述的规律。
当时我有个猜想:数据误差可能导致这种现象。于是,我又把统计的教科书找来,仔细分析。大家知道,关于最小二乘法,有一个重要的结论是:最小二乘法是无偏估计——大体意思就是:只要样本足够多,模型就可以逼近正确的结果。这意味着我的猜想不成立,让我非常失望。
但我总觉得哪里不对劲。有一天单位开大会,领导在会上讲大道理。我听得不耐烦,就偷偷在底下推导公式。突然一个灵感:最小二乘法允许因变量有随机干扰,但没有允许自变量有误差啊!再一推导发现,我的猜想是成立的:如果自变量有显著的误差,模型的系数一定会被低估!
这个结论让我大为振奋。回去马上着手验证这件事。我让同事准备了一类成分数据。过去,我们总是假设一炉钢的成分是一样的。但事实上,一炉钢要取几次样,分别叫做本试和副试。本试和副试是有一定差别的。我们总以为,同一炉钢水中两次测试的差别,应该显著小于(同一钢种)不同炉次的成分差别。但当我把数据拿来分析,大吃一惊:两者的差别竟然如此接近!换句话说:检测结果太不靠谱。
为了更加科学地验证我的观点。我请同事取来几个样子,进行精确的测试。每个样子测量几次;刮掉一层再测另外一层。结果,同一个试样中测量的差别,也超出了最初的设想。
带入我推导的公式,完全是吻合的!
这个结果还会引起一系列令人震惊的问题:用误差最小化得到的模型,可能是错误的! 用通俗的语言来讲就是“错错得对”啊 。 这种现象可以这样理解:如果模型是正确的,模型的输入是有误差的,则得到的结果也就是有误差的。一种极端的情况是:输入变量信息全部是噪声,最好的模型就是预报平均值、预报结果与输入无关。在更加一般的情况下,误差最小的模型适合于自变量及其测量误差的分布不变的情况下——一旦突破这个范围,误差就不是最小的,而是会骤然扩大。换句话说:误差最小的模型不是真实的模型,只是在特定的范围和环境下误差最小——因此可靠都不高。
这个结论还会引发“地震”:我们知道,几乎所有的数据分析方法(包括人工神经元等)都是追求误差最小化的。这些方法也会受到同样的影响:似乎都没法用了。要进行数据建模,除了追求误差最小化,还能追求什么呢?
做技术创新,办法总比困难多。
其实,在了解误差分布的前提下,我们可以进行误差校正:从单个钢种得到的结果,经过放大之后,才是真正的物理规律:就是通过分析不同钢种得到的结果。跨钢种分析的结果为什么是准确的呢?因为检测误差的相对比例小了啊!喜欢讨论这个问题的朋友,可以自己推导。
得到这个结果后,我还是不放心:这么重要的“理论发现”过去怎么就没有呢?
我的师傅王洪水先生写了一个Email给一位统计学大师。得到的回答是:这个结论确实成立,只是一直没有被人重视、很少有教科书提到。对于工程师能在实际中发现这个规律,他感到很震惊。
我还有一个疑问:宝钢是中国乃至世界最先进的钢铁企业之一,数据误差为什么还会这么大呢?这个问题,后来我也得到了答案:数据精度低不是宝钢的问题,而是一切工业企业都会存在的问题,背后有必然性存在。
这种必然性何在呢?这就是工业生产往往在某个“工作点”附近波动。比如,钢种定下来了,成分、温度、压力等都会在某个目标值附近波动。人们总是希望控制水平高、总希望更加接近这个目标值。
但在现实中,控制水平总是有限的——高精度是受到各种约束的:当检测精度接近控制精度时,控制精度就没办法显著提高了。而现实中,优秀企业总是提出尽量高的控制标准、这个标准一定是接近控制能力极限的。所以,在一个工作点附近,控制精度和测量精度往往是在同一个级别上。这个时候,自变量的信噪比就会很低,最小二乘法的软肋也就暴露出来了。
吃饭的时间到了,今天先写到这里吧。现在只是起了一个头,欢迎大家继续关注并给予鼓励。