3.0 前言
首先来学习2003年以前的主流与经典,用符号构建的人工智能。
下下一章会来介绍2003年以前的非主流,而现在已经变为主流的,03年当时,本书还叫做“反应式Agent”的,用层次构建的Agent。除此以外,还有另外一种方法,不完全是符号推理,下一章会完成这个任务。
回到正题,举个例子,搞个扫地机器人。
摄像头传进来信息后,全转换成逻辑的语句,比如图中,机器人看到门,像素传到知识库表示,再到产生决策"Stop!",再到动作"Brake!",然后小滚轮就停了。
构造这个机器人,有俩问题要解决:
- 转换问题 传感器信号转换成符号。就是图中Interp到知识库那里。
- 表示和推理问题 转换出来的符号继续推理,决策出行动。就是图中知识库到Plan再到Action。
第一个,有关的工作有视觉、语音理解、学习;第二个问题,有关问题是知识表示、自动推理、自动规划等。
另提一句,03年这本书的作者说,这两个问题“都还没有解决”,“甚至是一些普通的问题,如常识推理,都是很困难的问题”。
但作者同时说了,这些问题很有帮助,“想法仍然很有吸引力”,因为假设有,就可以解释智能Agent如何决策,如何行动,这就方便优化。
优化的方法之一就是不断细化目标到行为的过程。不过,把Agent作为定理证明器时,没有这种细化哦。它直接当Agent的想法直接可以执行,下面我们就来康康。
3.1 Agent作为定理证明器
慎思型Agent
又叫做慎思型Agent(Genesereth and Nilsson, 1987, chapter. 13)。这种Agent可是很讲逻辑的嗷☝️🤓,比如它的脑壳里,有这种:
第一个,就是相信阀门221是开的。
然后它的脑壳和人也是一样的,也会出错。
比如检查了221是开的,巡检员认为这个是开的。结果因为赶着和我去吃烧烤,没仔细,其实它是关的。Agent也一样,脑壳里记得221是开的,其实是911是开的。还可能设计这个脑壳的人的脑壳也不好,设计的时候就出了问题,导致Agent对开着的阀门的解释和常人也不一样。
建模
下面进入符号的世界:
设L是经典一阶谓词逻辑句子的集合,并且设是L数据库的集合,即L(公式)集合的集合。因此,Agent的脑壳里就是D的元素,D的成员用
,
,……表示。Agent的内部状态,也就是脑壳,可以简单表示成集合D的成员。
Agent的决策过程通过一组演绎规则建模,就是说Agent脑壳知道这些规矩
,这是一些简单的逻辑推理规则。
如果可以从数据库仅只使用演绎规则
证明公式
,则可以写成
。就是说,Agent通过自己的脑壳判断,这个是行得通的。
Agent感知函数还是(为啥叫“还是”?因为之前推导过。感兴趣的朋友可以参考第2章的内容):
next函数:
选动作的:
伪代码:
看懂没,就是说,如果这个动作行得通,就做这个动作;如果没找到行得通的办法,就先找个不会让自己行不通的办法,尝试一下,动一下,静观其变。人往高处走嘛。
这样就根据Agent的演绎规则,就是脑壳里面认的规矩,Agent的“程序”,和当前数据库,也就是Agent脑壳里面的记住的东西,Agent的关于环境的信息,确定了Agent的行为。
举例说明:扫地机器人
这可估计是全网最简单的扫地机器人教程了嗷,只要数学学得好,机器人给你搞搞搞(bushi)
假设有一个机器人Agent打扫房间,机器人装备有脑壳上的眼睛,探测器,可以探测垃圾;还有手,可以吸走垃圾。唉别拟人了,就看那扫地机器人前面的大黑边灯泡和两个扫地轮。啊什么你这边山区的买不起扫地机器人,没见过?不好意思……
咳咳,机器人朝向一个确定的方向(东南西北中的一个),除了吸走垃圾以外,这个Agent可以向前走一步,或者向右转90度。
房间被划分成放个,尺寸大小相同,方便Agent移动。
然后就假设房间3*3,从(0,0)格开始,朝北。图中就是开始工作的Agent和它的工位。
数学表示就是:
Agent可以接受感知dirt(表示Agent下面有垃圾)或者null(没接受到特别的消息)。可以执行3个动作:forward,suck或者turn。
用三种谓词表示环境:
然后给Agent涨涨脑壳。先看它咋更新自己脑壳里面的想法的,换句话就是说怎么设计next函数。
这个Agent要动眼睛观察,然后存到脑壳里面。诶,我们人是一瞬间就反应过来了,Agent它脑壳得反应过来,这不仅是看外界返回的信息(dirt还是null),产生一个新的数据库,还要删掉旧的数据库嗷。
表示旧数据库:
更新函数:
这个更新函数new可以具体写出来的嗷,不抽象的嗷。留作练习嗷,自己写一写嗷。
提示,它必须产生谓词In表示Agent的新的位置,产生谓词Facing表示Agent的方向,产生谓词Dirt表示在新的位置上找到垃圾。
然后是我们的脑壳里的next函数:
然后注意,给了Agent脑壳里面基本该想的,它自己要动脑的。所以,给了演绎规则,它可以推出所有变元实例化的
:
再然后,基本规则是咋样的?
首先,最优先的是有垃圾处理垃圾:
然后是在3*3里面来回巡逻:
缺陷or问题
大功告成了。是不是100%perfect完美呢?不酱紫啦。
脑壳想太慢
这符号表示,还是很麻烦的。机器人算完,可能垃圾都被风吹走了。
用数学的话说就是:
在时间,产生数据库
,并开始用规则
找出可以执行的最好的动作。经过一段时间到达
,得到
,其中
,因此
是Agent在
时刻可以执行的最优动作。但
到
,环境发生了变化,就不能保证
是最优的。
眼睛到脑壳,不好协调啊
别说手眼协调了,就是脑眼协调,都很难。至少成书的时候(2003)作者直言是这样的。
例如,图像到一组表示图像的描述语句之间的转换问题是人工智能领域研究了数十年的问题,现在仍然没有解决。
俩问题碰一块了:动态实时转换决策
动态实时表示,更难了。
3.2 面向Agent的程序设计
说明
面向Agent的程序设计,简称AOP,就是用思维对数据建立数据结构来运行。
第一个面向Agent程序设计风格的语言是Agent0。
用一组能力集、初始信念集、初始承诺集,以及承诺规则集来说明一个Agent。
这四个,关键在于Agent的承诺规则集合。每条承诺规则包含一个消息条件、一个思维状态条件和一个动作。消息和信念都匹配了,才会执行动作。
动作可以是私有动作,也可以是通信动作。通信,发的消息有三种形式:requests(请求)或unrequests(非请求)执行或者制止一个动作,inform(通知)消息用来传递消息,第8章会详细讲。
举例
这条规则的意思是:
如果从Agent收到一条要求在实践time做动作action的消息,并且相信:
- Agent此时是朋友
- 可用做这个动作
- 在时间time,没有对其他动作的承诺
则承诺在时间time做动作action。
Agent的操作可以用下面,如图片的循环来描述:
- 阅读所有当前消息,更新信念,并根据需要更新承诺。
- 在相关动作的能力条件满足的情况下,执行当前循环的所有承诺。
- 回到1。
注意
这不是实际的能构造大型产生式系统那样的语言,只是指出了如何构造这样的系统。
下面讲个能并发的。
3.3 并发MetateM
由Michael Fisher开发的并发MetateM语言是基于逻辑公式的直接执行。它很接近3.1讲的定理证明器了。
并发MetateM系统中的Agent是并发执行的实体,可以通过消息广播互相通信。每一个并发MetateM Agent都有两个主要部分:
- 接口 Agent用来接收信息。
- 计算引攀 Agent自己用来决策采取行动。
接口
一个Agent的接口又由三部分组成:
- Agent的名字(或叫Agent id)。
- Agent可以听的话,可以接收的消息的符号集合,称为环境命题。
- Agent可以说的话,可以发送的消息的符号集合,称为组件命题。
举例
stack是Agent的名字,是Agent可以听的话(环境命题),
是可以说的话(组件命题)。Agent可以听到pop消息,还有push,如果不是这俩就两耳不闻;还可以和别的Agent说poped或者full。
计算引擎
这种语言的Agent是基于MetateM的可执行时序逻辑风格。它直接执行一些关于Agent的说明,这些说明长这样:
为了具体点,不小心就搞了门新语言PML,命题MetateM逻辑,在时间的维度上强化、清楚了经典逻辑命题。具体看表3.1
举例
看下面的:
意思是“将来agents都是重要的”。
意思是“将来某个时刻,Janine将是重要的”。
意思是“直到你道歉以前,我们不是朋友”。
意思是“明天(下一个状态),你道歉”。
计算引擎的执行
执行顺序是这样的:
- 从其他Agent打听到消息,更新状态。
- 把自己做事的规则和这个状态比,就是说把每条规则的过去时间前件与当前的历史相比较寻找哪条规则能被满足,然后开始想事,就是激活规则。
- 执行想的事,还有做的承诺。从能做的、不冲突的所有可能中选择。
- 转到1。
举例
上图给了3个Agent,rp、rc1和rc2。
Agent rp是一个资源提供者,它一次只能向一个Agent提供资源,并且承诺向所有提出请求的Agent提供资源。rp只能接收消息ask1和ask2,并且也只能发出消息give1和give2。
Agent rc1只收give1,并且只发ask1。另外rc1循环发送ask1。
Agent rc2接收ask1和give2,可以发ask2。满足前面没ask2同时rc1搞了ask1(或者拓展后,有其他的Agent发的ask1),那么就发送ask2。
下面是运行片段。
3.4 注释和进一步阅读
关于慎思型Agent
本文出处
Genesereth和Nilsson(1987,第13章) 本文介绍的材料之出处。
“纯”逻辑
Konolige(1986)还讨论了的内容,文中还讨论了“纯”逻辑方法。
(Lesperance等,I996)根据上面兄弟的原理搞出来的ConGolog系统。
不是“纯”的逻辑
Rosenschein和Kaelbling(1996),搞了情景自动机,就是相对于决策时纯搞逻辑,搞了点逻辑说明编译。
其他文献
Wooldridge(1997)逻辑在智能Agent的作用的综述。
(Russell and Subramanian等,1995)理性以及计算理性对人工智能的影响。
关于面向Agent的程序设计语言AOP
本文出处
(Shoham,1990,1993)Agent0的主要参考文献。
意识立场有关
(Huhns and Singh,l998)指出意识立场的作用。
(Jennings,1993a)Agent关于其他Agent意图的信息。
(Newell,1982)与上面有关联,提出了个什么知识表示层。
(Searle,l969;Cohen and Levesque,1990a)后面会提到的高级玩意儿,了解意识立场如信念、愿望等如何用来给出言语行为的语义。
关于MetateM
本文出处
(Fisher,l994)MetateM被Michael FIsher搞出来了。
(Barringer等,I989)MetateM的执行算法。
其他AOP
(Thomas,1993;Thomas,1995)PLACA。
(Haugeneder等,1994)MAL。
(Rao,1996a)AgentSpeak(L)语言。
3.4.1 课堂阅读:Shoham(1993)
介绍AOP的文章,是20世纪90年代Agent领域引用最多的文章之一。
作者指出其中有用的观点:
- “思维状态”对于程序设计是不是真正有用;
- 如何证明或者否定思维状态对系统的程序设计是有用的这一假设;
- Agent0的特点如何结合进像Java这样的程序设计语言中。
习题
1.[2级](下面几个问题参考真空吸尘器世界的例子)
函数new给出了把谓词加入Agent的数据库中的定义,给出函数new的完整定义(如果需要可以使用伪代码)。
2.[2级]
通过给出真空吸尘器世界例子中的默认规则,完成这个例子。你认为解决方案是否直观?是否优美?是否紧凑?
3.[2级]
使用你喜欢的(命令式的)程序设计语言编写一个基本的真空吸尘器世界例子的解决方案。与逻辑解决方案相比,你认为这个解决方案如何?如果把基本的过程知识(即关于执行什么动作的知识)作为纯逻辑规则,这种方法能告诉你什么?
4.[2级]
如果你熟悉Prolog语言,使用这种语言对真空吸尘器世界的例子进行编码并且在随机放置垃圾的情况下运行这个例子。使用Prolog提供的assert和retract元谓词简化所设计的系统(允许程序本身实现函数next的大部分操作)。
5.[2级]
把真空吸尘器世界的规模扩大到10x10个方格的规模。使用上面给出的方法,大致需要多少条规则对这个放大了的例子进行编码?对规则进行一般化处理,实现一个更一般的决策机制。
6.[3级]
假设真空吸尘器世界还存在障碍物,需要Agent避开(设想Agent装有传感器探测障碍物)。修改这个例子,使之可以探测和躲避障碍物。并且对基于逻辑的解决方案与用传统的(命令式的)程序设计语言实现的方案进行比较。
7.[3级]
假设扩大真空吸尘器世界中Aget的感知范围,使之可以看到整个世界,并且可以看到垃圾的准确位置。在这种情况下,有可能产生一个最优决策算法——用最少的时间清理干净垃圾。考虑这样的通用算法,并分别用一阶逻辑和传统的程序设计语言实现。当Agnt接收的感知输入中可能存在噪声时(即感知信息出错的概率不为零),分析这些算法的有效性。设计一个在这种噪声下工作更稳定的决策算法。当Agent的感知能力降低时,该算法的工作情况如何?
8.[2级]
考虑图3.7中的并发MetateM程序,解释Agent在这个系统中的行为。
9.[4级]
以Shoham的Agent0的形式,通过增加对其他Agent的信念和承诺的操作符扩展并发MetateM语言。
10.[4级]
给出Agent0和并发MetateM的形式语义。