数学的重要性

无论你通过计算做什么,发邮件或转账,在机器内部都有大量的数学运算在进行。

编程活动虽然可以简单理解为人类意图的翻译,但是并不总是自由度很高的一件事,我们需要去遵守语法的组合逻辑,遵循语言的编码规范,按照已制订好的协议标准,使用成熟的调用接口。这就意味着程序中一行行的字符和字母之间的组合方式,存在着严密的逻辑标准。

数理思维(用数学思想解决问题)所培养出的逻辑能力是写出一行好代码的前提。 不过数学是个极其庞杂的体系,在学校阶段(高中/大学/研博阶段)我们都不同程度的接触和学习过部分领域,工作几年,大部分可能都忘光了,重新捡起来看的欲望和难度都非常难。

在具体工作中,从事不同的 IT 岗位,数学的重要程度也不一样。但是比如你想去做一些网络安全/研发操作系统内核/机器学习/人工智能等更深层的工作,理解一些基本的数学概念是必要的。

当然,我们的目标并不是成为一个数学家,如何从工作的角度针对性、持续性的学习就变的非常关键。


计算机科学本身是一个高度交叉的应用学科,其中联系最紧密的就是数学,亦源自数学。

在从计算机视角解决问题的时候,就需要对问题进行抽象,利用数学建模,建立理论基础,进行演绎推理,在理论层面上证明了可行性之后,然后再进行工程实践。

计算机科学中的数学知识 Overview

Image.png

数理逻辑 Mathematics Logic

逻辑之于计算机相当于微积分之于物理(John McCarthy),计算机科学的源起于现代逻辑学的研究发展,也是逻辑学应用最重要的领域,计算机科学领域的发展亦推动着逻辑学的发展。

逻辑学:探讨怎样在前提的合理性与结论的合理性之间(独立于个人意志)有效地、完备地保持一致性可靠性

🔗 如果你对数学和逻辑学历史感兴趣,可以听听中国科学院大学教授冯琦的讲座:冯琦:从莱布尼兹之梦到数理逻辑

莱布尼兹梦想探讨如何用简洁有效的形式来准确表达人类丰富的思想,从而能够将人类的思辨过程和思维演绎的过程行之有效地转换成对形式符号的计算过程,并且计算的结果恰好就是相应的思辨过程和思维演绎过程的结果的形式表达。

从这里开启历经两百多年的逐梦之路:

  • 布尔将逻辑关系用代数来表示 → 布尔代数(布尔逻辑)、1854 年出版《思维规律》;
  • 1883 年,康托发布《一般集合论基础》,将数学放置在一个崭新的基础 🚩;
  • 1879 年,弗瑞格的划时代著作**《概念文字》**,奠定现代数理逻辑;
  • 1889 年,皮阿罗《算术原理-用一种新方法展现》开启数学基础研究先河,将逻辑符号与算术符号区分开,标志关于自然数一阶算术特性的形式表述和内涵最后分离,不再依赖直觉证明;
  • 1898 年,希尔伯特基于”欧几里得几何元素“课程的讲义,出版**《几何基础》,提出了新的几何公理系统,之后为了建立一个坚实牢固的数学基础(公理化),提出了希尔伯特计划**。
  • 1910 年开始,罗素和怀特海合作发表《数学原理》三卷本:罗素悖论 → 数学基础的危机
  • 1931 年哥德尔不完备性定理,他证明了任何一个假定的、能作为数学基础的公理集都不可避免地是不完备的,图灵的停机问题就是一个例子;
  • 1936 年图灵机模型的提出,邱奇-图灵问题对**可计算性理论(Computability theory)**的贡献 🎉;
  • 1940 年冯诺依曼提出存储计算机架构,1946 年,图灵完全的电子计算机 ENIAC 出现;
  • ...

数理逻辑在计算机软硬件设计和实现、编程语言、人工智能理论产生了巨大的影响。数理逻辑课程中所展现的,对计算过程的形式化定义、描述和证明方法,亦被广泛地应用于计算机领域的学术研究中。

从逻辑形式语言的角度理解程序设计语言

用一组基本的指令来编制一个计算机程序,非常类似于从一组公理来构造一个数学证明。

**形式语言(Formal Language)**是为了特定应用而人为设计的语言,有严格的语法规则,与自然进化的语言(比如汉语、英语或法语)不同。例如数学家用的数字和运算符号、化学家用的分子式等。编程语言也是一种形式语言,是专门设计用来表达计算过程的形式语言。 Image.png

上图中,一阶逻辑中很多基础概念:命题逻辑、谓词逻辑,量词以及结构归纳法证明、自由变元、函数、域λ 演算等,都可以在以后编程语言的学习中找到身影,有几个重要的点提及一下:

  • 命题逻辑(Propositional Logic)的本质是逻辑数学化
  • 谓词逻辑(Predicate Logic)的数学本质是引入变量和函数的思想
  • 集合论(Set Theory)是整个数学的基石,本身也是一个代数化的过程,与命题逻辑有很大的相似性,但是有了集合作为基本语言,就可以定义二元关系,比如:
    • 等价关系:意义在于分类,即是数学的基本思想之一,也是数据挖掘的常见任务;
    • 偏序关系:意义在于排序,这个是计算机算法中最基本的研究对象;
    • 函数:有了函数的定义,分析学可以就此展开,而用函数定义二元运算后,代数的基础也准备就绪;
  • 数学证明在数理逻辑中十分重要,而且在自动定理证明和软件开发(如形式验证)有广泛应用;
  • 时序逻辑(Temporal Logic)是分布式原理的理论基础
  • 关系代数(Relational Algebra)是一阶逻辑的分支,是闭合于运算下的关系的集合,在纯数学中是有关于数理逻辑和集合论的代数结构。关系性数据库、SQL 查询语言是我们基本都会学习的基础知识。

还有个非常有意思的概念,在学习编程的过程中肯定会接触**“间接寻址和指针”的知识,这个技术的产生和原理可以从哥德尔编码方法(一种递归算法)的思想中**找到出处,有兴趣可以自行检索扩展阅读。

离散数学(Discrete Math)

作为计算机学科工具,离散建模是离散数学区别高等数学的根本之处,也是离散数学与计算机紧密关联之处,也是使离散数学成为计算机专业核心课程的原因之一。

-- 徐洁磐,南京大学教授

离散数学的主要研究对象是离散对象,不是连续变化的,而是拥有不等、分立的值。类似下面的图这样,是离散数学的研究对象之一,它们拥有有趣的数学性质,可以作为现实世界用来解决问题的模型,在计算机算法设计中有着举足轻重的作用。

Image

上面讲的数理逻辑也属于离散数学的一部分,我们看看看其他部分的内容的意义和应用:

**图论:**图论是研究网络的数学分支,常被认为包含于组合数学中,但这一分支已经发展得足够庞大和有特点,并有自身领域所研究的问题,因此被视为一个独立的主题,在数学和科学的所有领域都有广泛的应用。例如:有名的七桥问题。

抽象代数:代数结构****既可以是离散的,也可以是连续的。离散代数包括逻辑门和编程中使用的逻辑代数数据库中使用的关系代数代数编码理论中重要的离散有限、环和形式语言理论中的离散半群幺半群

**形式语言理论研究和自动机(Automata Theory):是人工智能领域中自然语言处理(NLP)**的理论基础知识,我们平常比较熟悉的场景:单词拼写检查(有限自动机的解决方案)。

线性代数 Linear algebra

怎么说,矩阵知识无疑是非常重要,是每个工程师都需要掌握的数学知识。

拿两个实际开发过程中例子 🌰 来讲:

  • 假如我们以一个巨大的有向邻接矩阵表示微博用户中任意两个好友之间的关注情况,我们则可以计算一些信息:中心度、相互影响度、相似度,得到这些信息后,我们就可以基本判断用户的基本情况,进行标签和用户画像;
  • 计算机图形学中也可以使用矩阵计算来让 GPU 高效的计算出物体的目标位置。

不过作为大学期间线性代数挂科的学渣,不好给大家推进如何学习,不过想要了解线代的本质和快速温习相关概念,3Blue1Brown(深入浅出、直观明了地分享数学之美) 的中英双语视频是绝佳选择,如果同时能唤起你对其他学科的兴趣,那就更棒了。

之前看一些招聘岗位的能力要求,有一条是这样的, 温习过这个系列的视频后,你应该会胸有成竹。

You should be able to understand linear algebra transformations in 3d space.

在机器学习中的重要性

线性代数、概率论与统计学是机器学习的基础工具,从这个角度出发,学习线性代数的一些建议:

一方面,紧紧围绕空间变换这个线性代数的主要脉络,从坐标与变换、空间与映射、近似与拟合、相似与特征、降维与压缩这五个维度,环环相扣的展开线性代数与机器学习算法紧密结合的最核心内容,深刻理解如何用空间表示数据、用空间处理数据、用空间优化数据,用一条线索拎其整个学科主干内容。

另一方面,结合机器学习中的典型实战案例,面向应用将线性代数这一数学工具用熟用好,同时以Python语言为工具进行数学思想和解决方案的有效实践,无缝对接工程应用。

— 知乎用户

相关课程推荐:

概率论与统计学 Probability & Statistics

概率论与统计学是数学一个极其重要的分支,它研究偶然现象和随机现象的内在规律性,以及如何从数据中提取有意义的信息。这两门学科的应用也正迅速成为我们生活的基础,不仅局限于计算机科学,自然科学领域、经济学领域都在大量采用概览统计方案,理解概率亦有助于做好人生决策。

有些基本概念要了解:概率分布、期望、独立性、条件期望和马尔可夫链,以及极大似然估计、置信区间和假设检验。

  • 想过滤垃圾邮件,不具备概率论中的贝叶斯思维恐怕不行;
  • 想试着进行一段语音识别,则必须要理解随机过程中的隐马尔科夫模型
  • 想通过观察到的样本推断出某类对象的总体特征,估计理论和大数定理的思想必须建立;
  • 在统计推断过程中,要理解广泛采用的近似采样方法,蒙特卡洛方法以及马尔科夫过程的稳态也得好好琢磨;
  • 想从文本中提取出我们想要的名称实体,概率图模型也得好好了解。

同样,3Blue1Brown 的双语视频依旧是不错的开始:

一点学习建议:

从兴趣出发,抽丝剥茧,通过实践应用,逐步积累补充知识体系比强迫自己学一些课程更有效。 关键在于能下日日不断之功,滴水穿石。

如果你对数学没有什么兴趣,读本跟计算机行业比较近的科普书亦是不错的选择:数学之美 - 吴军

想看更多...

这里简单收集整理了一些资料,并不能覆盖全部,但是不用着急,有前辈做了这个工作,如果你想看看学习计算机科学总共需要多少数学基础,翻翻宾夕法尼亚大学计算机和信息科学系教授 Jean Gallier (72 岁)的开源书籍:

  • 《Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Engineering》,有 1900 页。

🔗 下载地址: https://www.cis.upenn.edu/~jean/math-deep.pdf

这本书目的是介绍线性代数和最优化理论的基础知识以及这些知识在机器学习、机器人学、计算机视觉等领域的应用。

Image Jean Gallier


计算机科学中的数学

麻省理工学院计算机科学与工程专业本科生的初等离散数学课程讲义,涵盖了国外计算机科学专业涉及的基础数学知识,内容涉及形式逻辑符号、数学证明、归纳、集合与关系、图论基础、排列与组合、计数原理、离散概率、递归等,特别强调数学定义、证明及其应用方法。


油管上面也有很多自学数学的视频:https://www.youtube.com/watch?v=fb_v5Bc8PSk

以上,祝你可以顺利开启学习数学基础的大门。

参考资料