第二章:智能Agent
本章讨论Agent的本质,Agent是否完美,环境的多样性,及由此带来的各种Agent分类。
1. Agnet和环境
Agent通过传感器感知环境并通过执行器对所处环境产生影响,不同Agent用的传感器也各不相同。我们用 「感知」 表示任何给定时刻Agent的感知输入,而 「感知序列」 是该Agent所接受的所有输入数据的历史记录,Agent依赖感知序列做出行动,可以说 Agent函数 描述了Agent行为,它将感知序列映射为行动序列。
2. 好的行为:理性的概念
「理性Agent」 是做事正确的Agent。但什么是“正确的”?
如果Agent做出的行动序列能将环境变成渴望的,那这个Agent性能良好。这里的渴望,通过 「性能度量」 表述,它对环境状态的任何给定序列进行评估。显然,没有一成不变的性能度量,具体问题具体分析才是关键。作为一般原则,最好根据实际在环境中希望得到的结果来设计性能度量,而不是根据Agent表现出的行为。
我们这样定义理性Agent:对于每个可能的感知序列,根据已知的感知序列提供的证据和Agent具有的先验知识,理性Agent应该选择能使其性能度量最大化的行动。
理性不等于完美,理性是使期望的性能最大化,而完美是使实际的性能最大化。理性的选择只依赖于已知的感知序列,而观察有助于最大化期望性能,信息收集是理性的重要部分。
理性Agent不仅要收集信息,还需要从这些信息中尽可能多的 「学习」。如果Agent依赖于设计人员的先验知识而不是它自身的感知信息,那它就缺乏自主性。理性Agent应当自主学习,以弥补不完整或不正确的先验知识。但实践中,我们并不要求Agent一开始就完全自主,给它些初始知识以及学习能力是合理的。
3. 环境的性质
有了理性的定义,差不多可以思考如何来构建理性Agent了。不过,首先必须考虑 「任务环境」。我们要规定性能度量、环境以及Agent的执行器和传感器,这些就是任务环境。根据这四个单词的首字母,我们称之为 PEAS 描述。
以自动驾驶汽车为例,首先,我要考虑我们所期望的性能度量是什么?油耗少?用时短?安全性高?其次,这车的行驶环境是什么?公路?乡间小道?雪地?它的执行器一般还是和人工驾驶一样,油门、刹车、发动机那些。但可能还需要一些语言模块与人交流。基本的传感器有哪些?摄像头、红外测距仪、速度表等。
任务环境的范围是很大的,我们可以对它们进行分类,这些维度在很大程度上不但决定了适当的Agent设计,也决定了实现Agent的主要技术群体的实用性。这里的定义是非正式的:
- 完全可观察的与部分可观察的:Agent传感器在任何时间点上都能获取环境的完整状态,那任务环境就是完全可观察的,否则为部分可观察。
- 单Agent与多Agent:这个不多说了。主要注意:AgentA是否要把另一个对象B当作Agent对待,就要看B的行为是否也致力于让AgentA的行为的性能度量值最大化。
- 确定的与随机的:如果环境的下一个状态完全取决于当前状态和Agent执行的动作,那环境就是确定的,否则就是随机的。
- 片段式的与延续式的:在片段式的任务环境中,Agent的经历被分成了一个个独立的原子片段。每个片段都不依赖以前的片段中采取的行动。而延续式环境中,当前决策会影响所有未来的决策。
- 静态的与动态的:顾名思义了,但有种情况是环境不会变,而Agent的性能评价随时间变换,那这样的环境就是 半动态的。
- 离散的与连续的:环境的状态、时间的处理方式以及Agent的感知信息和行动,都有离散/连续之分。
- 已知的与未知的:这种其实应该指Agent的知识状态,在已知环境中,所有的行为后果是给定的,如果是未知的则Agent需要学习如何工作以便更好决策。
人们会意识到,最难处理的情况就是部分可观察的、多Agent的、随机的、延续的、动态的、连续的和未知的环境。
4. Agent的结构
现在来讨论Agent内部是如何工作的。AI的任务是设计 「Agent程序」,它实现的是把感知信息映射到行动的Agent函数。而Agent函数要在 「体系结构」——某个具备物理传感器和执行器的计算装置 上运行,体系结构为程序提供感知信号,运行程序,并把计算结果送达执行器。
下面,我们概述4种基本的Agent程序,它们几乎涵盖了全部智能系统的基础原则:
-
简单反射Agent
简单反射Agent是最简单的Agent种类,这种Agent基于当前的感知选择行动,不关注感知历史。简单反射行为也可以用在复杂的环境中,比如自动驾驶的“红灯停,绿灯行”,这种是条件触发的建立好的行为的联接,我们称之为 「条件-行为规则」。简单反射Agent具有极好的简洁性,但智能有限。 -
基于模型的反射Agent
世界如何独立于Agent而发展?Agent自身的行为如何影响世界的信息?这种关于“世界如何运作”的知识,无论通过什么方式实现,我们都称之为世界模型。使用了这种模型的Agent就是「基于模型的Agent」。这种Agent会利用世界模型来更新内部状态的信息,这有助于处理部分可观测环境,比如自动驾驶的车辆变道,就需要跟踪记录世界模型中其他车辆的位置。 -
基于目标的Agent
只知道当前环境状态对决策而言并不够,Agent还需要目标信息来描述想要达到的状况,基于目标的行动选择需要 「搜索」 和 「规划」。基于目标的Agent很灵活,因为支持它决策的知识被显示表示出来,并且可以修改。也就是说,可以只修改个别相关行为,就可以达成新的目标;如果是反射Agent就要重写很多条件-行动规则。 -
基于效用的Agent
要生成高品质的行为,我们还需要根据 「效用」,目标只能提供哪些行动是有效的、哪些是无效的;而效用则能衡量有效的行为中哪些更有效。「效用函数」 是性能度量的内在化,基于效用的Agent可以在选择的多个目标之间进行适当的折中,也可以在目标都无法完成时,根据成功率进行概率加权选出最有可能成功的目标去行动。
到目前为止,我们还没说明这些Agent程序是如何形成的,它们是由机器自己学习来的。我们将简要介绍学习Agent(这不是动宾短语,而是一个名词)的主要思想。
学习Agent可以被划分为4个概念上的组件:评判元件、学习元件、性能元件以及问题产生器。
感知信息本身无法告诉Agent做得好还是差,所以需要评判元件根据固定的性能标准产生反馈,评价Agent做得如何并确定应该如何修改性能元件以做得更好。学习元件负责改进提高,而性能元件负责选择外部行动,学习元件的设计很大程度上依赖于性能元件的设计。学习Agent的最后一个组件是问题产生器,它负责行动建议,哪些行动?可以得到新的、有信息的经验的行动,它的任务就是建议探索性行动。
总之,智能Agent的学习可以被总结为改进Agent的每个组件,使得各组件与能得到的反馈信息更加和谐,从而改进Agent的总体性能。
这些组件到底是如何工作的?这里只展示一些基础内容(太多辣),讲讲在不同环境下,表示Agent组件的不同方法——原子、要素和结构。
- 原子表示中,世界的每个状态是不可见的,它没有内部结构。
- 要素化表示中,世界状态表示为变量或特征的集合,每个变量或特征都可能有值。
- 结构化表示,在要素化表示的基础上,还描述了事物间的相互关联,就像数据结构中的图一样。