转载自http://www.douban.com/group/topic/23630832/
第1单元:ACT-R导论
ACT-R是一种认知模型(Cognitive architecture)。作为一种抽象层面上的脑结构的理论,它要解释大脑是如何实现人类认知能力的。这种理论在ACT-R软件中得到具体实现,ACT-R软件允许人们创建自己的模型来解释人在任务行为中的绩效并预测在其他任务中的行为绩效。本教程将说明如何应用ACT-R软件建模并介绍ACT-R理论的一些要点,但这并不包括ACT-R理论的所有资料, 要获得更详尽的相关内容,可参考ACT-R网站上的论文《An integrated theory of the mind》(http://act-r.psy.cmu.edu/publications/pubinfo.php?id=526)或者Newell的著作《How Can the Human Mind Occur in thePhysical Universe》。
本章主要介绍ACT-R中的知识表征方式(konwledge representations)与说明(specifying)知识的形式符号(formalnotation),并说明在ACT-R模型中这些不同类的知识是如何交互(interact)的。
1.1. 知识表征方式
在ACT-R中有两种知识表征方式:描述型知识与程序型知识。描述型知识相当于我们能明白意识到的并且通常能叙述给其他人的知识。例如“乔治华盛顿是美国第一任总统”,“原子结构就像太阳系”就属于描述型知识。程序型知识是我们能在行动中表现出来但并不能意识到的知识。比如,没人能够明白描述我们讲话的规则但我们却可以流利地讲话。在ACT-R中,描述型知识以“块(chunks)”结构来表征,而程序型知识则用“产生式(productions)”规则来表征。因此块和产生式就是ACT-R模型的基本构建模块。
1.1.1. 块
在ACT-R中,描述型知识由“块”构成,表示一个人在问题解决中可能具备的知识。“块”由“类(chunk-type)”和“属(slots)”定义。我们可以把类(chunk-type)看成是类别(例如:鸟类),把属(slots)看成是类属性(例如:颜色和大小)。对块可给以命名以指代它,但该命名只是为了方便使用ACT-R软件,并不是块的一部分。下面是一些用来编码“狗追猫(the dog chased the cat)”和4+3=7的块表征。这些块用命名、属和值来表示。第一个块的类(type)是“chase(追)”,其属(slots)有“agent(主语)”和“object(宾语)”。“isa属”是给块的类赋值。第二个块的类是“addition-fact(加法)”,其属有“addend1”,“addend2”,和“sum”。
Action023
isa chase
agent dog
object cat
Fact 3+4
isa addition-fact
addend1 three
addent2 four
sum seven
1.1.2. ACT-R中的产生式(productions)
产生式(productions)是对控制行为的特定规则的表述。可以用“如果-那么(if-then)”句式表示,示例如下:
IF the goal is to classify a person
and he is unmarried
THEN classify him as a bachelor
IF the goal is to add two digits d1 and d2 in a column
and d1 + d2 = d3
THEN set as a subgoal to write d3 in the column
产生式的条件(IF部分)由特征组(conjunction of features)构成,若使产生式运行,则特征值必须为真。产生式的行为(THEN部分)包含当产生式运行时模型应完成的行为。以上示例是产生式的英语表达语序,给我们大致描述了产生式的运行形式。你将会在本单元后面部分学习ACT-R中产生式的语法。
1.2. 创建知识元素(Creating Knowledge Elements)
要创建块(chunks)、块类(chunk types),和产生式,我们必须发出必要的ACT-R命令。因为ACT-R命令采用Lisp函数,它们必须被放在括号中以便执行。左括号后面的第一项是命令名,接着是各项命令参数,然后是右括号。在接下来的部分我们将演示如何利用命令在ACT-R中创建知识表征。
1.2.1. 创建新的块类
要创建新的块类(type),例如“birds”或者“additionfact”,你得使用chunk-type命令为这个块确定一个框架。这需要为这个块类(type)和其所拥有的属(slots)命名。它的一般语句表达式是这样的:
(chunk-type name slot-name-1 slot-name-2 … slot-name-n)
示例:
(chunk-type bird species color size)
(chunk-type column row1 row2 row3)
chunk-type命令的第一项参数为该块类命名,在上面的示例中其命名为bird和column。每一个块类又包含一些可以赋值的属(slots),chunk-type命令的其他参数就是该块类所拥有的属(slots)的命名。
1.2.2. 创建类(chunks)
创建一组类并添加到模型的描述型记忆中,可以使用add-dm命令。该命令可以引用一些块作为参数。下面是count模型中的一个例子(我们将在后面讨论count模型):
(add-dm
(b ISA count-order first 1 second 2)
(c ISA count-order first 2 second 3)
(d ISA count-order first 3 second 4)
(e ISA count-order first 4 second 5)
(f ISA count-order first 5 second 6)
(first-goal ISA count-from start 2 end 4))
每一个块(chunk)由一个表(list)(括号内的一系列项)定义。表(list)的第一项是块的命名,命名可以是未被使用的任何合法Lisp符号值。上述例子中的命名为b,c,d,e,f,和first-goal。命名的目的只是为了提供一种指代这个块(chunk)的方式,并不作为块本身的一部分而存在,而且实际上在新的唯一(new andunique)命名可以自动能生成的情况下,你可以忽略它。表(list)的余下部分是属(slots)的命名和其初始值的配对组合。第一对组合必须是isa属及其块类(type)。“isa属”为每一个块所专有,其值为块类(type)(这个类(type)必须由chunk-type命令定义或者之前就已经定义过),一当创建之后其值不能更改。之后的一系列“属(slot)-值(value)组合”可以随意排列,并且不必为每一对组合的属(slot)赋初值(initial value)。如果某属(slot)的初始值未给出,该属(slot)将自动被赋给Lisp空值nil。
1.2.3. 产生式(productions)
产生式是条件-行为(conditiong-actiong)组合。条件(condition)(也叫左手边(left-handside 或 LHS))引用buffers(缓冲器)中的块(chunks)以启动产生式。行为(action)(也叫右手边,right-hand side 或 RHS)给出产生式启动后的行为。
1.2.4. 缓冲器(buffer)
在继续讨论产生式之前,我们得了解下缓冲器(buffers)是什么。在ACT-R中,缓冲器(buffers)是程序型记忆系统和其他模块(module)之间进行交互的接口(interface)。例如,目标缓冲器(goalbuffer)就是连接目标模块(goal module)的接口。每一个缓冲器(buffer)一次只能引用(hold)一个块(chunk),而且产生式的行为(action)会影响到缓冲器的内容。实质上,缓冲器就像是擦写板(scratch-pad),可以对块(chunks)进行创建、(暂时)存储和修正。
本章我们将只关注两种缓冲器(buffer),一种是goal,用于引用现有目标(goad),一种是retrieval,用于引用由程序型记忆模块(module)中检索到的信息。后面的章节将介绍其他缓冲器(bufffer)和模块(module),也会更深入地了解goal和retrieval。
1.2.5. 产生式(续)(ProductionsContinued)
产生式的一般语句表达式为:
(p Name “optional documentation string”
buffer tests
==>
Buffer changes and requests
)
每一个产生式(Production)必须有唯一的命名(name),并且可以有一个可选文件名字串(optional documentation string)用来说明其用处。缓冲器的tests包含一套检配(match)缓冲器现有内容的规则(pattern)。如果所有规则(pattern)与现有内容匹配,该产生式则被选中。可能会有不止一个产生式成功匹配现有缓冲器内容,然而,在所有匹配的产生式中,只有一个会被选中并执行。这个选择的过程称为冲突决策(conflict resolution),在后面的章节中我们将对其详细讨论。现在,重要的是每次只有一个产生式被启动,这个产生式被启动执行后,检配和冲突决策将再次进行,如此循环进行直到整个模型运行完毕。