3. 快速入门
/home/alchemy/exdata 有一些示例数据,我们可以使用这些数据进行基本的学习。
3.1 输入文件
谓词和函数的声明、一阶逻辑规则都在.mln文件中指定。比如,在univ.mln的最上面,你会看到谓词professor, student等,你也会看到附带参数类型的函数motherOf。.mln文件中出现的第一个谓词或函数作为该MLN的声明。关于详细的谓词规则信息在第四节给出。注意,规则中,变量必须以小写字母开头,量必须以大写字母开头[注:此处与Prolog相反]。一个规则可以在前面加上权重或者在末尾加上.符号,但是不能同时还有两个[注:末尾加.表示该规则不能被违背,it is "hard" rule]。
类别和变量也在.mln文件中声明。比如univ-train.mln文件中给出的position = { Faculty, Faculty_emeritus }表示position变量含有Faculty, Faculty_emeritus两种常量。这些东西必须写在规则前面。[注:想想很也很自然]
闭原子在.db文件中定义。闭原子前面加!表示该闭原子为假的,加?表示不确定,什么都不加为默认值真值。如果一个谓词规则采用封闭世界假说[注:封闭世界假说是指所有未给出的事实都是假的],它在.db文件中的闭原子不允许为假。如果采用的是开放世界假说[注:互联网环境下,实际环境下应该还是要遵从的开放世界假说的,毕竟很多事实我们是收集不到的],则表示未定义的闭原子真假未知。函数映射也在.db文件中定义。
内联函数
和谓词
定义在C++文件中。比如funcitons.cpp中给出的函数。第五节详细讨论了改部分内容。
3.2 权重学习
执行learnwts可执行文件学习规则权重。比如在exdata目录下执行下面的命令:
../bin/learnwts -g -i univ.mln -o univ-out.mln -t univ-train.db
-g表示使用产生式权重学习进行学习,也可以用-d选择判别式学习方法,比如:
../bin/learnwts -d -i univ.mln -o univ-out.mln -t univ-train.db -ne advisedBy,student,professor
默认情况下为判别式学习方法;
-i和-o分别输入和输出的.mln文件;
-t指定学习权重时使用的.db证据文件,可以使用逗号隔开多个.db文件,比如:-t univ1.db,univ2.db;
出现在.db文件中的值就是全部的常量,默认情况下所有的常量被认为属于一个数据库[注:可以理解为开放世界封闭世界中的world],如果你需要指定多个数据库可以使用-multipleDatabases选项,比如你可以使用-t ai.db,graphics.db,systems.db -multipleDatabases表示各个.db文件中的常量属于各自的数据库,不共享。
当前版本的Alchemy只能从确定真假值的原子中学习,不能包括不确定的常量。如果还有常量没有在.db文件中给出,你可以在输入文件中加入他们,比如-i univ.mln,univ-train.mln。(在以下情况下的常量,你可能会想在定额外的.mln文件给出,而不需要定义在.db文件中:仅仅出现在封闭世界情况下的假闭原子中,或仅仅出现在开放世界情况下的未知闭原子中)[注:其实,那些无法直接确定真假值的闭原子,也就不可能在.db文件中给出了。]默认情况下,在学习权重的时候所有谓词的单元子句都要加到MLN网络中(也可以通过指定-noAddUnitClauses选项让其不要加入单元子句)。
-ne选项可以用于指定非证据谓词[注:非证据谓词是指需要学习的谓词]。判别学习需要指定至少一个非证据谓词。对于生成式学习,指定的谓词才包括在(权重)伪对数似然计算中;如果没有指定任何的谓词则计算所有给定的谓词。
学习权重的时候,每个规则都需要抓换成合取范式( conjunctive normal form (CNF))的形式,每个子句的权重都需要学习。如果.mln文件中的规则前面以及给定了权重,那么各个规则子句将平分该权重。子句权重使用均值为0的高斯先验学习权重。如果规则后面加上了.(表示该规则为硬规则,不允许有事实不符合该规则),它的每个合取范式子句的权重将是所有软子句(the soft clause weights)权重最大值的两倍。这方面开发者手册给出了更详细的说明如何去改变默认的先验权重值)。
当使用多个数据库的时候,可能不同数据库中子句形式在存在两次变量或相互排斥变量上会有不同[原句: When multiple databases are used, the CNF of a formula with existentially quantified variables or variables with mutually exclusive and exhaustive values may be different across the databases. ]。这是因为我们需要对变量到不同数据库中去绑定常量。当有这种情况发生的时候,就不再是学习各个子句的权重了,而是直接学习整个规则的权重。
可以在执行../bin/learnwts的时候不输入其他任何选项来看所有选项[注:相当于--help命令]。
学习权重后,输出的.mln文件不仅包括原始的带权重的规则还包括了新学习出来的规则。
3.3 结构学习
可以使用../bin/learnstruct学习MLN的结构(子句和权重)。默认的结构学习算法是文献3[http://alchemy.cs.washington.edu/user-manual/Bibliography.html]中的beam search算法。他可以从空和非空的MLN结构中学习。当从非空结构中学习的时候,它不修改包含存在量词变量或包含互斥值变量的子句[注:原句为:When it starts from a non-empty MLN, it does not modify clauses that are derived from existentially quantified formulas or those containing variables with mutually exclusive and exhaustive values. ]。其他选项与learnwts相同。另外,它有选项可以加快搜索速度,你也可以在权重学习的时候限制子句类型(具体查看开发这手册)。可以使用如下的命令执行样例数据中的结构学习:
../bin/learnstruct -i univ-empty.mln -o univ-empty-out.mln -t univ-train.db
可以在执行../bin/learnstruct的时候不输入其他任何选项来看所有选项[注:相当于--help命令]。
3.4 推理
可以使用如下命令执行推理:
../bin/infer -i univ-out.mln -e univ-test.db -r univ.results -q advisedBy;student;professor -c -maxSteps 20000
-i选项指定输入的.mln文件,在该文件中所有规则的要么在前面加上权重值,要么在后面加上.符号,不可两者都有。每个输入.mln文件中的规则都要被转换为合取范式的子句形式,如果有输入权重,那么各个子句将均分该权重。如果规则后面有.号,则各个子句的权重是所有软规则权重最大值的两倍。
-e选项指定证据文件.db文件,可以用逗号隔开多个.db文件。
-r选项指定包含推理结果的输出文件。
-q选项指定查询规则,以;号分隔。可以指定多个查询规则,并限制某些查询规则在特定的闭原子上,比如:
-q advisedBy(x,Ida);advisedBy(Ida,Geri)
[注:上式命令依赖于具体的shell,在有些shell下面可能要在有把分句用引号括起来(因为有括号)]
如果包含自由变量,那么对于每个闭原子(比如:student(x) 或者student--计算所有student常量的概率)将计算其概率状态。
另外,也可以在查询公式后面跟上-c选项。对于每个自由变量会计算所有闭原子的样本个数。
可以使用-f选项指定包含查询公式文件(可以同时使用-q和-f)。
证据谓词是指至少在.db文件中出现一次事实的谓词,默认情况下所有的证据谓词都是封闭世界的,所有非证据谓词都是开放世界的。用户也可以通过-ow选项明确指定那些证据谓词是开放世界的,也可以使用-cw选项明确指定那些非证据谓词是开放世界的。这些都可以把一些假的闭原子转变为证据谓词。
如果闭原子是在命令行中查询原子或查询文件中给出的,或者是在证据文件中特别表明为是未知真假的,它将覆盖掉所有的默认封闭世界相关的选修。如果一个一阶谓词在查询谓词和问中至少包含了一个闭原子,那么这个谓词就是开放世界的,换句话说就是,证据谓词的开放性覆盖了其封闭性。如果一个谓词同时被作为查询谓词和封闭世界-cw选项中同时给出,或者同时出现-cw和-ow选项中,那么将会报错。如果谓词是封闭世界并且它的一些原子是查询原子,那么该谓词中,除了作为查询原子的原子都将作为封闭世界看待。如果用户对指定的证据谓词输入-cw相信或者对于非证据谓词指定-ow选择,系统会给出警告。
可以在执行../bin/infer的时候不输入其他任何选项来看所有选项[注:相当于--help命令]。
Alchemy支持两种类型的推理:概率和MAP/MPE。当前的系统可以执行四种概率推理算法:(Lifted) Belief Propagation (-bp), MC-SAT(-ms), Gibbs抽样(-p)和模拟退火(-simtp)。当执行概率推理的时候,真原子的概率值会一起输出到文件中。-maxSteps用于指定算法最大迭代次数。
需要提及的是 lifted inference可以工作。当在完全闭网络中,它在运行时间和内存使用方面有优势。
如果使用MAP推理方法,可以指定-m或-a选项。-m只返回真值原子,-a两种都返回。MAP推理中, 每个硬规则的权重是软规则权重之和再加上10。
如果没有指定推理算法,默认将使用Lifted Belief Propagation -lifted -bp。
3.4.1 内存高效的推理(Memory-efficient inference)
MAP推理涉及到命题化知识库和在所有产生的子句上执行MaxWalkSat。这种时候可以使用一种“需要再激活”的“懒惰”思想的算法。使用-lazy选项可以使用内存高效的推理算法工作。该选项可以与MAP推理(-m或-a)或MCMC推理(-p,-ms,-simtp)共同使用。
如果没有指定-lazy选项,Alchemy根据主要内存的大小决定是否需要实例化全部的知识库。相应的,用户可以使用-mwsLimit选项控制内存使用情况。