【笔记】迈向人工智能 | 麻省理工学院公开课:人工智能(已完结)

课程首页:MIT OpenCourseWare-Artificial Intelligence

网易公开课:《麻省理工学院公开课:人工智能》

授课教授:Professor Patrick Winston

参考书目:Winston, Patrick Henry. Artificial Intelligence. 3rd ed. Addison-Wesley, 1992. ISBN: 9780201533774.

 

------Lec 1. 什么是人工智能------2018.08.07------

这一讲首先介绍了人工智能的定义[0:00:00]。

之后,教授讲解了生成测试法,并详细谈到了给事物命名的重要性:“给某种事物命名后,你就对它拥有了力量”[0:11:30]。

再后,教授介绍了人工智能发展的简史,讲到了本课程中将会接触到的各种人工智能程序[0:20:28]。

最后,教授展望了人工智能的未来并讲了一些课程事务信息[0:32:40]

 

首先,什么是人工智能?!Professor Winston给出了定义:Algorithms enabled by constraints exposed by representations that support models targeted at thinking, perception, and action。人工智能这门课是一门专门针对思维,感知和行动而建模的课程(建模是MIT的根本)。除了建模,我们还需要有支持模型建立的表示系统(why? 教授用陀螺仪和“农夫狐狸鹅和稻谷过河的故事”来举例说明表示系统的作用),而有了表示系统,约束条件就会呈现。最后,我们需要创建程序或算法来实现。

一个简单的例子就是“生成测试法”(generate and test),如想知道一片树叶的学名,可以翻开一本介绍树叶的书,一页页比对,测试是否相同。概括起来就是:生成器生成一些可能的答案,输入到一个测试器里进行测试,其中大部分会失败,偶尔有部分会得到满意的答案。我们把这种方法命名为“生成测试法”,是很有必要的。Once you hava a name for something, you get power over it。有了名字,你就可以谈论它,名字给了你力量,这就是Rumpelstiltskin原则。这正如我们有了数学符号,我们就可以描述,谈论和发展数学。

举个例子:如果教授提问学生“赤道线穿过了几个非洲国家?”,这是教授通过语言和学生交流,而学生的语言系统会向视觉系统发出指令,让它执行一个程序,沿着赤道线扫描地图,确认结果后反馈给语言系统,让学生回答说六个。生活中简单的事件,细细想来却是多么的神奇!如果没办法理解这种奇迹,就没办法理解智能的含义!

然后,教授简单介绍了下人工智能的发展史,从1842年埃达·洛夫莱斯编写第一段计算机语言,到1950年艾伦·图灵写的著名的关于图灵测试的论文(speculation age),现代的纪元真正开启于1960年马文·闵斯基写的《通向人工智能的步骤》,之后一位*乎失明的研究生James Slagle写的积分程序(之后会回顾),并演示了黎明(dawn age)早期和晚期的一些有趣的程序或系统。之后进入了推土机时期(bulldozer age),即专家系统和商业时期之后的一个时期,例如深蓝。现在正处于正路时期(right way),一个重要的关键词就是imagination。

之后教授又重申了语言的重要作用,他指出人类进化过程中,将我们与黑猩猩区分开来的是一小部分人获得了一种能力,能将两种概念合并为第三种概念,同时又不会破坏原有的两种概念,而且没有限制。这让我想起了《人类简史》里提到的类似的描述“人类语言真正最独特的功能,并不在于能够传达关于人或狮子的信息,而是能够传达关于一些根本不存在的事物的信息。”语言的作用在于(一)向上,让人类能够描述见到的事情,具有讲故事的能力,而讲故事和理解故事正是教育的全部;(二)向下,让人类能够想象语言描述的场景,例如:没有人告诉我们提着装满水的水桶在大街上跑会发生什么,但是我们很容易就可以联想到结果(你的大腿可能会被淋湿)。如果不能理解这个,我们将永远无法理解人类智能!

最后讲了一下课程相关事项,这里不赘述。

PS. 课程中提到的一个概念,值得深思:简单(Simple)与微不足道(Trivial)的区别:简单也可能强大,微不足道不仅简单,而且无价值。很多MIT人错过机会的原因在于,认为只有复杂的概念才是重要的概念。实际上,人工智能中最简单的概念通常都是最强大的。人工智能课程中,可以包含很多数学,成为数学系课程,但这会让概念不必要地复杂化,不必要地数学化。

 

------Lec 2. 推理:目标树与问题求解------2018.08.08------

这一讲首先通过一个积分题引出了课程内容,讲解早期人工智能中求解符号积分的人工智能程序[0:00:00]。

之后,教授介绍了安全变换和启发式变换,并用它们求解了这个积分题[0:05:40]。

详细介绍了程序求解积分题的方法之后,教授讲解了人工智能这方面中值得思考的问题[0:31:40]。

 

如果给你一个积分题,你将如何求解?

请思考:如果一个计算机能计算出来,那它算得上智能么?

我们回忆下大学里做积分题的时候,肯定是通过变换,化简,转换成熟悉又简单的基本积分表/公式,然后求解。这就是问题归约(problem reduction)。

为此,我们需要一套基本的安全(safe)变换,比如提取常数或乘上负数,这些变换是最基本的,最直观的,也是最安全的,尽管也许并不能解决稍有难度的题目。

接下去我们 1. 应用基本变换;2. 查表;3. 测试是否结束。

往往这时候是不够的,我们还需要启发式(heuristic)变换,作为我们求解过程中的一种尝试,不一定有效,有时候却能发挥作用。例如,当我们不懂如何化简时,我们就会去尝试三角变换,我们事先不确定它一定有效,只能变换后再观察下形式,说不定就柳暗花明又一村。

在转化的过程中,可能会引入“与节点”(and node)和“或节点”(or node),用来分解后分别求解之后组合,或转化为任何一种可能求解出答案的形式。我们把这种分解得到的节点树称为“问题归约树”,或“与/或树”,或目标树(goal tree)。Once you hava a name for something, you get power over it。

接下去当我们遇到“或节点”,该如何选择?Simplicity是个方向,对于计算机来说它得有一个可以衡量的指标,告诉它哪个更优。

因此之前的流程在3. 测试并未结束后,可以 4. 查找基本变换无法解决的问题;5. 应用启发式变换;然后循环回到1. 应用基本变换......,直至问题求解。

当我们应用Slagle的这个模型来求解56道难题时,我们可以问:有几道求解正确(54道);树的深度是多少?平均深度是多少?多少分支没用到?这样,我们就不仅获得了这个模型的信息,也获得了这个domain的信息。

本课花了大半的时间,深入介绍一个例子,在这一点上我赞同教授的说法:你想要学会一个技能(skill),就先得理解(understand)它,而为此你必须先见过熟悉它(witness),这就是为什么要深入细节(detail)的缘故。我觉得很多名校的公开课,学*的不仅是课堂上的知识,还有授课教授对于教育和人生的自己的感悟、见解和理念。

接下去,让我们跳出这个例子,来思考求解积分这件事的本质。一个是关于知识的问答法,在解决一个问题中,需要哪些方面的知识?一个是关于知识如何表示?例如在本例中表现为数学形式,有些会表现为流程形式等等;另一个是需要多少的知识?每当进入一个新领域时,你都应该问自己这些问题!Knowledge about knowledge is power!

最后,让我们思考本课开始的问题,这个程序算不算智能?当你知道它工作的原理,发现它运用的是你的解决方法,那么它究竟算不算智能?留给大家自己思考。

 

------Lec 3. 推理:目标树与基于规则的专家系统------2018.08.09------

这一讲首先介绍了一个移动方块的人工智能程序,并以此详细讲解了目标树的概念,这一程序不仅能够能够实现目标,还能解释自己在过程中的一些行为[0:00:00]。

第二部分,教授详细介绍了基于规则的专家系统,有一个医疗方面的专家系统比医生的诊断还要准确,教授讲解了它是如何做到的[0:18:20]。

第三部分,教授通过杂货店装袋的例子,总结了知识工程中的三大法则[0:33:17]。

 

在桌面上一堆大小不一的方块堆中,想要设计一个能听从我们指令,将指定的方块置于另一个方块之上的程序(PUT ON),我们需要四个步骤:FIND SPACE、GRASP、MOVE、UNGRASP。而要GRASP方块,先得有CLEAR TOP的操作,而CLEAR TOP又需要GET RID OF的操作,(其中可能涉及到多次循环),它会回过头去调用PUT ON。类似的,FINDSPACE也会调用GET RID OF操作。

举个简单的例子,桌面上Bx方块置于B1之上,By方块置于B2之上,现在想把B1放置于B2之上,那么我们需要上面说的四个步骤,其中为了GRASP B1,我们必须要CLEAR TOP B1,要完成这个操作,必须GET RID OF Bx,这回到了PUT ON Bx于TABLE上,开始新的系列操作,直至完成。在这个过程中,向上是WHY,向下是HOW,构成了一个GOAL TREE。建立了目标树后,程序就能回答关于他自身行为的问题,例如“为什么你要挪开Bx方块?”。

这个例子引出了本课的核心要义:行为的复杂性 = MAX(程序复杂性,环境复杂性)。正如西蒙观察的结论:蚂蚁会在海滩上走出复杂的轨迹,更多是因为避开复杂散布的沙砾。

同时,这也引出了基于规则的专家系统。人工智能中所有有用的东西,都可以用简单规则形式的知识表示出来,进行封装。Stanford的Mycin写了个诊断血液中细菌感染的程序,准确率很高。但涉及到太多医学术语,这里用一个动物园识别动物的例子来说明:

如果我说:这个动物(1)有毛发;(2)有爪子;(3)有尖牙;(4)目光如炬向前;(5)吃肉;(6)有斑点;(7)移动迅速;你可能会迅速猜测出这是一头猎豹。How?我们来看看以下几条规则:

R1:If 有毛发,Then 通常是哺乳动物;

R2:If 有爪子,有尖牙,目光如炬向前(组成“与节点”),Then 很有可能是肉食动物。(第5条正好印证了确实是肉食动物);

R3:R1 + R2 + (6)+ (7),组成“与节点”,得出大概率是猎豹。

这就是猜动物的游戏(是不是很像之前的“10个问题猜你心里想的明星”的游戏,也是通过提问诸如“是男的吗?”“是不是港台的?”逐渐缩小范围,最终确定)。如果你画出它们的推导图,你会发现,其实这很像之前提到的目标树Goal Tree。这就是一种基于规则的专家系统,在这个例子中更具体的叫做“基于规则的前向链专家系统(Forward-Chain Rule-Based Expert System)”,即从已知事实往前推出结论。与之对应的是“后向链(Backward-Chain)”,即从一个假设往回追溯。例如我问你:出现在我们眼前的这只动物是猎豹吗?你会怎么思考和回答!你肯定会去确认:它是一个哺乳动物吗,有没有毛发?是否是肉食动物,有没有尖牙利爪?是否身上有斑点?且移动敏捷?这里的假设是这个动物是猎豹,往回利用之前的规则去验证。不论是向前还是向后,这类系统都有一个重要特征:演绎系统(Reduction System)

最后,让我们通过一个杂货店装袋的例子,总结知识工程中的三大原则:

如果你去超市买很多东西要装进购物袋里时,你通常会怎么做?你会基于什么通用原则?例如:大的重的放底部,小的轻的放顶部;容易被压坏的不能放底部;干的湿的要分开;等等。你是怎么知道这些的?肯定是从日常自身的或观察得到的个案经验中得出,怎么放薯片,怎么放牛奶,怎么放蔬菜。所以,

启发1:通过观察个案,你能从别人那里得到通过其它方式无法得到的知识!

接下来再思考,当我们放置罐装豌豆和冷冻豌豆来说,会一样的处理么?尽管它们都是豌豆。但我们都知道不要把从冰箱里拿出来的东西和其它干的东西放一个袋子里。所以,

启发2:考虑看起来相同,但实际处理方式有所不同的东西!

当我们有了自己的装袋规则后,我们每次去超市都能完美的解决么?如果有一天,你买了一个新的东西,以往的经验和规则无法告诉你,应该放在哪一个塑料袋或者应该怎么叠放,该怎么办?所以,

启发3,建立一个系统,观察它何时出问题,出现问题的原因是因为缺少了某一条规则,需要你添加进去!

实际上,这些知识工程中的法则对于个人的自我改造同样的重要!不是么?当你学*一个新的主题和领域时,你如何将自己建立成一个专家系统?学*一些个例,看看有哪些专业的术语和定理,然后对于不同的问题思考它们之间的区别到底是什么,最后当做作业或者实际应用时,发现卡住了或者无从下手,那是因为你的知识体系还缺少了一部分东西,你要去补回来,然后再去解决。如此往复,你将变得更加的智能和聪明!

PS. 留一个问题给大家思考:上面例子中的智能其实只是建立在规则上的,加了一层虚饰的系统,它基于规则,但是并不代表它理解这条规则,例如它知道薯片不能放最底部,也许它还知道因为这样容易被压坏,那么它是否又知道为什么压坏了就不好了吗?它并没有自己的常识。那么问题来了:规则和常识之间有没有任何关系?

教授对此持部分不可知论者的态度,认为在一些特定情况下,规则能够在我们对常规事物的理解中扮演角色。教授演示了个例子,一个计算机程序通过读取一段小说节选,基于规则库分析出了各种要素,如主人公,角色,事件,心情等等,例如文字中提到A被B伤害,那么程序推断A有可能受伤,心情愤怒,或者A可能死去。文字中直白的描述一般较少,推断的部分往往很多,这说明了什么?说明大部分内容都是受控的幻想,作者知道你脑袋里的规则,就可以利用这些来讲故事,不用巨细靡遗,你却能自己脑补细节。是不是想起了第一讲中的关于讲故事和理解故事的论述。O(∩_∩)O

 

------Lec 4. 搜索:深度优先、爬山、束搜索------2018.08.16------

这一讲开始讨论各种搜索算法,首先是最基本的大英博物馆法,也就是找出一切可能的蛮力算法[0:00:00]。

之后教授通过例子讲解了深度优先搜索算法和广度优先搜索算法[0:08:05]。

之后,教授介绍了搜索中如何避免重复搜索,并用其分别优化深度优先和广度优先算法,得到爬山算法和束搜索算法[0:20:26]。

最后,教授讲解了故事阅读中搜索的程序例子[0:41:15]。

 

打开手机中任一款地图App,输入我们想要去的地方,系统就会推荐给你几条路线。人类是怎么做的?基本上只要你看一下地图,一般不难得到可能的路线,这可以称得上“视觉算法”。那么计算机是如何实现的呢?一个简单粗暴的想法是找出所有可能的路径,这就是“大英博物馆法”。

最简单的搜索算法有深度优先搜索(Depth First Search):沿着一条路径前进,无法继续往前时,开始回溯(Backtracking),回到上一位置,选择另一个分支,直至找到通向目的地的路线(不一定是最优的)。与之对应的是广度优先搜索(Breadth First Search),一层层建立起这棵树,然后发现在某一层得到了到达目标的路径。

举例说明:S->A/B,A->B/D,B->A/C,C->E,D->G,求S到G?

深度优先搜索算法的流程大致如下:初始化队列(S) -> 扩展队列中第一个路径(S->A | S->B) ->如果未结束,继续扩展,把扩展得到的路径加入队列,放置于队列前端(S->A->B,S->A->D | S->B)-> ......继续扩展,直至找到路径,如果无法找到,那么删除第一个路径,开始扩展第二个路径......。而广度优先搜索算法不同的地方在于把扩展得到的路径加入到队列末端。不过这个搜索算法有个愚蠢的地方,在于扩展路径时有时又回到了之前的节点,这是浪费时间的。基于此,我们可以考虑检验待扩展路径中末端的节点,如果该节点在原来已扩展路径的末端出现过,那么不再重复扩展。为此,我们需要一个位置列表,存放之前已经扩展过的所有路径末端节点。这是一种优化的选项。

在现实生活中,我们都知道在寻找路径中,每一次遇到选择时,都要尽可能的选择靠*目标的路径,而不是反方向,应用到程序中就是爬山搜索算法(Hill Climbing)。这个算法要求在问题中有离目标距离的启发式衡量,否则你如何知道哪一个离目标更*。具体在算法中,与深度优先搜索算法的改进是在扩展路径时进行排序后放到队列前面。

爬山搜索算法可以算是深度优先搜索算法的优化,而束搜索(Beam Search)则是广度优先的改良。在每一层的扩展中限制一个束宽(Beam Width)W,每层只保留W个节点,当然是离目标最*的W个。具体在算法中,与广度优先搜索的改进是在扩展路径时保持W最佳。

回过头来再思考下爬山算法,它的本意是指当我们在大雾中需要尽快登上山顶,但却无法识别路径,只能向身边四个方向尝试一段距离,看看哪个方向使得自身海拔更高,那么这个方向就有可能是通向山顶的路径。那么这有可能存在什么问题?一个问题是:如果你的周边有个小山丘,那么按照这个方法,有可能被困在这个局部最大值中,无法登上真正的山顶;另一个问题是:如果刚好你的周边都很平坦,那该方法也似乎失去了作用;还有一个问题通常出现在高维问题中:如果你刚好处在一个南北45度的山脊上,那么你朝东南西北四个方向走,都是呈下降趋势,除非沿着南北方向山脊走。这些都是可能会在算法应用中卡住你的地方,让你以为你找到了真正的答案。

最后回到上次课中提到的计算机分析小说选段的程序,计算机分析完后能回答你的一些问题,如“为什么A要谋杀B?”,在于它构建了目标树,在局部中看联系,而通过查找更高层的内容,反思它自身的思考过程,并将这些高层反思内容综合汇报出来。这就是为什么一些程序看起来很智能,似乎它明白自己在做什么,以及为什么这样做!

 

------Lec 5. 搜索:最优解、分支限界、A*------2018.08.17------

这一讲主要讨论了最短路径问题。首先教授在黑板上演示了一个例子,介绍分支限界法[0:00:00]。

之后,教授引入了扩展列表,避免重复扩展,以优化分支限界法[0:18:35]。

再后,教授通过可容许启发式对算法进行了优化,避免寻找最短路径时往反方向进行的无谓搜索[0:25:15]。

最后,教授将上述两种优化加到分支限界法上,得到A*算法,并讲解了A*算法中可能碰到的一些问题[0:36:00]。

 

上一讲主要集中于如何找到通往目标的路径,这一讲我们来看看如何找到最短路径。如果让我们用眼睛在一个简单的地图上扫描,我们很容易确定出一条最短路径,那么接下去呢?如何确保你确定的是正确的?一个简单的想法是找出所有的路径,如果都长于这条路径,那么这条路径就是最短路径。但有时地图很复杂,光凭估算,也许没办法大致确定出一条最短路线,那么该怎么做呢?类似的,你开始从起点朝向终点开始扩展路径,每次都扩展最短的节点,最终得到一个预估的最短路径,接下去你还是要确保每一条路径都长于你刚刚得到的最短路径。这就是分支限界(Branch and Bound),算法如下:初始化队列 -> 测试第一个路径(排序后) -> 扩展第一个路径,并排序 -> 回到上一步,测试第一个路径,以此往复 -> ......

同样的,跟上一讲一样,我们可以用扩展列表存储已经扩展过的路径,如果第一个路径在扩展列表(Extended List)中,那么不再需要扩展,避免无谓的重复。

另外,我们都知道两点之间距离最短,所以,当我们扩展了第一个路径后,我们会得到这些扩展节点通往目标的下限,我们可以以此作为我们扩展的依据,这也是一种优化策略,考虑剩下的直线距离下界,会让我们避免朝相反的方向尝试,基于积累距离+估计距离,这称为“可容许启发式(Admissible Heuristic)”。

那么A*算法就是分支限界加上上述两种优化得到的算法。这个算法似乎很完美,但是在一些特定情况下(如非欧几里得排列)使用可容许启发式却可能会遇到困难。这似乎有点难以理解,不过要记住,Search is not about map, but about choice。在地图模式下,可容许性需要满足“任一节点和目标之间的估计距离 ≤ 实际距离”,但在非地图模式下(在这种情况下,你可以估计任一节点到目标的距离远远小于实际值),还需要加上一致性(Consistency)条件:| 任一节点X和目标的估计距离 - 另一节点Y和目标的估计距离 | ≤ X和Y之间的实际距离

 

------Lec 6. 搜索:博弈、极小化极大、α-β------2018.08.19------

这一讲讲解了人工智能如何进行博弈,包括下棋,深蓝曾经因为击败国际象棋世界冠军卡斯帕罗夫而轰动一时。

这一讲首先介绍了进行博弈可以使用的各种方法[0:00:00]。

之后开始讲解极小化极大算法[0:14:40]。

再后,教授介绍了极小化极大算法的优化——α-β剪枝法,这样做能够有效提高算法效率[0:21:57]。

最后,教授讲解了逐步深入和随时算法的概念,并介绍了深蓝的实际工作机制[0:34:10]

 

计算机会怎么下棋?

第一种是像人类一样分析形势,采取策略,最终决定下一步,但没人知道这该怎么实现。

第二种是采用IF/THEN结构,基于当前形势,看看什么移动是可行的,并进行排序;

第三种是往前看并进行评估,类似于第二种方法,我们要确定哪一个是对我们有利的,选择最大值。要做到这一点,需要设法评估这些形式,这就需要静态值s = g(f1, f2, ..., fn) = c1·f1 + c2·f2 + ... + cn·fn,用来探索可能发生的事情的任何后果。例如,当我们走完一步,我们检查王的安全,检查排兵布阵,并把这些信息作为输入,得到对应静态值,依次选出最大的静态值。

(深入探讨前,先介绍目标树相关的几个术语:分支因子(Branching Factor)b:每一层选择方式的数量;树的深度(Depth)d;末端/叶节点(Leaf Nodes)b^d;)

第四种是采用大英博物馆法处理,这大概需要处理10^120个节点,如果全宇宙的每一个原子都以纳秒级的速度处理一个节点,仍然离这个目标差了十几个数量级,所以,这个方法并不可取。

第五种是尽可能往前看,并不局限于下一层。这是我们要采用的方法,下面以极小化极大算法来说明。

极小化极大算法(MiniMax),听起来比较拗口。举个简化版例子,你当前执棋,对于你来说有A1和A2两种走法,而对于你的每种走法,你的对手都会有两种走法,假设,A1->B1/B2,A2->B3/B4,这种情况下去算静态值分别得到2,7,1,8。对于你来说,你肯定希望最后走到8这个地方(你称为极大值者),但是不论你选择A1还是A2,你的对手肯定不会让你如愿以偿(他被称为极小值者),如果你选择A1,那么他肯定选择B1,这样得到值为2,如果你选择A2,那么他肯定选择B3,这样得到值为1。那么当你知道后,你会选择走A1还是A2?当然是A1!尽管走A2可能会得到8,但除非你的对手真的水平很差。这就是一种博弈。不过要注意的是,这里只考虑了两层,如果再往下一层,你的对手在决定往B1/B2/B3/B4的时候还会考虑如何极大值他自己。因此,如果你能够足够深入到更深的层,那么你将所向无敌,当然,这个计算量也是非常之大。

那么如何尽可能的往下深入呢?联想到我们在介绍分支界限里采用的一些优化算法,这里可以类似的应用。同样以上面的案例来说明,假设你算出第二层的第一个节点B1是2,那么你的对手肯定知道A1节点≤2(因为如果B2大于2,作为极小值者肯定选B1),那么你肯定知道你的选择≥2(因为如果B3/B4决定的值小于2,作为极大值者肯定选择2)。然后算B2节点,值为7。继续,B3节点值为1,到这就够了!因为你的对手肯定知道A2节点≤1(理由同上),那么你还要选择A2这个节点么?所以,A2这个分支就无需再考虑。这也是α-β算法的精髓,它是极小化极大算法的改进,在层数越高的时候,性能提升更明显,因为可以做深层剪切(Deep Cut-Off)。在这种情况下,我们需要做的静态评估数大致是2b^(d/2)

在之前的案例中,我们考虑分支因子在每个节点都相同,但实际上它会随竞局状态和本身发生变化。考虑一个d层的树,在d层有b^d个节点,在d-1层有b^(d-1)个节点,如果你不想进行最下面d层的所有计算,你可以计算出往下只到d-1层时的答案,作为一份“保单”,如果连这一层计算都非常大呢?那就继续往上,如果从第一层就开始考虑呢,计算量约为b^(d-1),跟在最后一层计算没什么区别。这就是逐步深入(Progressive Deepening )思想,它也是随时算法(Anytime Algorithm)的一个很好的例子,能让你的博弈算法在规定的时间内得出较优的结果。

那么1997年的深蓝就可以看成:极小化极大算法 + α-β + 逐步深入 + 并行计算 + Opening Book + 专用于残局的算法 + 非均树创建

那么,这是对人类智能的建模?还是另一种智能?

 

------Lec 7. 约束:解释线条图------2018.08.22------

这一讲主要讲解了如何让计算机智能识别物体的组成,也就是线条图解释,这是计算机视觉方面的基础。

教授首先介绍了这方面研究的历史,详细介绍了不同时期,三位计算机科学家对这一问题的解决方法:

首先讲解了Guzman的实验方法[0:00:00],之后讲解了Huffman的理论方法[0:11:50],最后讲到Waltz是如何将前人的方法总结得出优秀算法的[0:32:00]

 

桌面上放了几个积木,你大概一眼就能说出来,那对于计算机来说如何实现?计算机需要把问题转化为图像中有几个面,哪几个面是属于同一个物体,而哪几个面属于同一个物体又如何做到?Guzman提出了根据判断三个面之间的连接点(Three Faced Vertexes)特征来决定是否属于同一个面(通常会在图像中投影成一个箭头或一个叉),但是这个方法有时能奏效,有时却不行。

而作为一位数学家,Huffman决定不局限于这个实际的问题,而是考虑一个拥有多个特征的世界,特征一是这个世界可以用一般位置(General Position)来表示,也就是不考虑视角奇特的情况;特征二是只处理三面的世界,也就是所有顶点需要由三个平面构成(且只能是三个平民);特征三是考虑三种线(4个标记):凹,凸,边界(左/右)。(一些术语:Vertexes,Edges,Junctions,Lines)。以上三个特征加上这些术语,我们就有了一个完整的目录,而事实证明,只需要18种情况就能完备这个目录。如此,计算机就能对每一幅图中的线进行标记并判断。虽然Huffman的理论方法相比Guzman有一定的进步,但是自然界中的情况远比上面来得复杂,会有阴影,裂纹,也会有四个面构成的顶点,等等。

于是,David Waltz加入了裂纹,阴影,非三面顶点,光线,让标记从4个增加到50多个,连接点从18增加到1000多个,解决了一般性的问题,算法上也可以转化成简单的深度优先搜索问题,但运算量太大。Waltz总结了算法,从一个连接点1出发,得到可能的情形,然后考察连接点2的标记,保留那些满足连接点1和2之间允许的情形,依此,通过连接点3可能的情形,反过来约束连接点2的情形,这样就能删除掉许多不可能的情形,直到标记所有的情形。

PS. 以上也是成功的准则:从一个问题开始,找到一些能奏效的方法,然后给出一些工作原理(但并不一定能完美处理正确的问题),最后你需要将所有这些综合起来,得到解决一般性问题的方法。

  

------Lec 8. 约束:搜索、域缩减------2018.08.23------

这一讲主要讲解地图着色问题和资源调度问题。

首先,教授使用一般深度优先搜索为美国地图进行着色(四色问题),这是根本行不通的[0:00:00]。

之后,教授在此基础上使用了域缩减算法,这让问题处理得到了很大改善[0:09:20]。

再后,教授又加入了最多约束优先的优化,这种做法效果很大[0:29:00]。

最后,教授将地图着色问题的解决方法应用到了资源调度问题,考虑如何调度飞机的情况[33:35]。

 

地图四色着色问题是个非常经典的问题,但是使用深度优先搜索算法将会是非常不明智的做法。之前提到的约束传播(Constraint Propagation)似乎也没有什么帮助。

在解决这个问题前,先引入一些概念:变量V,值X,域D,约束条件C。是不是有点像初中学过的求y=f(x)=x2(-3<x<5)的最大值。

一个直觉的算法是:对于每一个深度优先搜索赋值,对于每一个考虑过的变量Vi,对于每一个域Di中的值Xi,对于每个约束条件C居于(Xi,Xj)满足Xj属于Dj,如果不存在一个Xj使得(Xi,Xj)的约束条件得到满足,那么就从Di中排除Xi;如果域Di为空,那么回退。这就是域缩减(Domain Reduction)算法。

听起来似乎很拗口,其实很直觉,举个例子,城市A与B/C/D/E均接壤,B/C/D/E依次接壤,每个城市的颜色都可以是R/G/B/Y,如果一开始选定城市B的颜色为R,那么A的颜色就不能是R了;接下去选定城市C的颜色为G,那么A的颜色就不能是G了;城市D的颜色为B(为什么不再选R?避免过度使用一个颜色),那么A的颜色也不能是B;如果城市E的颜色为Y,那么A也不能是Y,那就没颜色可以选了,域为空,所以E的颜色不能为Y,因此回退获取选择E的颜色为R,这样的话A的颜色为Y,满足要求。

在这个算法中,“考虑过”的变量该如何选取是个问题?1. 完全不考虑,肯定不行,失去了约束;2. 所有,不现实;3. 检验刚赋值的,计算量大;4. 邻*区域,不错,虽然也要花一定时间;5. 让已缩减的域在变量之间传播,进步显著(对事物的改变进行传播是个好主意,但应该什么时候传播?一改变就传播显然不是个好主意);6. 对域缩减为一个值的变量进行传播

那么我们应该是从约束最多的一个城市开始,还是约束最少的城市开始?事实证明应该使用约束最多的城市开始!Why?留给大家思考。

最后举例了下这个算法在资源规划上的应用,其实是将问题类比为四色问题来解决,要很好的分配资源,可以1. 总使用最多约束优先;2. 域缩减为1时总使用约束传播;3. 如果是求最小所需资源,可以使用上下夹逼法

 

------Lec 9. 约束:视觉对象识别------2018.08.24------

这一讲讨论了计算机视觉和对象识别,介绍了这方面技术的缓慢发展以及仍未完全解决的现状。

这一讲首先介绍了大卫·马尔对计算机视觉的早期思想[0:00:00]。

之后,教授介绍了Shimon Ullman的比对理论(alignment theories),并进行了模拟演示和相关证明[0:07:00]。

最后一部分,教授介绍了人脸识别技术的现有方法和困境[0:30:45]。

 

早期,传奇人物大卫·马尔提出,视觉识别的第一步是形成对外部世界情形的基于边缘的描述,即原始草图(Primal Sketch);下一步是用一些向量来修饰原始草图,即2.5维草图;第三部是将2.5维草图转化为广义物体形状;然后同库中的形状比对,最终实现识别。不错的想法,问题在于,没人能实现它!变换很难,得到的结果却很粗糙。

之后,以Shimon Ullman为代表提出识别的比对理论:首先,对一个物体照三张照片,就能重构该物体的任何视图(前提是假设物体是透明的,所有顶点都可见),更为准确的说是能生成物体的任何正射投影视图。举个例子,一个多面体有三张照片A,B,C,那么想要得到一个视图D,或者判断D是不是同一个多面体,可以怎么做?取D中的几个顶点,对于A/B/C中对于的顶点,可以写成:xd = axA + bxB + cxC + d,这样就可以构成一组方程组。或者说通过线性变换,从三个样本物体,可以生成第四个物体上的点。那么,只要选择4个对应的点,就能根据四元四次方程求出a/b/c/d。这对于识别有什么用?有了这四个值,对于任何一个特征点,我们都能估算出它在D中的位置,如果我们发现在D中不是,我们就有理由怀疑这不是同一个物体。那么,最后的问题就是证明上述那个线性等式是正确的。这个证明不算难,可以留给大家尝试,或者浏览视频。

比对理论是个很好的idea,不过它对工业制品蛮奏效,对自然物体却不是太奏效,例如人脸。首先必须找到合适的对应点,而且脸部的变化不局限于三维旋转和平移。因此,一种改进的算法,不再局限于边缘和特征点,而是基于相关性(Correlation),就像我们常常看到的在一幅合照中,通过一个矩形框框,依次扫描,最终锁定目标面部。但是,如何选择合适的矩形框,或者说特征(例如说眼睛和鼻子组合),使之不能太大(匹配精度不高),也不能太小(容易误判),是问题的关键,这也就是金凤花姑娘(Goldilocks)原则选用合适的Mask,利用相关性能有效的抵抗噪声的干扰。但是这个理论也并非无所不能,上下图像的颠倒,竖直方向的拉伸,都会让难度加大。

最后,来看看视觉识别中的挑战(2010年),教授给了个例子,假设有48组动词,能够从给的图中识别出对应的动作吗?也许不难,可以轻松识别Drinking和Toasting,但是如果是一幅有同样元素,却很奇怪动作,或者微小的暗示时,人类能够一眼看出,计算机却可能犯迷糊,例如一只猫在歪着头用嘴接水龙头流出来的水。教授认为,这是因为我们讲故事的能力深入到了视觉系统,我们知道猫渴了,所以它是在喝水。虽然从视觉上看跟人类喝水很不一样,但是视觉系统下最本质的东西,为我们的故事系统提供了足够证据,让我们判别为这是一个喝水动作。这就是视觉识别中的一大挑战!

  

------Lec 10. 学*介绍、最*邻------2018.08.26------

这一讲开始讨论机器学*方面的内容,机器学*专门研究计算机怎样模拟或实现人类的学*行为,以获取新的知识或技能,不断改善自身的性能,是人工智能的核心[0:00:00]。

教授首先举例讲解了机器人如何辨别流水线上不同的产品,以此介绍最*邻问题[0:08:45]。

之后,教授讲解了机械臂如何在学*过程中实现特定的动作,例如打球和抽熄蜡烛[0:24:15]。

最后,教授讲解了睡眠相关的研究[0:42:20]。

 

一个计算机程序要如何才能伸手去抓一杯咖啡并喝掉它?一只狗会把低糖可乐看成是什么东西?这两个问题大家可以先放在心里思考。

机器学*分为两类,一类是基于观测和规律性的学*,例如最*邻(Nearest Neighbors,模式识别/Pattern Recognition的领域),神经网络(Neural Nets,一种仿生/Mimic Biology尝试),Boosting算法。这类学*也可以看成推土机式计算(Bulldozer Computing)。另一类分支是基于约束的学*,可以称之为类似于人类的处理方式,例如一次性(One-Shot)学*,基于解释(Explanation)的学*

这节课要介绍最邻*学*:得到某种机制,生成一个关于特征的向量集合(特征检测器),它的输出值组成一个向量,进入某个比较器,比较器将会对比这个向量和存放各种可能性的库中的特征向量,通过找到最匹配的结果,比较器能确定这个对象是什么,这样就能进行识别。什么意思?举个简单的例子,流水线上有四种不同类型的插座盖子A/B/C/D,那么机器人该如何对它们进行自动分类?首先,它可以进行一些测量(例如总面积和孔的面积),这样可以得到四个特征点/向量(横坐标为总面积,纵坐标为孔面积,在高维中也类似),那么当新来一个插座盖子时,它可以很轻易的得到对应向量,并计算它离之前每个向量的距离,最*的就是最匹配的。那么如何判断离哪个特征点最*?我们对每相邻的两个特征点作垂直平分线,那么它们会彼此分隔,形成一个个区域,落在这个区域内的,就称为离该特征点最*,而这些分隔线就称为决策边界(Decision Boundaries)。那么如果现在有个全新设计的插座盖子,它的孔面积和之前的B最接*,那么你觉得它的总面积会和谁最接*?大部分的人都会选择B吧,因为如果某个东西在某些方面很相似,它在其它地方也有可能很相似

再来看一个例子,在信息检索中,你有一些来自不同杂志的文章,你感兴趣的是学*一些解决特定问题的内容,那么怎么去找同你的问题最具关联的文章?一个简单的算法是统计当前库中文章的词汇所出现的次数,并同要探索的问题中词出现的次数进行比对。举个二维例子,你感兴趣的关键词是Hack和Computer,那么假设A杂志出现这两个词差不多次数,B杂志出现了很多次Hack,但极少出现Computer,那么肯定是A杂志更符合我们的要求。但是在计算机二维比对中,也许你要探索的问题中词的出现次数特征点距离反而离B杂志更*!这时使用距离去测量就不合适了,改成用向量之间的夹角反而更合适,这就是非标准测度

接下来我们来看机械臂中的应用,假设有个机械臂,由A/B/C三段组成,A/B之间的夹角为a,B/C之间的夹角为b,我们企图让C末端的手握着一个球沿特定的轨迹运动(根据我们设定的速度和加速度),那么球的运动轨迹可以转换成a和b的变化,但是想要得到精确的数学表达式以此来控制,是不太现实的,除了数学表达式极为复杂,也在于微小的改变(如机械关节处的磨损),也会影响最终运算的结果。我们可以换一个思路,假设我们有一张足够大的表,对于小球运动轨迹中的每一小段,都存储了对应的角度,速度,加速度和机械扭矩等信息,那么我们让机械臂从头开始,每一次的运动调整中都对这个表进行数据增添和更新,直到它掌握了足够多可能的数据,那么它就会逐渐趋于稳定和准确。

类似于棒球手投球,假设身体每个关节可以用100字节信息来记录,投手全身参与的关节有100个,投球轨迹可以分成100段,投手每天投100次球,一年练*100天,能活到100岁。这样的话,这个信息大小(1012)也还不算太大以至于无法存储。那么人的大脑中有多少神经元(小脑1011)?多少突触(105)?那么我们确实是可以通过不断练*,更新我们的表格,达到更好的技术水平。

在上面的例子中,有几个问题需要注意:1. 不均匀问题/散布问题(x集中于一段范围,y到处分布)可以进行正规化数据处理;2. 什么起了作用(有没有答案是完全不依赖于y的情形?);3. 如果答案完全不依赖于数据呢?

最后一部分关于睡眠的研究告诉我们:睡眠很重要,缺眠很严重,不要再熬夜!

回到最开始的两个问题,第一个问题,我们已经知道如何控制机器手臂的轨迹。第二个问题跟这门课有什么关系?狗不会知道为什么要和低糖可乐(为了不要长胖),它缺乏给自己讲故事的能力,把这二者串联起来(好吧,又是讲故事!)。这提醒我们要当心混淆关联性因果性

 

------Lec 11. 学*:识别树、无序------2018.08.27------

这一讲继续讲机器学*方面的内容。

首先,教授介绍了识别树的概念,这是用一系列测试标准判别某个体属于哪一类的树[0:00:00]。

之后,教授考虑了大数据的情况,这时就有必要引入无序度的概念,来衡量测试的质量,这部分借用了信息论方面的知识[0:21:43]。

最后,教授在前面的基础上进行完善,考虑了数值数据如何处理,并同之前的最*邻算法进行了对比[0:40:30]。

 

如果想要根据判别一些特征,来确定眼前这个生物是不是吸血鬼,可以用到上一节课的方法吗?要注意到这里与上一节课的例子有些不同之处:这些特征不是数值的;一些特征并没什么用;一些特征只在部分情况有用;有些测试可能比其它代价更大;因此,这里我们希望构建一个测试集,得到不同的结果,然后可能还需要不同的测试,直到最终确定结果,这称为识别树(Identification Tree)。例如,我们可以考察他们是否有影子,是否怕大蒜,面色,口音,这些特征有些有很好的区分作用,例如如果没影子,那么必然是吸血鬼,但是有些并不能很好的区分,例如面色和口音。如果我们想尽可能地区分吸血鬼和正常人类,应该怎么做?简单的想法就是看看有多少样本在同质子集中。怎么理解呢?以影子测试为例,假设有8个样本,无影子的有1个,有影子的有3个,没办法得知的有4个,那么在同质子集中的就是1+3=4个,剩下4个还需要另外的测试(例如大蒜测试),才能划分开。依次可以分别得到各种测试的同质子集样本数,然后选择从最优的开始。

上面这个方法对于处理大数据集有什么不同?困难之处在于对于大数据集,没有测试能够立刻得到任何同质子集,需要有更精密的方式去测量分支底端的这些集合有多无序,即无序度(Disorder)。这需要借用信息论的知识,这里就不详细介绍了,感兴趣的可以看看信息论中关于熵的相关教程。熵的概念其实很直接,也很直觉。你觉得上面四个特征哪一种测试最不靠谱?直觉会告诉你口音,或者面色,误判的可能性很大,事实也确实如此,它们的熵也确实较大。

最后来看看上面的方法和之前的最*邻算法的对比。最*邻中我们采用决策边界(每两点之间的垂直平分线)来划分不同的区域,那么在识别树中呢?我们会先确定一条线,分成两个子集,然后再对每个子集采用同样的方法划分,因此最后得到的区域就会与最*邻有所不同。那么它的优点在哪里呢?你不需要使用所有的测试,只需使用看起来对你有用的测试(就像我们也许只需要影子测试和大蒜测试即可),这意味着测量技术变简单了,代价也更小。

 

------Lec 12. 学*:神经网络、反向传播------2018.08.30------

这一讲继续讲机器学*方面的内容。

首先,教授介绍了生物学上的神经网络,并将其推广到人工智能领域,对其进行建模[0:00:00]。

之后,教授讲解了性能函数,并讲到如何对其进行优化,详细讲到了梯度上升法[0:10:40]。

再后,教授详细进行了相关的偏导计算,并深入探究了反向传播算法[0:25:36]。

最后,教授讲到了神经网络算法相关的一些问题,并给出了示例[0:40:45]。

 

人脑中充满了神经元,神经元除了有细胞体/细胞核,还有个长的突出——轴突(通常分叉成两支),而另一边有许多的树突树(以便下游轴突连接),这样就完成了互连,可以传导兴奋。其中,一些突触相对更重要,作用更大,也就是说存在突触权重;另一个是积累效应,对刺激进行积累,最终决定是否继续传导;还有一个就是对于传导来说要么全有,要么全无。那么根据这三点,如何对这个生物元素建模?

对于每一个输入INPUTi,经过加权Wi,然后进行汇总求和,送入一个临界值函数,输出为0/1,成为下一个神经元的输入。汇集许多这样的模型,那么就可以建立起简单的神经网络,对于输入x1,x2,...xn,经过神经网络后,得到输出z1,z2,...,zn,或者说输出向量等于输入向量与权重的某种函数(对于临界值,我们可以采用一个小技巧消除它:就是增加一个输入-1,并设置它的权重为临界值),Z = f(X,W)。当然,如果我们有一些训练样本X,我们可以得到理想输出D = g(X),那么我们希望有一系列权重W,让实际输出f(x)和理想输出g(x)对应起来。那怎么衡量权重的好坏,它可以是f和g的函数,称之为性能函数P(D,Z) ,简单的形式是-1/2||D-Z||2,通过求它的最大值,可以得到最优的W。

怎么求多元函数的最大值?梯度上升法(垂直于局部等性能线的方向)也许可以考虑,但是因为它需要求导,所以对于阶跃函数并不那么方便处理。But,没有人要求临界值函数必须是阶跃函数,为什么不设置临界值函数是平滑上升的呢?因此,考虑数学计算的方便,我们可以求解这类问题。举一个最简单的神经网络例子:一个输入x1,乘上权重w1,得到p1,经过临界值函数1/(1+e),得到y,乘上另一个权重w2,得到p2,仍然通过临界值函数得到z,进入性能计算函数,得到p = -1/2(d-z)2。假设自己有一些样本,具有理想的值d,那么,可以观察实际值z,调整权重使二者趋于一致,其中可能需要用到偏导计算(详见课程,其实不难)。通过计算可以得出结论,我们想要求导的只基于我们已经计算出来的和相邻的东西,这也称为反向传播算法(Back-Propagation Algorithm)。首先计算离输出最*的w,得到这些后,就得到了足够的信息,就能够往回一步,计算出下一列的w值,然后继续往回,直到回到最前面,最后一列中做的计算,同在中间一列的计算量相同,这是一种局部计算。

最后来看看神经网络算法中的几个问题(凡事问五次为什么,不要相信你的直觉):第一个是,上面这种计算实际上是在做什么?(其实不过是曲线拟合,有很多种方法,如傅里叶变换,这个优势在哪?);第二个问题是,假设有一个赛马相关问题,如何将参数编码到输入向量中,以此反映出问题的实质?(这是最难的部分);第三个问题是,如何防止过度拟合带来的扭曲?第四个问题是,如何选择调整速率常数,避免猛烈的正反馈情形;

 

------Lec 13. 学*:遗传算法------2018.09.01------

这一讲继续讲机器学*方面的内容,主要内容是遗传算法,这是一种对生物和进化的模仿,教授首先介绍了相关的生物学知识[0:00:00]。

第二部分,教授介绍了朴素的进化算法[0:07:20]。

第三部分考虑了对算法的一些改进(包括模拟退火算法)[0:20:50]。

最后,教授介绍了一些遗传算法的例子,包括用方块模拟的生物进化[0:35:10]。

 

在繁衍生殖中,染色体会纠缠在一起进行重组,并进行细胞分裂(其中可能有突变交叉互换),最后基因型过渡成表型,形成个体。这些不同的个体(携带不同的染色体组合)具有不同的适应性,影响存活到下一代的概率,经过自然选择,又从表型转化为基因型,从新开始下一轮的繁衍。

在机器学*中,我们可以对其进行仿生模仿,如果我们能得到适应性函数,那么我们可以由适应性来决定子代的存活概率,所有子代的概率之和为1。举个简单的例子:假设在一个空间中,适应性是x和y的函数f(x,y),有两个个体(0.3, 0.7)(0.6, 0.2),突变算子会让这些值发生一些变化(如0.3变为0.2),交叉互换法则则会交换不同值对的x和y(如产生(0.3,0.2)),那么这些子代经过自然选择和不断繁衍,函数值高的存留下来,低的被淘汰,最终接*函数值最高点(也有可能只是在局部最高点中)。另一种思路是我们不关心适应性具体的值,我们只关心所有候选者的排序,其适应性数值本身不作为决定的标准,这称为排序空间法(Rank Space Method)。排名第1的子代被选中的概率为Pc,排名第2的子代概率为(1-Pc)Pc,依次类推(也有可能困在局部最高点中)。

注意到为了避免困在局部极大值中,我们可以一开始选用长的步长,然后慢慢缩小步长,这称为模拟退火(Simulated Annealing),来源于对金属加热,会让原子震荡剧烈,慢慢退火冷却后,原子震荡也降低。另外,如果困在局部最大值中,失去了多样性,那除了适应性,为什么我们不顺便测量多样性呢?考察同已选个体之间的差异。例如,我们在选择中,第一个选适应性最强的子代,第二个选择与第一个差异最大的个体,也就是多样性最强的,依次排序选择,当你达到最高区域时,可以不必再考虑多样性,你只需留下适应性最强的子代。

其实,生物进化很直观,如果这个物种是地球最强者,环境变化也不明显,那么可能几亿年来,都没什么太大进化,局限于一个物种中。而对于更底层的物种,想要存活,就必须有一定的多样性,通过适应性不断进化。这是朴素的自然进化。

回过头来再看一下遗传算法(Genetic Algorithm),其中许多地方还是可以调控的。突变其实还是在爬山,生成一些扩散后用适应性指标来爬山,处理方式可以有很多选择;交叉互换就是企图将多个个体的优点综合到一个个体身上(这也是为什么很多人相亲时总会考虑后代的优良),也可以有许多选择;而从基因型向表型的转变,可以由设计者去决定;剩下的也都可以去设计调整。

来看一些实践应用吧。一个是在计划的编排上(需要一系列步骤),S1, S2, S3, ...,如果你有两个计划,那么你可以对两者进行重组,生成新计划。另一个是在赛马的预测上,如果你有一套完美的基于规则的专家系统,那么也许你可以预测出不同子代的存活概率,决定你的胜负。还有一个是如果你来设计一个类机器人,由不同的多面体构成,每个多面体具有不同的运动方式,其目标是让其运动最快/跳的最高/战斗力最强,那么在这过程中,你会看到衍生出了各种奇形怪状和奇怪姿势的机器人,但如果你的算法足够好,时间足够长,那么你能得到较完美的形态。

最后思考,具体应用中的遗传算法令人惊叹之处应该归功于编程者的心灵手巧,还是算法价值本身?其实真正的贡献在于空间的丰富性和编程者的聪明才智,而不在于遗传算法本身有多好

 

------Lec 14. 学*:稀疏空间、音韵学------2018.09.07------

这一讲继续讲机器学*方面的内容,首先介绍了音韵学方面的基础知识,讲到了音素、区别性特征等概念[0:00:00]。

之后,教授引出了Yip-Sussman机器的概念,并通过一个课堂演示讲解了它在音韵学方面的用途[0:14:00]。

最后,教授介绍了稀疏空间的概念,并总结出了好的AI算法应该满足哪些要素[0:37:15]。

 

前面的课程中,介绍了机器学*的一些基本方法(最*邻,识别树等),然后又介绍了一些生物学算法(神经网络,遗传学等),但其实教授并不是很推荐这些算法,因为运用这些算法,就像绑了腿的狗在走路,可能需要很多巧妙的训练才行。这节课开始,将会聚焦于问题(Problem),而不是机制(Mechanism),之后再回归到理论本身。

先来看一个问题,horse的复数是什么?horses['hɔ:sɪz];dog的呢?dogs[dɔgz];cat呢?cats[kæts]。虽然末尾都加了s,但是发音方式却不同,但是你却不必特别去记,却总能发对音。该怎么解释呢?机器又是如何学*这些规则的呢?

两位工程师Yip和Sussman求教于Morris Halle,后者设计了区别性特征理论(Distinctive Features):假设有一个人/物,说了一小段话(其实就是从嘴里发出了一段声波),进入收听者的耳朵里,并进行处理,生成一个区别性特征向量的序列(Sequence of Distinctive Feature Vectors)。它是一个二进制变量,例如根据发音时声带是否振动置某个标志位为0/1。根据最初的理论,大约有14个这样的区别性特征,能够决定一个音是什么(所以理论上一门语言可以有214个音)。这个序列经过处理后,可以产生意思(Meaning),而这些处理会反馈到区别性特征向量的生成中。(顺便说一下,视觉对于发音有一定的干扰/辅助作用,就像学外语的人,如果想要纯正,最好是观察Native Speaker的口型)。根据这个理论,如果发声的是个木偶,只是含有5块嘴部肌肉,那么可以通过控制这些肌肉发出区别性特征向量的组合序列,从而被人类所识别。举个简单的例子:Apples的四个音标['æ p l z],考察音节性(Syllabic,能否形成音节的核心),那么向量为[1 0 0 0],考察有声性(Voiced),向量为[1 0 1 1],依次类推,得到一个向量序列,或者说矩阵。

如此,我们便可以设计一个机器,来解释词汇和声音,从而生成语言的声音。这个机器有个神秘的装置能够察觉外部的世界(例如看到外部有两个苹果),有寄存器能够存储一些概念(名词/动词/复数等),有词汇库存储各种词汇(苹果,香蕉等等),有一系列的约束条件(如复数约束等,也称为传播器),还有一个能发出声音的缓冲器装置,这些装置之间彼此按一定的组织联结。那么这个机器如何运作?1. 视觉系统生成两个苹果的概念;2.1. 信息流入词汇库获取到单词“apple”;2.2. 信息流入寄存器获取到概念“复数”;3.1. 信息从词汇库流入寄存器得到“名词”“复数”,而不是“动词”;3.2. 信息从词汇库流入缓冲器[æ p l];3.3. 信息从寄存器流入约束条件,激活复数约束;4. 缓冲器中的缓存向前移动;5. 缓冲器向约束条件发送当前缓存;6. 复数约束判断最后一个字母是l,在缓存后端加上z;最后缓存被输出成声波,也就是“讲话”。而这一切也都是可逆的,如果你听到“Apples”,那么你的视觉系统就能想象出多个苹果的场景。这就是人类设想的一种能使用学*到的音韵学规则的Yip-Sussman机器。

问题是,机器如何学*这些规则?我们当然可以“告诉”机器具体的规则,但如果想要机器自己学*掌握呢?回到一开始的问题,我们采用区别性特征理论去分析cats和dogs,可以分别得到两个14x4的矩阵(14个区别特征,4个音),最后一列是我们希望得到的s/z,那么考虑前面的14x3矩阵究竟有何不同?或者说究竟什么样的矩阵后面应该接s,什么样的后面接z?或者换一种思路,对于这个14x3的矩阵,其中哪些值无关紧要,即便去掉它们,也不影响我们区分后面接s还是z?一个算法如下:1. 收集正例和反例;2. 选择一个正例(称为种子Seed),如cats;3. 开始推广(Generalize),即选择矩阵中的一些音素,不再考虑它们;4. 逐步推广,直到我们忽略了太多的音素,而导致反例也被当成正例处理,那么就退出;当中还有个问题,应该选择什么音素不考虑?随机挑选并不可取,从经验上来说,越后面的列应该重要性越高,所以应该从第一列优先挑选。这样,经过足够的学*,在14x3的矩阵里,机器滤除掉了大部分音素,学*到了只有最后一个音是无声且不是咝音时,复数化结尾发s音。考察其工作原理,我们发现其实是对空间进行束搜索

为什么这个算法能奏效?Yip认为它能奏效的原因在于这是一个稀疏空间(容我回去翻翻研究生的《矩阵论》教材o(╯□╰)o),对于高维稀疏空间,很容易将一个超平面放到空间中,将一组例子和另一组例子区分开来。有些抽象哈!举个简单例子,两个白色的点在三维空间中的坐标是(0,0,0)(1,0,0),两个紫色的点在三维空间中的坐标是(0,1,1)(1,1,1),如果投影在一维空间x中,两个白色(0)(1)和两个紫色(0)(1)无法区分;投影在二维空间中,可以很容易区分白色(0,0)(1,0)和紫色(0,1)(1,1),只需选择y=1/2即可;那么在三维空间中,则有更多的二维平面能划分两组颜色,如(1/2,w,w)(w,1/2,w)(1/2,1/2,w),w表示无需考虑;这种高维稀疏空间的特性让事物具有可学*性。换一种解释是,在14维的高维空间中,类似英语语种的40个音随机分散在整个空间中,那么它们的大致距离将会相似,确保了音素在说话时很容易被区分。

那么,本节课的这个例子对我们有什么启发?以Marr的问答法catechism来回答,当处理AI问题时,首先你需要明确问题(Problem);下一步是设计一种表示方法(Representation);之后确定一个处理方式(Approach),可以是一个思路,也可以是一个方法;再之后选择一个机制(Mechanism),或设计一个算法(Algorithm);然后进行实验(Experiment);当然,不一定是线性向下的,中间可能会有很多回路。科学研究就是如此,从问题开始,以实验结束。Yip和Sussman的工作正是马尔问答法在AI领域中实践的典范。不过许多搞AI的人喜欢抓住机制不放,套用到所有问题上,这是不合适的做法,正如你不会想用某种神经网络来处理所有人工智能问题。

最后还有几个问题:什么是优良的表示方法?特征一是要明确(Explicit)表示正确的东西,也就是例子中的区别性特征;特征二是能否让约束条件暴露(Expose)出来,才能方便更好的建模;特征三是局部性标准(Localness),让我们能从局部的范围看到正确答案;这些common sense会让你变得更优秀!

 

------Lec 15. 学*:相*差错、妥适条件------2018.09.09------

这一讲继续讲机器学*方面的内容。

首先介绍了一次性学*(one-shot learning)的概念,讲解如何通过相*差错(near miss)从每一对例子中学到确切的知识[0:00:00]。

之后,教授将这方面人的学*同机器学*进行了详细对比[0:14:30]。

最后,教授通过一次性学*的概念,总结出了一个好的概念应当满足哪些特性才更容易出名[0:37:30]。

 

前方高能!!!这堂课将是整学期中最重要的一课!(第二重要的是告诉我们睡眠很重要的那课)

想知道如何让自己变得更聪明吗?如何将自己的想法包装,成为最受青睐的人?这节课不容错过!

不过为了引申出这方面的内容,我们先来看一下如何从每一次的例子中学到确切的知识。在例子1中,有个初始模型(Initial Model),有两根立柱上面放着一块平板的物体,类似于π,我们可以把它称作“拱形”;如果我们把平板从立柱上拿下来,放到桌面上,那么它就不能被称为“拱形”了,尽管它拥有的元素同初始模型一样,但少了支撑关系,我们把它称作相*差错(Near Miss)。所以我们可以得到结论:支撑关系非常重要,必须有支撑关系,否则不能称为拱形。这就是进化后的模型,加入了一些重要的约束条件,这种启发式叫做要求链启发式(Require Link Heuristic)。这也是从一个例子中学到确切的知识的体现。再来考察一个例子2,如果物体下面两个立柱紧靠在一起,类似T,或者可以说多了接触关系,那么它也不再是拱形,这也是一个相*差错。把这个差错同进化后的模型比较,得到一个新模型,包含了支撑关系,但不能有接触关系,这种启发式叫做禁止链启发式(Forbid Link Heuristic)。在例子3中,同初始模型一样,唯一不同的是顶部平板被刷成了红色,那么它仍然是一个拱形。于是我们可以再次进化模型(注意到这里不是相*差错,而是扩展了一个例子),包括有支撑关系,不能有接触关系,顶部平板必须是白色或红色,这称为集合扩展启发式(Extend Set Heuristic)。那么假设你试过了所有颜色,都不影响它成为拱形,那么我们就可以修改模型的一个条件为顶部平板颜色属于全体颜色集合,这称为丢链启发式(Drop Link Heuristic)。或者我们把顶部换成一个三角体,向上拓展可以是积木,可以是玩具,或任何物体,这称为爬树启发式(Climb Tree Heuristic)。依次类推。

上面这种方法适合存储和计算容量有限的物种进行学*。而对于计算机来说,它可以有更批量的方式。例如如何让计算机区分两组不同的物体。假设你有一组正案例,一组反案例,那么从正案例中选一个种子,对于它的精确描述几乎只有它本身能够符合,然后我们逐渐利用启发式放宽描述(就像上例中一样),形成新的描述,让更多的正案例能够被涵盖;但如果你放宽的同时又包含了反案例,那么可以利用启发式缩小描述,排除反案例。只是如果你的启发式很多,那么形成的树就会很大,可以尝试用束搜索来减小计算量。与上节课的方法不同的是,这里除了推广(Generalization),还用了限制(Specialization)例子总对应推广,相*差错总对应限制。

接下来我们就来看看如何让学生变得更聪明!假设有一个老师,和一个学生,彼此之间的相互作用,目的是将知识的初始状态(Initial Stae)转化为新状态(New State),让学生变得更聪明,并利用这些新知识,来做(Use)以前做不了的事。老师有一种风格(Style),学生有一个学*器(Learner),和一个使用器(User)。如果要发生学*,那么一方需要对另一方有所了解。例如老师最好能知道学生的初始状态,如果学生犯的错误是曾经学*过的,那么老师就会知道他只是忘记或疏忽了;如果犯的错误远超于学生的知识网络,那么老师会提醒他不用着急,以后会学到的;如果犯的错误刚好在知识网络的边界,那么这就是应该学*的时候了!又例如如果老师了解学生的学*器(学*能力/计算容量),那么老师就可以采取不同的方式传授知识。再如如果老师了解学生的使用器的计算容量,就能知道在运用知识方面存在什么问题。反过来也是一样,如果学生能了解老师的一些信息,比如建立起信任,相信老师传授的知识是正确的,或者理解老师的授课风格,看看是不是和自己比较匹配。

对于机器来说,想要学*任何东西,每一步中,需要建立描述,没有描述,就不能区分差异,所以人类的学*也是一样。自我解释,自我对话,就是建立描述的过程,让我们能够学*。例如在解物理题中,你会对自己说让我先画一下受力分析图,或者对自己说这里应该要运用F=ma公式,等等。这其实就是在自我学*以及运用的过程,数据显示,解题成绩好的学生自我解释的次数远超过成绩差的学生,而当鼓励学*进行自我对话后,成绩也会得到显著的进步。(当然,不是天天自言自语,o(╯□╰)o,而是通过这种方式不断学*和升级)。

最后来看看如何将思想包装起来,以获得更大的影响力,或者说如何出名:

1. 符号(Symbol)。成果应当有某种符号(Symbol)来表示,方便人们从视觉上记住你的思想,就像拱形学*(Arch Learning)中的π;
2. 口号(Slogan)。方便人们口头使用,例如相*差错
3. 惊喜(Surprise)。相比于神经网络利用成千上万的例子,这里的惊喜就在于机器能从每个例子中学到确切的知识,也称为一次性学*(One-Shot Learning)
4. 突出(Salient)。一项成果想要出名,肯定要有非常突出的东西。多种的好并不意味着突出,如果人们不能一想到某种思想,就想到你,那么其实它并不突出。例子中的突出就是一次性学*可以通过相*差错的使用实现。
5. 故事(Story)。人们喜欢听人讲故事,所以大家喜欢用故事包装事情。整个教育本质上都是关于讲故事和故事理解的。

如果你希望自己的思想能够获得风投,想要获得学术职位,想要出版自己的图书,想要推销出商品,不妨问问有没有以上这些品质。你的思想就像你的小孩,你希望它们过得最好,如果不能包装好,它们肯定过不好。所以哪怕你觉得搞研究的人不应老想着出名,但是你肯定忍受不了被忽略,特别是自己的好东西。

 

------Lec 16. 学*:支持向量机------2018.09.13------

 这一讲继续讲机器学*方面的内容,焦点是支持向量机。

教授首先介绍了如何通过一条最宽的街道将两类样本点分开[0:00:00]。

之后,教授详细给出了支持向量机概念中涉及到的数学推导,并由此得到了一个非常妙的结论[0:15:10]。

最后,教授演示了一个demo,并讲解了核函数的概念和应用[0:38:50]。

 

这节课回到决策边界的问题,假设你有一个空间,包含正案例和负案例,那么如何将二者区分?之前的课程中我们学到了很多方法,最*邻,识别树,神经网络等等,在很多人都认为不太可能有什么新的技巧突破时,Vladimir Vapnik提出了一种新的思路:正负案例的区分应该由一条直线完成,一种显而易见的想法是这条直线在正案例和反案例的“正中间”,使得不会偏向任何一方,那具体应该怎么确定哪里是正中间呢?如果我们能做一条最宽的“街道”将正反例区分开来,那么这条街道的中间线就是我们要确定的直线!

有了这个思想,该怎么制定决策规则来区分正反例呢?(以下推导略微复杂繁琐,不感兴趣可跳过直接看结论)假设有一个向量ω,垂直于分隔中线,长度任意。对于空间中任意一个未知样本,我们希望知道它是在街道的左边还是右边,为此,我们将其对应向量υ投影到垂直于中线的方向上,即作点乘ω·υ,投影值越大,那么越可能在街道的右侧,我们假定这个值为常数c,那么如果ω·υ ≥ c(或者说 ω·υ + b ≥ 0,其中b = -c),我们说这个样本在街道右侧(即正例),这就是我们说的决策规则。问题在于,这个规则中的向量ω和常数b该如何确定?已知的条件就是ω垂直于中线,但长度不确定。换句话说,我们没有足够的约束条件来限定这两个未知数。因此我们试着添加一些约束条件,例如,既然①式必须≥0,我们则进一步要求其≥1(类似的对于反案例,要求≤-1),即强化后的决策规则为 ω·x+ + b ≥ 1;ω·x- + b ≤ -1为了数学计算便利,我们引入变量yi,使得对于任意正案例yi等于1,对于任意反案例,yi等于-1。上式左右两边同时乘上yi,那么yi(ω·x+ + b) ≥ 1;yi(ω·x- + b) ≥ 1,并且对于边缘处的样本i yi(ω·xi + b)  - 1 = 0。既然我们的目标是要让这条街道尽可能的宽,那么我们就来求这个街道宽,对于街道边缘的负案例x-和正案例x+,二者之间的向量差为x+-x-,当他投影到单位向量ω/|ω|上,就是街道的距离,即(x+-x-)·ω/|ω|。由②式的约束我们可知,对于正案例x+·ω = 1 - b,对于负案例x-·ω = 1 + b,因此街道的宽可以化简为2/|ω|。这样一来,我们的目标就是求|ω|的最小值(或者 1/2||ω||2的最小值),带约束条件的函数极值。运用拉格朗日乘数法(好吧,我没学过),即转化为求L = 1/2||ω||2 - ∑αi[yi(ω·xi + b) - 1]的极值,怎么做?对ω求导,得ω -  ∑αiyi·xi = 0,什么意思?就是向量ω是某些样本的线性和。同样,对b求导得∑αi·yi = 0。将这两个式子带回L中,最后得到 L = ∑αi -1/2∑ijαiαjyiyj(xi·xj) ,这意味着求极值的式子只依赖于样本对之间的点积!回到决策规则,ω用前面的表达式代替,那么如果⑤ ∑αiyixi·υ + b  ≥ 0,则为正例,可以看出决策规则也只依赖于样本向量和未知向量的点积

那如果是线性不可分的样本空间呢?那么可以变换到另一个空间,之前提到的点积也变成转换后空间向量的点积,也就是求核函数的极值。常见的核函数有:1. 线性核(u·υ + 1)n;2. e(-||xi-xj||/σ);等等。

以上就是支持向量机的思想。

 

------Lec 17. 学*:boosting算法------2018.09.14------

这一讲继续讲机器学*方面的内容,着重讲解boosting(提升)算法。

这一讲首先总结了之前的各种学*算法,引入了分类器的概念,并讲解了如何从弱分类器得到强分类器[0:00:00]。

之后,教授讲到了各种改进,来得到boosting算法[0:11:50]。

最后,教授讲解了如何使用一些计算技巧,获得简单美妙的结果,告诉学生在考试中碰到相关问题应该怎么算[0:35:30]。

 

对于二分类问题,假设我们有一个分类器h,分类输出为[-1,+1],其误差率e在0到1之间,如果值接*一半,则称为弱分类器(Weak Classifier),我们希望得到强分类器(Strong Classifier),即误差率接*0。那么能否通过“合并”多个弱分类器来实现?即H(x) = sign(h1(x) + h2(x) + h3(x)),如果两个分类器输出为+1,一个为-1,那么我们认为它最后为+1。这个合并分类器真的会比单个更优吗?如果在样本空间中,三个分类器的错误空间彼此独立,那么我们可以说H(x)永远给出正确的分类(因为每个地方至少有两个分类器是正确的)!但如果它们的错误空间有相交呢?可以作为课后思考下。

那么怎么实现呢?可以考虑以下几点:① 首先使用数据不经任何干扰地生成h1,然后使用夸大h1误差的数据(扭曲的样本子类的)生成h2,然后使用h1不同于h2结果的样本生成h3,依次类推;② 建立这样的树结构,即踊跃投票(Get Out the Vote)思想,让许多单独的测试参与其中;③ 对于单个测试,都是一个分类器,可以考虑决策树桩(Decision Tree Stump),其测试数量取决于样本的个数和空间的维度。对于这样的测试,误差为e=出错样本的数量/总数量。不过我们在某一阶段希望夸大某些误差的效果,即每个样本点都对应有一个权重ωi,第一步时均为1/N,且∑ωi=1,那么当前误差e=出错样本的数量·ωi。④ 另外,对于合并我们可以有一些改进,例如为每个子分类器添加权重H(x) = sign(α1h1(x) + α2h2(x) + α3h3(x))。⑤ 怎么结合这些思想转换成算法呢?1. 令ωi1=1/N;2. 选择一个分类器ht,最小化时刻t的误差,使用误差率来确定α;3. 计算t+1时刻的ωt+1;然后回到步骤2,进行循环,直到这个分类器对所有样本数据生成完美的结论集。⑥ 此外,假设ωit+1 = ωit/z·e^(-αtht(x)y(x)),其中z是归一化因子,y(x)同上一课类似,取决于结果而定义为+1或-1,为了数学计算的方便。那么我们的目标是什么?就是最小化误差!对于上面误差的式子,当αt = 1/2·ln(1-et)/et,et是t时刻的误差,我们可以得到最小误差边界。

思想上容易理解,具体实现上挺难理解的o(╯□╰)o,而且这些公式也挺复杂的,虽然也许计算机可以胜任,教授推导了一些计算过程,得到1. 取所有权重,对应之前测试中得到正确答案的那些,这些权重加起来,在下一代权重中,只需要将它们缩放1/2即可,即权重之和是之前权重之和的缩放版本;2. 实际要处理的测试数并没有那么多;3. 对于过拟合这个方法能很有效的避免。

学好人工智能,数学很重要!

 

------Lec 18. 表示:分类、轨迹、过渡------2018.09.23------

这一讲首先简介了人类的进化历程,强调象征性思维能力是让人类不同于其它生物的关键[0:00:00]。

随后,教授介绍了内语言和语义网络的概念[0:09:00]。

之后,教授详细介绍了内语言中非常重要的三大元素:分类、轨迹和过渡框架[0:14:30]。

最后教授强调了故事讲解和理解的重要性,并告诉大家如何讲故事[0:39:25]。

 

之前的课程中,我们已经提到“人类独有的一种能力,是能将两种概念合并为第三种概念,同时又不破坏原有的两种概念,并且没有限制。”而讲故事和理解故事正是将我们同其它灵长类区分开的本质差异。所以,语言很重要!这节课我们就来看看内语言和语义网络的概念。

一个简单的语义网络例子:假设有一个对象,由另外两个对象支持,构成支持关系,这样就有了网络,节点,链接,和一些意义。另一个例子如:M谋杀D,导致M杀了D,那么D就拥有了属性Death。连接节点的链接就称为连接器(Combinators),另外还有链接之间形成联系的机会,例如Kill导致Death,这就相当于将链接本身看作对象,让它成为其它链接的主体或客体,这个过程称为具体化(Reification)。马文·闵斯基据此提出了一种概念:我们需要一种局部化过程,如框架(Frame)或模板,例如谋杀动作的框架是一个动作主体,一个受害者,这就添加了一个局部化层(Localization Layer)。另外提一下,在这个问题上有寄生语义(Parasitic Semantics)的问题,例如M谋杀D,也许是因为M想获得什么利益,那么这个意义是我们的理解,而不是机器的理解,这个意义就是寄生的。

我们想要使用语义网络,那么我们要问内语言的哪些元素非常有用?第一个是分类(Classification)的概念,例如斯坦威钢琴属于钢琴,钢琴属于乐器,,即Specific到Basic到General,有了分类就可以将事物组织成一定的层次结构。有了层次结构中的元素,该如何谈论它们呢?想象一辆车撞到了墙上,考虑汽车的速度,离墙的距离,汽车的状况,在撞前/撞时/撞后的状态变化,就可以得到状态变化的词汇表,如增大/减小、改变、出现/消失,这就引出了第二个概念:过渡(Transition),任何意图理解故事的系统,都会强调这个概念。第三个概念是轨迹(Trajectory)或角色框架,一个对象如何(在他人的帮助下)从一个地方运动到另一个地方(影响别人)。有了这些东西后,就可以想办法把它们整合起来。

举个例子:根据Pat Comforted Chris这句话,可以构建一个角色框架:主体-Pat,动作-?,客体-Chris,结果-过渡框架。其中的过渡框架为:对象-Chris,心情-变好。如果修改Comforted为Terrified呢?那么Action仍然不清楚,但心情会变差。如果进一步让场景更清晰,我们修改Comforted为Kissed,那么角色框架中就多了一个想象(Hallucination),它也是一个框架-轨迹框架,运动的物体是Pat的嘴唇,目的地是Chris的嘴唇,我们大脑中的图库帮助我们构建了一个场景,最后的结果也是心情变好。如果修改Comforted为Stabbed,那么在结果的过渡框架中,除了心情变差,健康也下降了,在轨迹框架中,运动物体是Pat的刀,目的地变成了Chris的身体。这就是故事序列(Store Sequence),串起了以上这些东西。另外还值得讨论的是故事库(Story Libraries),例如故事框架下,有灾难框架,派对框架等,灾难框架又可以分为飓风框架和地震框架等,派对框架也可以分为生日派对框架和婚礼派对框架等等。

最后关于讲故事:如果你想要讲故事,想要让人很快的听懂,就要确保不增加句法难度,为读者增加额为理解负担。有三大法则:

1. Don't Use Pronouns. 
2. Don't Use Former or Latter.
3. Don't Call a Shovel a Spade.

 

------Lec 19. 架构:GPS、SOAR、包容架构、心智社会------2018.09.24------

这一讲介绍了人工智能方面的一些通用架构:

第一部分讲解了通用问题求解器(GPS)[0:00:00];

第二部分讲解了SOAR架构(状态算子与结果架构)[0:09:24];

第三部分详细讲解了马文·闵斯基的情绪机器(emotion machine)[0:16:16];

第四部分向详细讲解了包容架构(subsumption architecture),这也是当今主流吸尘器机器人伦巴所使用的架构[0:22:26];

最后,教授讲解了自己现在正在开发的Genesis架构[0:34:00]。

 

通用问题求解器(General Problem Solver,GPS)概念很简单:从当前状态C希望到达目标状态S,那么测量二者之间的象征性差异d,可以让你选择某种操作算子o,使得C到达中间状态I,继续观察I和S中间的差异d2,并选择某个算子o2,用于进一步减少差异,依此继续。这也称为手段目的分析(Means Ends Analysis)。举个例子,放暑假了,你想要从学校回老家,测量二者的直线距离d1,我们发现正确的算子应该是搭乘飞机,但是想要搭乘飞机,就得先去机场(由d2决定),还得先走路去公交站(由d3决定),然后坐公交去机场。非常直觉!但想要使用这个框架,需要做的是鉴别可能碰到的差异,和可能用到的算子,并建立一张表格将二者关联起来,于是一种改进型架构SOAR被提出来。

SOAR(State Operator and Result)包含多个部分:一个长时记忆(包含断言和规则),一个短时记忆,以及同外部世界联系的系统(如视觉系统和动作系统)。同时它有一个精密的偏好系统(规则的优先与取舍),以及问题空间的思想(想要解决一个问题,需要发展出一个空间,并在空间中搜索求解)。此外,SOAR还有普遍性此目标建立的思想,即无法确定下一步该怎么做时,将问题单列出来考虑它的问题空间。

通用问题求解器架构聚焦于的思想是问题求解假设(Problem Solving Hypothesis,一切都是关于问题求解的),SOAR架构聚焦的思想则是象征性系统假设(Symbol System Hypothesis)。这两种架构都严重偏重于考虑问题求解,而马文·闵斯基的架构(情绪机器,Emotion Machine)则关心分层的问题求解。例如,阅读一小段文字时,需要用到底层本能反应(听到声音,转过头),学*反应(看到飞驰而来的车决定是否要过马路),有意思考(决定冲过马路,包括SOAR/GPS),反思性思考(回想自己冲动的决定),自我反思(是否会迟到接下来的计划),自我意识思考(朋友们会怎么看他),这些层次促进了常识的建立,因此这个架构也可以说是基于常识假设(Based on Common Sense Hypothesis)。

包容架构(Subsumption Architecture),由Rod Brooks提出,不同于以往的机器人设计(封装的视觉/推理/东西系统),其在最底层有一个系统能够避免物体,上一层是漫游,再上一层是探索,再上是寻找,等等,每一层都有自己的视觉/推理/动作系统。所以该架构没有表示(No Representation),这样也就没有了模型和有预测/理解/解释/控制,所以在这个架构中使用世界(World)而不是模型,什么意思?就是你只需要对世界作出反应,而不需要存储一张地图来避免撞到物体。另外,在其最纯粹的形式中,机制仅仅是有限状态机。这也是扫地机器人使用的架构,它包含了马文·闵斯基架构中的本能反应和学*反应。

Genesis架构的工作方式如下:它专注于语言,包含两个角色,一是指导和统御感知系统并与之互动,二是让事件描述成为可能。这就是课程一开始提到的案例中的那样,想象提着一桶满水在街上跑,结果会怎样(打湿裤管和鞋)?为什么使用台锯时不要带手套(避免被牵扯卷入)?有了描述事件的能力,就可以发展出讲故事和理解故事的能力,然后就能从宏观和微观上驾驭文化。因此,该架构聚焦的思想是强故事假设(Strong Store Hypothesis)。

最后,通过一个实验,引申出本课的两个要义:

1. 如果想让自己变得更聪明,那么需要做:Look-Listen-Draw-Talk,这些机制围绕着人类思维的中心。这也是上课做笔记的用处。

2. Beware of Fast Talkers,因为它会阻碍你的语言处理器,令你无自主思考。 

 

------Lec 20. 概率推理I------2018.09.24------

这一讲主要是一些概率相关的必要知识。

首先教授通过一个例子引出了考虑概率问题的重要性,引入了联合概率表的概念,并进行了相关演示[0:00:00]。

第二部分,教授讲解了一些基本的概率公理和定义[0:18:30]。

最后,教授引出了信念网络这一概念,并将之前所讲的概率知识用于这一重要领域[0:36:30]。

 

联合概率表通过确定每个条件因子不同情况下的事件发生的概率能够提供非常有用的概率信息,但是真正在应用中,这个表可能会很大,或者没有足够多的时间去获得大量的数据,我们需要专门的处理方法。

1. 基础概率(Basic Probability):① 0≤P(a)≤1;② P(T)=1;P(F)=0;③ P(a)+P(b)-P(a,b)=P(aUb);

2. 条件概率(Conditional Probability):① P(a|b)=P(a,b)/P(b);② P(a,b,c)=P(a|b,c)P(b,c)=P(a|b,c)P(b|c)P(c);

3. 链式法则(Chain Rule):P(x1,...,xn)=∏P(xi | xi-1,...xi);

4. 独立(Independence):P(a|b)=P(a),则a与b独立;

5. 条件独立(Conditional Independence):P(a|b,z)=P(a|z),则a与b在z下条件独立;=> P(a b|c)=P(a|c)P(b|c);

信念网络(Belief Nets):给定父节点的情况下,每个节点独立于其他非衍生节点。举个例子:盗贼P出现狗D可能会叫,浣熊R出现狗D也可能会叫,狗D叫得足够大声了主人可能会报警P,此外浣熊R出现可能会打翻垃圾桶T,在这种情况下,报警与否只与父节点狗叫有概率关系,与盗贼出现,浣熊出现,垃圾桶打翻均独立。具体的计算中,假设P(B)=0.1,P(R)=0.5,B和R均不出现情况下P(D)=0.1,B出现R不出现时P(D)=1,B不出现R出现时P(D)=0.5,B和R均出现的情况下P(D)=1。同样的,D的情况下P(P)=0.1,D不发生的情况下P(P)=0.01。类似的,R出现,P(T)=0.1,R不出现,P(T)=0.001。可以看出,需要确定10个概率值,相比联合概率表中需要确定的25=32,个数明显减少。而通过这些值,也能算出整个联合概率表,利用的就是上面提到的链式法则和条件独立等,P(P,D,B,T,R) = P(P|D B T R)P(D|B T R)P(B|T R)P(T|R)P(R) = P(P|D)P(D|B)P(B)P(T|R)P(R)。

 

------Lec 21. 概率推理II------2018.09.25------

这一讲首先详细讲解了上一节已经提到过的贝叶斯概率方面的知识,考虑如何从一系列条件概率的乘积算出整张联合概率表[0:00:00]。

然后,教授介绍了如何根据结果来反推哪类模型更有可能正确(例如有两个硬币,抛得正反的概率不同,如何通过实际抛掷试验,求更有可能是哪个硬币)[0:18:15]。

最后,教授介绍了结构发现方面的内容[0:42:50]

 

回忆上一节课最后利用链式法则计算整个联合概率表,在那个计算方法中,我们没有特别约定P,D,B,T,R的变量顺序,不过根据信念网络的概念,我们应该优先考虑任何变量都处于自身非衍生节点的情况,每次都从底部开始向上取是合理的做法。另外,如果模型是正确的,观察足够多的次数,那么计算出来的概率就会很准确。

那么如何根据结果来反推哪类模型更有可能正确?这就要用到贝叶斯概率知识。我们知道P(a|b)P(b)=P(a,b)=P(b|a)P(a),那么P(a|b)=P(b|a)P(a)/P(b),这有什么用?举个例子,如果b是证据E,a是感兴趣的分类C,那么我知道该类的先验概率初始概率,那么就能得到在b证据下分类为a的概率,因为P(b)对任何分类都是相同的。推广到证据很多的情况:

P(ci|e) = P(e1,...,en|ci)P(ci)/d = P(e1|ci)P(e2|ci)...P(en|ci)P(ci)/d

举个例子:假设有两枚不同的硬币,一真一假,假的硬币每次抛掷得到正面的概率不是0.5,而是0.8。那么,当我随便拿起一个,抛出第一次得到正面,第二次得到反面,请问它是真的还是假的硬币?这就是通过结果去反推属于哪类模型。朴素贝叶斯分类(Navie Bayesian Classification)以及拓展后的贝叶斯网络(Bayesian Net)能够解决很多类似于医疗诊断,材料缺陷等等从证据往回推模型的问题。

All this probabilistic calculation is the right thing to do when you don't know anything,and you often don't konw anything!

 

------Lec 22. 模型融合、跨通道偶合、课程总结------2018.09.25------

这一讲是MIT人工智能课程的最后一节课,教授首先继续上一讲讲完了主干内容,包括模型融合、跨通道偶合[0:00:00]。

之后,教授对课程进行了一些回顾,并讲到了期末考的相关事项[0:12:30]。

再后,教授展望了未来,告诉感兴趣的同学,后面还有哪些课程值得学*[0:20:30]。

最后,教授演示了他的团队正在开发的Genesis系统,并在此基础上进行了总结[0:29:40]。

 

模型融合就是将多个模型中相似的东西提取出来,融合成一个统一的模型,而跨通道偶合就是使用多个通道以及它们之间的对应关系来分析整理这些产生贡献的通道。举个例子,当你发出a的音,你可以将这个声音进行傅里叶变化得到频谱,同时你的嘴会有特定的嘴型,这可以看做两个不同的通道,那么如何将发声的口型和声音本身联系到一起?假设你有一堆声音的数据,一堆嘴型的数据,那么如何将二者关联,互相标记,带有对应意义?

人工智能并不是代替人来创造新财富和获得新能力,而是通过人类和计算机的协作,双方做自己最擅长的,机器不会取代人。随着云计算的发展,人们关心如何从网上得到数以千亿的信息并使用它们,但反过来,需要多少的知识就能理解故事也是很值得思考的问题。

关于方法的要点,涉及如何搞人工智能,如下:

  • Define or describe a competence
  • Select or invent a representation
  • Understand constraints and regularities
  • Select methods
  • Implement and experiment

许多专家太拘泥于机制,更好的做法是从问题着眼,科学方法,考虑问题,然后使用正确的机制来处理问题。

学完这门课程,还有什么可以继续学*的课程?可以选择马文·闵斯基的心智社会,还有Berwick的语言理解课程,及关于进化的课程。Jerry Sussman的一门课讲大规模象征性系统。以及本课教授开的人工智能创业,还有一个关于如何演讲的讲座(非常值得一听)。

最后关于教授团队的Genesis以及正在做的事情,感兴趣的可以去网站上关注下。以及关于MIT,关于读研,关于AI的要点和未来,我都建议有空看看视频课程(其实最好是所有的课程都看,毕竟,课堂上学*到的不仅是AI方面的知识),留给大家两个问题:

Are people too smart?

Are people smart enough?

posted @ 2018-08-07 23:16  KPlayer  阅读(6292)  评论(4编辑  收藏  举报