研究和教学中的数学建模

提出问题,把问题转化成一个数学问题是科学研究中非常非常重要的两步。当然,解决问题和检验,也是重要的,不过,我认为比不上前者。把一个问题用合适的数学结构来表达,需要考虑这个问题内在的结构——也就是这个问题里面有哪些关键因素,这些关键因素之间有什么关系,这个系统的状态如何描述,如果有变化呢,则还关心如何变化、什么导致的变化。而这一步,传统上,叫做数学建模。

采用什么样的数学结构来描述所面对的系统的状态,这是数学建模要解决的第一个问题。理想情况,我们希望这个表示是忠实的:任何这个系统的状态都可以用这个数学结构来描述,任何这个数学结构的状态都在所面对的系统上找得到对应的状态;任何一个对这个状态的操作,正好对应这个数学结构上的一种映射;任何一个这个数学结构上的映射,正好对应着对这个实际系统的一个操作。当然,这样的理想情况一般是做不到的,这个时候,我们只要在我们关心的范围内满足上面的忠实性就可以,甚至只要近似地满足忠实性就可以。

于是,这个时候,我们自然要通过了解系统的状态,以及可能的对这些状态的操作,来寻找合适的数学结构。另一方面,我们也必须考虑,某一个在这个数学结构上能够做的计算,对应着什么样的实际系统的性质或者操作。

实际上,我认为,大多数时候,理论科学家,尤其是理论物理学家、系统科学研究者,都在做这样的数学建模的事情。因此,我也打算什么时候来建设一门数学建模的课程。实际上,这个帖子就是供我自己慢慢整理,形成一个这样的课程用的。当然,也非常欢迎有人给我提供线索。

比如说,量子系统的数学模型——以Hilbert空间矢量为基础的量子力学,就是这样的数学模型的极好的例子。当然,经典力学的质点——刚体——弹性体——流体也是,甚至背后的确定性方程——随机性方程也是。不过,有一些可能需要比较多的数学和物理的基础,不一定适合当做数学建模的例子。

网络科学的例子应该有很多,例如网络上的传染病模型,以及我们自己的汉字学习和检测的工作,广义投入产出分析的工作等。另外,昨天偶然得到一个很好的小例子:一个学生在计算地铁网络在攻击下的抗毁能力,主要通过攻击之后剩下的最大连通集团的大小来当指标;这个时候,一个自然的问题就是,为什么选择这个指标是有实际意义的,在实际问题中意味着什么,如果要让这个指标有实际意义我们需要做什么假设,这个假设是否具有合理性。在实际问题中,这样的思考往往就能够创新性的来源,并且这也是任何数学模型必须解决的问题——为了这个表示具有合理的“忠实性”,我们的假设是什么,数学结构和实际对象之间的联系是什么。

有了这个大原则——数学建模就是找到能够忠实或者近似忠实地表示实际系统的数学结构,我们还有一些更小的典型思维方式。比如说,数学建模更多的是艺术,而不是技术,尽管我们会非常努力地技术化一般化。因此,在教和学数学建模的过程中,就必须采用欣赏、临摹、创作的方式,而不是做大量的习题求解的方式。再比如说,数学建模不应该按照模型解法来分类教学,而是按照建模的思想,建模所需要的思维方式来做教学。更多的其他思维方式以后再整理,或者等遇到合适的例子再总结在这里。

基于这个数学建模的典型思维方式的重要性,在系统科学和物理学导论里面,都应该增加一小节关于数学模型的介绍、讨论和欣赏,除了专门开设数学建模课程之外。其实,这个小节比较简单,只需要用之前讲过的例子,但是从数学模型的角度来再一次欣赏和讨论一下就可以,而且可以放在数学和科学的关系那个大标题下面。

顺便,数学模型应该由科学家来教,而不是数学家。当然,非常厉害的数学家是能够看到数学和实际问题之间的联系的,也是受实际问题启发的。这方面可以看看Gowers的《Mathematics, a very short introduction》,或者丘成桐、陶哲轩对这个问题的讨论。不过大多数数学家就会进入某一个已经数学化形式化的问题里面去做。这也是由数学的特性决定的——严密的逻辑演绎在数学里面的特殊重要性:不想科学还可以实践检验,数学就只能检验内在自洽性,于是自然也就更强调严密。因此,这个不是数学家或者数学的缺陷,而是自然使然。那么,谁来教数学建模?科学家,有具体领域背景的科学家和没有具体领域背景的计算机科学家,一起来完成。

致病和治病同时传播的传染病

根据我们的汉字检测模型——那里实际上是一个字的状态——被认得和不被认得(加上未确定,其实三状态)——两个相互冲突的状态在网络上传递或者说推断,我们提出来一个三状态——待感染、染病和染药三个状态的传染病模型。待传染的个体可以通过接触染病个体变成染病个体,也可以通过接触染药个体变成染药个体。同时,染病个体也可以通过接触染药个体变成染药个体,甚至三个状态的任意一个;染药个体也可以通过接触染病个体变成染病个体,甚至三个状态的任意一个。

任何一个时候每一个个体\(j\)的检测状态记为(\(k_{j}=\left\{1, 0, -1\right\}\))分别代表染病、待感染和染药。我们有一个接触网络\(A\),代表这些个体之间可能的接触。染病和染药两种传播可以在一个网络上,也可以在同样顶点的两种网络上,传播矩阵(意义稍后定义)分别记为\(\Omega^{\left(\pm\right)} = \left(\omega^{\left(\pm\right),i}_{j}\right)\)。再简单情况下,可以直接取\(\Omega^{\left(\pm\right)}=A\)。在\(t\)时刻,任意一个个体的状态描述是\(p\left(k_{j}, t\right)\)。

这个模型和同一网络,或者双关系网络——同样的一组顶点通过两种关系形成两个网络,上的两种传染病独立传播模型最大的区别是:这里的两种传染病是可以相互抵消的。下面我们来考虑抵消的动力学。

两种传染病抵消机制的简化描述

我们也可以定义一套新的状态变量\(\eta^{\left(1\right)}_{j}, \eta^{\left(-1\right)}_{j}\),并且上面的几率分别表达成
\begin{align}
q^{\left(1\right)}=p\left(1_{j},t\right) = \frac{\eta^{\left(1\right)}_{j} \left(t\right) – \eta^{\left(-1\right)}_{j} \left(t\right)}{\eta^{\left(1\right)}_{j} \left(t\right) + \eta^{\left(-1\right)}_{j} \left(t\right)}\theta\left(\eta^{\left(1\right)}_{j} \left(t\right) – \eta^{\left(-1\right)}_{j} \left(t\right)\right) \notag \\
q^{\left(-1\right)}=p\left(-1_{j},t\right) = \frac{\eta^{\left(-1\right)}_{j} \left(t\right) – \eta^{\left(1\right)}_{j} \left(t\right)}{\eta^{\left(1\right)}_{j} \left(t\right) + \eta^{\left(-1\right)}_{j} \left(t\right)}\theta\left(\eta^{\left(-1\right)}_{j} \left(t\right) – \eta^{\left(1\right)}_{j} \left(t\right)\right) \notag \\
p\left(0_{j},t\right) = 1-\frac{\left|\eta^{\left(1\right)}_{j} \left(t\right) – \eta^{\left(-1\right)}_{j} \left(t\right)\right|}{\eta^{\left(1\right)}_{j} \left(t\right) + \eta^{\left(-1\right)}_{j} \left(t\right)} = 1- q^{\left(1\right)} -q^{\left(-1\right)}
\end{align}
注意,采用\(\eta^{\left(1\right)}_{j}, \eta^{\left(-1\right)}_{j}\)这组变量以后,问题极大简化了,这是一个假设。

现在,我们已经清楚了系统状态的描述\(P\)(每一个个体都有一个状态分布函数,整体状态构成一个分布函数大矢量。这个矢量的具体写法可以采用直积或者直和,再说,现在用不着)和初始条件\(P\left(0\right)\),我们来构造一个动力学过程\(P\left(t-1\right)\rightarrow P\left(t\right)\)。将来,我们要讨论这样的问题:末状态如何依赖于初始条件和模型参数。

我们先讨论动力学过程。每一步(记为\(t\)时刻),我们选择一个个体\(i\)来看其状态变化。

考察这个个体的一级近邻。对于每一个一级近邻\(j\)按照如下方式来影响\(i\)的状态:

  1. 如果\(k_{j}=0\),则没有影响
  2. 如果\(k_{j}=1\)(这个时候可以约定\(\eta^{\left(1\right)}_{j}=1,\eta^{\left(-1\right)}_{j}=0\)),则采用乘性传播
  3. \begin{align}
    \eta^{\left(1\right)}_{i}\left(t\right) = \eta^{\left(1\right)}_{i}\left(t-1\right) + \omega^{\left(1\right),j}_{i}\eta^{\left(1\right)}_{j}\left(t-1\right)
    \end{align}
    或者加性传播
    \begin{align}
    \eta^{\left(1\right)}_{i}\left(t\right) = \eta^{\left(1\right)}_{i}\left(t-1\right) + \omega^{\left(1\right),j}_{i}
    \end{align}

  4. 如果\(k_{j}=-1\)(这个时候可以约定\(\eta^{\left(1\right)}_{j}=0,\eta^{\left(-1\right)}_{j}=1\)),则采用乘性传播
  5. \begin{align}
    \eta^{\left(-1\right)}_{i}\left(t\right) = \eta^{\left(-1\right)}_{i}\left(t-1\right) + \omega^{\left(-1\right),j}_{i}\eta^{\left(-1\right)}_{j}\left(t-1\right)
    \end{align}
    或者加性传播
    \begin{align}
    \eta^{\left(1\right)}_{i}\left(t\right) = \eta^{\left(1\right)}_{i}\left(t-1\right) + \omega^{\left(-1\right),j}_{i}
    \end{align}

把以上的过程合起来,也就是
\begin{align}
\eta^{\left(k_{j}\right)}_{i}\left(t\right) = \eta^{\left(k_{j}\right)}_{i}\left(t-1\right) + \omega^{\left(k_{j}\right),j}_{i}\eta^{\left(k_{j}\right)}_{j}\left(t-1\right)\left(k^{j}\right)^{2}
\end{align}
或者
\begin{align}
\eta^{\left(k_{j}\right)}_{i}\left(t\right) = \eta^{\left(k_{j}\right)}_{i}\left(t-1\right) + \omega^{\left(k_{j}\right),j}_{i}\left(k^{j}\right)^{2}
\end{align}

必要的时候可以回来计算概率\(p\left(k_{j},t\right)\) 。这样这两种传染状态就能够相互抵消了。

更一般的两种传染病抵消机制的描述

例如,当一个健康顶点周围的染病或者染药顶点多余某个值,就会变成相应的状态。类似的,染病(染药)顶点周围的染病或者染药顶点多余某个值,就会变成相应的状态。

概念网络上的高效学习方式

对于一个的集合\(L=\left\{1,2,\cdots, i, \cdots, \right\}\)中每个个体的学习,如果给定了每一个学习对象的难度\(\vec{C}=\left\{c_{i}\right\}\)和价值\(\vec{V}=\left\{v_{i}\right\}\),我们的学习顺序\(\vec{S}=\left[s_{1}, s_{2}, \cdots, \right]^{T}\)的问题是这样定义的:

  1. 给定\(\vec{S}\)之后在第\(m\)步的累计成本为
  2. \begin{align}
    C\left(\vec{S}, m\right) = \sum_{j=1}^{m} C_{s_{j}}
    \end{align}

  3. 给定\(\vec{S}\)之后在第\(m\)步的累计价值为
  4. \begin{align}
    V\left(\vec{S}, m\right) = \sum_{j=1}^{m} V_{s_{j}}
    \end{align}

我们希望某种意义上——例如在学习过程中的任何一步或者都某个具体的第M步——成本最小,价值最大。

如果这些个体之间相互没有联系,则我们没有特别好的巧妙的办法,就是一个简单的优化问题。例如,我们可以先考虑两种极限:成本完全一样或者价值完全一样的情况。例如,前者,这个时候对于任何的\(\vec{S}\),\(C\left(\vec{S}, m\right)\propto m\),我们只能考虑优化\(V\left(\vec{S}, m\right)\)。于是我们发现,按照价值的递减顺序,也就是选择价值大的来先学就好。这时候能够保证在任何一步\(V\left(\vec{S}, m\right)\)都是最大的。更一般的成本函数和价值函数,应该,运筹学之类的学科也有答案了。如果没有,也无所谓,交给运筹学去解决好了。

更重要的问题是,一旦个体之间有联系,会如何?也就是说,一旦一个字\(j\)的学习难度会随着相联系的字\(i\)的学习状态(是否已经被学习到)而改变,这个时候,如何解决上面的优化问题。

那,我们先来看学习成本会如何变化。本质上,这个变化机制当然应该来源于实际学习过程。这里,我们先给出一个描述框架和大概描述。

我们认为,概念之间的逻辑关系,可以做为关联的客观表现。以汉字为例,汉字之间通过结构关系相互联系,这一点是客观的(尽管繁体字和简体字在汉字之间是如何从结构上联系起来的这一点上不一样。先考虑例如仅仅简体字)。例如:木——林——森,人——从——众,水——冰——淼,(木,一)——本,(人,本)——体。当然,这个客观的结构联系是否就能代表逻辑联系,是有待讨论的。也就是说,在汉字集合上,存在着一个逻辑关系网络,网络的每一条边代表上面举例中的一个字\(i\)(更简单的字,处在更底层)成为另一个字\(j\)(更复杂的字,处在更上层)的一部分这样的结构关系\(A=\left(a^{i}_{j}\right)_{N\times N}\)(这个矩阵的标记采用的是投入产出习惯的符号,从\(i\)投入到\(j\)。)。这个结构关系上面叠加了一层逻辑关系。这个逻辑关系可以用来改变学习成本。再次强调,这仅仅是一个理想模型。记每一个概念的当前状态——学到或者没有学到——为\(\vec{K}\left(t\right)\)或者每一个概念\(i\)的状态\(k_{i}\left(t\right)=\pm 1\)。例如,我们可以定义每一个字在当前时刻的学习成本为一个由网络结构和网络上各个顶点的当前时刻的状态决定的函数\(c_{i}=c_{i}\left(A,\vec{K}\left(t\right)\right)\),而\(\vec{K}\left(t\right)\)实际上是学习顺序\(\vec{S}\)的函数。于是,学习成本\(C\)和学习成果\(V\)都是学习顺序\(\vec{S}\)的函数。当然,这个函数由于有网络关系,比完全没有联系的情况要复杂。但是,给定网络\(A\),那么\(C\left(\vec{S}, m; A\right)\)和\(V\left(\vec{S}, m; A\right)\)就是完全确定的函数,就可以讨论优化问题。下面给出一种我们使用过的成本决定机制。

      
  1. 认识下层字\(j\),以一定的概率降低上层字\(i\)的学习成本,\(\omega^{j, \left(\uparrow\right)}_{i} \),和结构矩阵的元素\(a^{j}_{i}\)有关。原则上可以不遵循结构矩阵,来自于其他实证关系。做为一个简化模型,我们可以假设\(\omega^{j, \left(\uparrow\right)}_{i} = 0 \mbox{或者} a^{j}_{i}\)。更复杂的需要考虑理据性。
  2. 认识上层字\(j\),以一定的概率降低下层字\(i\)的学习成本\(\omega^{j, \left(\downarrow\right)}_{i} \),和结构矩阵的元素\(a^{i}_{j}\)有关。原则上可以不遵循结构矩阵,来自于其他实证关系。做为一个简化模型,我们可以假设\(\omega^{j, \left(\downarrow\right)}_{i} = 0\)。更复杂的需要考虑理据性。
  3. 有了这个改变学习成本的概率,我们再来看学习成本改变的值。采用递归定义:
  4. \begin{align}
    c_{i}\left(t\right) = \left(1-k_{i}\right) \cdot \left[\Pi_{u}\left(1-k_{u}\omega^{u,\left(\downarrow\right)}_{i}\right)a^{i}_{u}\right]\cdot \left\{1+\sum_{d}\left(1-k_{d}\omega^{d\left(\uparrow\right)}_{i}\right) \cdot \left[1+\left(1-k_{d}\right)c_{d}\left(t\right)\right]a^{d}_{i}\right\}.
    \end{align}

第一项的含义是,如果字\(i\)本身是学习过的,也就是\(k_{i}=1\),则\(c_{i}\left(t\right)=0\)。第二项的含义是,每一个字\(i\)上层字\(u\)如果学习过,则会成比例地降低字\(i\)的学习成本。第三项表示字\(i\)的学习成本包含三项——整体组合成本(按照单位一算),有几个子结构,每一个子结构如果不认得的话成本的累计。同时,如果下层的字学习过,则整体上会按照降低成本的几率再次降低子结构的成本(那时候子结构自己已经认得了,没有学习成本了)。由于采用了递归定义,整个网络不能有循环。其次,递归的每次都是从当前需要算成本的开始,然后往下计算——递归表达式中仅仅出现了往下的顶点的学习成本。

我们在Efficient learning strategy of Chinese characters based on network approach中的成本更新机制实际上就是上面的一般表达是的简化模型:
\begin{align}
c_{i}\left(t\right) = \left(1-k_{i}\right) \cdot \left\{1+\sum_{d}\left[1+\left(1-k_{d}\right)c_{d}\left(t\right)\right]a^{d}_{i}\right\}.
\end{align}
就算在这个简化机制下,我们也没有精确求解开这个优化问题。而是,基于对问题的理解,提出了一种近似算法:顶点权分配算法——后来我们发现实际上是一种广义投入产出分析计算。

现在,我们有了一个结构网络\(A\),两个这个网络上的逻辑关系\(\Omega^{\left(\downarrow\right)}, \Omega^{\left(\uparrow\right)}\),有一个学习顺序\(\vec{S}\),一个依赖于学习顺序的成本更新机制\(M\left(\vec{S}\right)\left|\right._{\vec{C}\left(t-1\right)\rightarrow \vec{C}\left(t\right)}\),以及初始条件\(\vec{C}\left(0\right)\)。还有一个价值变量\(\vec{V}\left(t\right)\),或者更复杂一点一个可能依赖于学习顺序的价值更新机制——这里当做价值不更新。

问:什么样的学习顺序\(\vec{S}\),会使得整个学习过程、在这个过程中的某个时间点m、或者在某个时间点m之前的过程中的学习效率最高——例如用平均每个字的学习成本来衡量。也可以为了学习到给定学习对象集合\(T=\left\{t_{1}, t_{2}, \cdots\right\}\)里面的所有的字的整体成本。

概念地图和大图景对于科学研究的作用

刚才和人聊天,讨论到如何来看自己和他人的研究工作,如何才能更有方向感。正好就体现了概念地图和大图景的作用。总结下来,跟大家分享。

大约在初入门研究工作的阶段,可能不太需要关心研究问题的选择——基本上是你的导师给你选的。随着研究工作的开展,了解的更深更广,有的人,后来就形成了自己的品味和自己的领域,学会了自己来做选择。有的人就一直在差不多同样的境界上:看某篇其他人的工作,觉得哪里做得好哪里做得不好,把不好的改过来,把好的迁移学习用到其他另一篇某个地方不好的工作上去。当然,这也是科学研究工作,没问题的。不过,不是为了学科做的研究,也不一定是按照自己的品味和兴趣做的研究。我记得那些年我们管这样的叫做修补匠、修地球。

那么,除了依靠研究者的悟性和积累,有没有什么办法能够做到研究自己的工作更有方向感,以及,对其他人的工作做出来更加合理的学术评价呢?

有,依靠概念地图和学科大图景。

我们说过,学科大图景​就是一个学科的典型对象、典型问题、典型思维方式、典型分析方法、和世界以及其他学科的关系。其中,最后那个是学科的典型责任或者典型目的。我们还说过,学科大图景最适合用概念地图来显式地呈现或者在研究者自己脑子里面非显式地表示,主要依赖于主题概念和概念之间联系构成的学科骨架地图。我也把这样的骨架地图的集合称为知识高速公路。

研究者首先要在脑子里面形成这样的学科骨架地图,甚至知识高速公路。一旦有了这样的骨架地图,我们就可以把具体的研究工作放到这个骨架上面来:看一下可能这个工作的研究问题在这个骨架的什么位置——是否靠近学科基本责任还是某个主要分析方法甚至是新的思维方式,还是说给这个骨架地图增加了新的概念或者显得连边。也就是说,我们需要依靠这个骨架地图来给研究工作定位。有了这样的定位,不仅仅对当前的工作能够形成更清楚和明确的把握,还能够提醒将来的研究的方向。

因此,在我这里就算硕士学生,我也会提供一个很长的研究问题和方向的列表,然后让学生来绘制自己感兴趣的学科和问题的概念地图,最后按照这个概念地图来选择研究问题。希望通过这个过程学会做领域综述,学会做骨架地图,并且学会用骨架地图来给研究工作定位。

因此,不管研究还是教学,实际上,关键都在用好这张反映学科大图景的概念地图。

从知识(招式)到学科大图景(内功)到学习方法(心法)

昨天,我问了正在学习质数合数奇数偶数和整除的心儿三个问题:

  1. 为什么要学质数和合数的概念?
  2. 能够被3整除的数为什么每一位数加起来还是能够被3整除以及为什么要学这样一个知识?
  3. 偶数里面哪些是质数?

第三个问题实际上就是锻炼的思维的复杂程度,以及熟悉一下定义。了解到偶数肯定能够被2整除,因此,除了2自己(0先不管,只考虑自然数先),其他的数都有一个因子是2,于是都是合数。这个问题主要是为了促进对知识的学习,稍微有锻炼思维的目的。

第二个问题是为了展示对于学习的内容要做深入的自己的思考,而不是被动地学习。当我提示把一个多位数例如三位数写成abc=100*a+10*b+c的时候,心儿就拿过去自己算了算,遇到一些困难,但是多想想也就会了。其实,这里还可以讨论充分和必要条件的问题,也就是搞清楚这个条件正好和原来的条件等价。这样除了在学习方法上提示要主动深入多问几个具体知识上的为什么之外,还能够学点数学的思维方式——在数学里面不多不少的刚刚好的条件非常的重要。其中,后半个问题,还能够牵涉到对这个定理的作用的理解:实际上这是把一个更复杂的计算变成一个稍微简单一点的计算。

第一个问题实际上是很难和现阶段的心儿讲明白的——质数实际上代表了乘法里面的独立因子,因此,将来求解方程(或者很多其他任务)的时候就要做因子分解,然后把整体等于零,变成每个因子等于零。因此这个质数的概念首先是知识上必要的东西,还能够体现数学重要思维方式之一“分治,分而治之”(divide and conquer)。如果去设计一下好例子,还是可以让学生体会到质数在知识和学科思想上的价值的——但是,重要的是通过这个问题提示心儿,学习的时候是要问“为什么学习这个”的问题的。当然,答案不是说是不是买菜的时候用得到,而是在整个学科甚至整个人类文明的角度来说,这个知识具有什么样的地位。

这就是我说的,学习很少的具体知识也能够学到学科大图景的意思。只要你从学科大图景(典型对象、典型问题、典型思维方式、典型分析方法、和世界以及其他学科的关系)的角度重新来审视一遍这个知识,问一下为什么要教这个知识的问题。也就是做好从知识到学科再到学习方法的思考和提炼。

顺便,有老师问我,能不能举例子讲讲如何实现“不教知识能够教会学习方法、思维方式和学科大图景吗?”。所有的帖子,基本上,我都是有具体例子的。我不是做教育的,我没有教育的专有名词或者一定要宣扬的理念。我是做科学的。对于我们,没有例子,是没法思考和说话的。因此,这个公众号里面有大量的文章都是讲如何从具体知识具体例子的角度,通过多做思考,来实现“教的更少,学得更多”的。

这样的一个审视,就好像是金庸的武侠小说里面的,从招式到内功到心法。很多时候,练武是要从招式开始的。但是,如果仅仅学到了招式,没有心法,没有内功,则没有太大用处。在这里,具体知识就是招式,学科大图景就是老师和学生需要修炼的内功,学习和教学的思想——依靠系联性思考和批判性思维以学科大图景和学习方法学科情感为目标来多思考以及如何思考“教什么,学什么,为什么”——就是心法。

老师们只要修炼好自己学科的内功,对这个心法有深刻的体会,做一个有心人时时刻刻对所教的知识做这样的审视,肯定能够做到“教的更少,学得更多”。老师们不仅仅要自己问知识层面的为什么,在学科和学习方法的层面上为什么要学习这个,还要帮学生学会来问这些问题。