万能格式转换器pandoc用于书稿格式转换

一直打算把我的latex格式的书稿变成markdown格式和mediawiki格式,或者html格式。原来latex2html可用,不过遇到中文,会出很多问题。现在终于找到了pandoc万能格式转换器。太牛了,基本上转换了以后是可读的,需要额外修改的工作量不是很大。

按照pandoc的介绍,它能够把Markdown, reStructuredText, textile, HTML, DocBook, LaTeX, MediaWiki markup, TWiki markup, TikiWiki markup, Creole 1.0, Vimwiki markup, OPML, Emacs Org-Mode, Emacs Muse, txt2tags, Microsoft Word docx, LibreOffice ODT, EPUB 和 Haddock markup 转化成HTML, Word,Ebooks,TeX家族,PDF。实在太强大了。

理想中的教和学的体系

学科边界是存在的——研究对象和问题、思维方式、分析方法有共性自然就成了更加紧密联系在一起的知识和研究者了,于是就成了学科。同时,跨越和融合边界的问题、思维方式和分析方法也是存在的——有的时候某些问题就是放到不受具体学科限制的框架里面来解决更合适。在这样一个背景下,如何培养学生,用什么样的体系?

我认为,这个可以依靠一个仅仅受知识之间的联系——也就是各个学科的合起来的概念地图——制约的教和学的体系,来解决。

首先,这样的整体知识概念地图——我称之为知识高速公路——要建立起来。当然,建立的方式,可以先从目前的学科分科课程分科体系下的课程和学科开始。但是,将来是要突破这个分科的体系的。也可以直接从构造整个学科甚至整个人类知识的知识骨架开始。

接着,有了这个知识高速公路,可以通过算法和人合作的方式,重新来构造一些课程分类——实际上就是这个知识高速公路上的聚类分析。做了聚类分析之后,我们得到了粗粒化的课程主干道(连边通常是有向的):每一门课程是如何和其他课程联系起来的,内部存在哪些逻辑上的依赖关系,以及内容上的重叠关系等等。当然,实际上,也可以不做这个聚类过程,直接走到下一步。

然后,对于每一门课程,或者直接就是每一个概念,构建教和学的资源,例如书籍、论文、视频课程、讲得好的老师等等。到这里为止,呈现在老师和学生面前的就是一个概念层面的加了资源的知识高速公路,或者是在课程层面的加了资源的课程主干道。

再次,对于学习者,除了有些主干道上的道路所代表的有向联系,不能再有其他学习上的约束。学习者想学习什么,只要逻辑关系上是大概相符的,就可以选来学(部分学生可以跳着学的,就可以让老师个案判断是否允许这么学)。于是,在学习的层面来说,没有专业的边界的限制。同时,在具体课程上,尽量开设同一个主题的多层次课程——豆腐可以凉拌、红烧、麻辣甚至做成臭豆腐——供学习者自己选择。

那么,这个时候,怎么授学位呢?尽管学习过程是不受限制的,除了知识和课程之间的逻辑关系,但是,某专业的证书是可以提出来要求的。例如,物理学专业可以要求,力学、理论力学、统计力学和量子力学是必学课程。具体什么课程当然是要讨论的和选择的,我仅仅举个例子。这四门课分别是什么呢?力学是物理学导论课,知识部分很少有新的,主要是讲物理学家思考什么问题、如何思考、如何计算。后面三个,或者还可以加上相对论,是物理学后续学习的知识和方法的基础。例如学习到最小作用量原理以及用这个原理来统一物理学这个思路和梦想。也就是说,任何一个学科,要有这个学科的导论课——初步交代这个学科的大图景的,然后要有尽量少的核心课程。这些可以作为这个专业毕业授予学位的要求。

顺便,在这样的提一个体系下面,除了临近毕业的时候,学生是完全没有专业和所属的学科和学院的。学什么决定权在学生手上。当然,学科的老师可以去影响和宣传,方式就是通过开设自己的最好的学科导论课和学科核心课。

顺便,说到这个学科导论课,可能有人会觉得和通识课差不多。是的,这就是通识课的意思,但是,不是很多人开设的通识课:通识教育不是肤浅教育,导论课或者通识课一定要用足够简单的例子足够好地体现好学科大图景,在对学科的理解上不能有丝毫的放松,放松的仅仅是更细节的知识。从这一点上来说,通识课的开设比专业核心课,难得多。没有深入永远也不可能浅出,不站在山顶,永远也不可能一览众山,看到概貌。

最后,在教和学的细节方法的层面,要强调系联性思考、批判性思维,要做理解性学习,要培养学生对学科的情感和责任感,要让学生学会学习和思考,要喜欢去做问题解决和提出问题。

我不知道什么时候,这个我理想中的体系能够实现。希望能够找到一群志同道合的以来来实现。

在这样的体系下面,更多的学生有可能可以找到自己,更多的学生可以成为自己,而且鼓励成为自己。每一个毕业生的知识和能力背景,完全就是自己在知识高速公路上用自己的汗水染出来的一张自己的图。我都不能预期培养出来的会是什么样的人,但是,至少是具有创造性的,理解深刻又不太受限制的人。

研究和教学中的数学建模

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

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

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

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

比如说,量子系统的数学模型——以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\}\)里面的所有的字的整体成本。