ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

AI-For-Beginners 符号人工智能实战:知识表示与专家系统构建指南

AI-For-Beginners 符号人工智能实战:知识表示与专家系统构建指南 教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本指南对应 AI-For-Beginners 课程的第 2 课知识表示与专家系统是符号人工智能Symbolic AI模块的核心内容。与依赖海量数据的自下而上机器学习路线不同本课讲解的是自上而下的智能系统构建路线把人类专家头脑中的知识抽取成机器可读的形式再由推理引擎自动求解问题。读完本指南你将掌握 DIKW 知识层级模型、四大计算机知识表示范式、专家系统的三组件架构、前向与后向推理流程并能够在仓库提供的 Animals、FamilyOntology、MSConceptGraph 三个 Notebook 中亲手实现推理系统、语义网查询与概念图谱应用。知识表示从数据到智慧符号人工智能中最重要的概念之一是知识knowledge。要理解知识表示必须先严格区分知识、信息与数据三者的边界数据Daten/Data以物理媒介承载的东西例如写下的文字或说出的话语。数据独立于人存在可以在人与人之间传递。一本书本身只包含数据而非知识。信息Information人脑对数据的解释。例如听到Computer计算机这个词时我们脑海中会产生关于它是什么的认知。知识Wissen/Knowledge被整合进我们世界模型的信息。当我们学会计算机是什么之后就会进一步形成它如何工作、大概多少钱、能用来做什么等一系列相互关联的概念网络这个概念网络就是知识。智慧Weisheit/Wisdom对世界理解的更高一层代表元知识Meta-Wissen即关于知识何时、如何被应用的判断力。这一层级关系通常用DIKW 金字塔数据-信息-知识-智慧来形象化表示因此知识表示Wissensrepräsentation问题可以表述为找到一种有效方法将知识以数据的形式放入计算机使其能够被自动利用。不同的表示方法构成一个连续谱系Spektrum谱系左侧是最简单、计算机能高效利用的表示形式。最基础的是算法式表示——知识直接由一个计算机程序承载。但它不是最佳的知识表示方式因为缺乏灵活性而我们头脑中的知识往往是非算法的。谱系右侧是诸如自然语言文本的表示表达力最强却无法直接用于自动推理。知识表示的核心矛盾正是一对永恒的权衡可计算性与表达力。下面四大分类正是对这一谱系的工程化落地。计算机知识表示的四大分类1. 网络表示对象-属性-值三元组与语义网络人脑中存在一张相互关联的概念网络计算机可以把它复现为图结构即语义网络semantisches Netzwerk。图在计算机中可表示为节点与边的列表因此语义网络可以由一组对象-属性-值OAV三元组也叫属性-值对来表示。以编程语言知识为例可以构造如下三元组对象Objekt属性Attribut值WertPythonist是Untyped-Language非类型化语言Pythonerfunden von发明者Guido van RossumPythonBlocksyntax块语法Einrückung缩进Untyped-Languagehat nicht不具有Typdefinitionen类型定义OAV 三元组是理解后续所有内容的基础专家系统中的工作记忆、语义网中的 RDF 三元组本质上都是这种结构。2. 层次表示框架与槽位我们常在头脑中为对象建立层级例如金丝雀是鸟而所有鸟都有翅膀同时对金丝雀通常的颜色、飞行速度也有认知。层次化表示有两种典型形态框架表示Frame-Repräsentation将每个对象或对象类表示为一个框架Frame其中包含若干槽位Slots。槽位可以带有默认值、值域约束甚至挂载用于获取槽值的过程存储过程。所有框架构成一个层级结构与面向对象编程语言中的对象层级非常相似。以 Python 为例可构造如下框架槽位Slot值Wert默认值Standardwert区间IntervallName名称PythonIst-ein是一个Untyped-LanguageVariablenSchreibweise变量命名法CamelCaseProgrammlänge程序长度5-5000 行Blocksyntax块语法Einrückung场景Szenarien框架的一种特殊类型用于表示随时间展开的复杂情境。3. 过程表示产生式规则过程表示把知识编码为当某条件发生时执行的一系列动作。其中最重要的是产生式规则Produktionsregeln——形如如果-那么IF-THEN的陈述允许我们据此得出结论。例如医生可以拥有规则如果病人发高烧或血液检查中 C 反应蛋白水平高那么他患有炎症。只要条件之一被满足就能推出炎症结论并在后续推理中继续使用这个新结论。算法可视为过程表示的另一形态但在基于知识的系统中几乎不会直接使用。4. 逻辑表示从亚里士多德到描述逻辑逻辑最初由亚里士多德提出作为表示普适性人类知识的手段。两大分支值得关注谓词逻辑Prädikatenlogik作为数学理论过于丰富无法保证可计算性因此通常只使用其子集例如 Prolog 语言采用的Horn 子句。描述逻辑Beschreibende Logik一族逻辑系统用于在分布式知识表示如语义网中对对象层级进行表示与推理。专家系统架构、推理与实现专家系统是符号人工智能早期的成功案例——在有限问题域内扮演领域专家的计算机系统。它由从一位或多位人类专家处抽取的**知识库Wissensbasis与执行推理的推理机Inferenzmaschine**构成。人类专家是人肉知识库而专家系统的价值在于将知识物化、可复制、可解释。|专家系统与包含短期记忆和长期记忆的人类推理系统相对应其内部同样区分三部分问题存储器Problemspeicher保存当前待解决问题的知识如病人的体温、血压、是否发炎等。它是对问题当前认知的快照因此也称静态知识statisches Wissen即所谓问题状态。知识库Wissensbasis关于问题域的长期知识由人类专家手工抽取在一次次会诊间不发生变化。因为它允许我们在问题状态之间导航所以也称动态知识dynamisches Wissen。推理机Inferenzmaschine编排在整个问题状态空间中的搜索过程必要时向用户提问并负责为每个状态挑选正确的规则。AND-OR 树与产生式规则以根据物理特征判定动物的专家系统为例其规则集可以画成一张AND-OR 树——产生式规则集的图形化表示。向专家抽取知识之初画树非常有用但在计算机中表示知识用规则更便利IF the animal eats meat OR (animal has sharp teeth AND animal has claws AND animal has forward-looking eyes ) THEN the animal is a carnivore注意规则左侧的每个条件以及动作本质上都是 OAV 三元组。**工作记忆Arbeitsgedächtnis**保存与当前问题对应的 OAV 三元组集合规则引擎查找条件被满足的规则并执行向工作记忆追加一个新的三元组。前向推理Vorwärtsschlussfolgerung上述过程即前向推理从工作记忆中已有的初始数据出发执行如下推理循环若目标属性已存在于工作记忆——停止并输出结果查找所有条件当前被满足的规则得到规则的冲突集Konfliktmenge执行冲突消解Konfliktauflösung从冲突集中选择本步执行的规则。常见策略有选择知识库中第一条可应用的规则随机选择一条规则选择更具体的规则即左侧LHS满足条件最多的那条应用所选规则向问题状态插入新知识回到步骤 1 循环。后向推理Rückwärtsschlussfolgerung有时我们希望从对问题的空白认知出发通过提问逐步抵达结论——例如医学诊断中我们不会预先做完全部检查再开始诊断而是在需要决策时才执行某项检查。这就是后向推理它由**目标Ziel**驱动——即我们想求得的属性值选出所有能给出目标值即目标出现在规则右侧 RHS的规则构成冲突集若该属性没有规则可推导或规则明确要求向用户询问则直接向用户提问否则继续用冲突消解策略选择一条规则作为假设Hypothese尝试证明它对规则左侧LHS的每个属性递归地重复上述过程把它们当作新的目标来证明若任何一步失败回到第 3 步换用另一条规则。思考什么场景更适合前向推理什么场景更适合后向推理前向推理适合数据充足、目标开放的监控与配置场景后向推理适合目标明确、数据按需获取的诊断与问答场景。专家系统的两种实现路线直接用高级编程语言编程并非好主意因为知识库系统的核心优势在于知识与推理分离——领域专家应当能够在不懂推理过程细节的情况下编写规则。使用专家系统外壳Expertensystem-Shell一种专门设计的、可用某种知识表示语言填充知识的系统正是下文源码实战的主角。源码实战一用 Python 实现动物推理专家系统仓库中的 Animals.ipynb德语翻译版/ 英文原版 完整演示了前向与后向推理专家系统的实现核心思路是在 Python 中用类作为关键字自定义一门小型知识表示语言Ask表示需要向用户提出的问题内部保存候选答案集合默认[y,n]Content所有规则成分的父类只保存内容xIf/AND/OR分别表示一条规则、与分支、或分支仅作为存储语法糖。知识库可以组织为一个把动作应插入工作记忆的新事实映射到条件AND-OR 表达式的大字典部分事实用Ask向用户索取rules { default: Ask([y,n]), color : Ask([red-brown,black and white,other]), pattern : Ask([dark stripes,dark spots]), mammal: If(OR([hair,gives milk])), carnivor: If(OR([AND([sharp teeth,claws,forward-looking eyes]),eats meat])), ungulate: If([mammal,OR([has hooves,chews cud])]), bird: If(OR([feathers,AND([flies,lies eggs])])), animal:monkey : If([mammal,carnivor,color:red-brown,pattern:dark spots]), animal:tiger : If([mammal,carnivor,color:red-brown,pattern:dark stripes]), animal:giraffe : If([ungulate,long neck,long legs,pattern:dark spots]), animal:zebra : If([ungulate,pattern:dark stripes]), animal:ostrich : If([bird,long nech,color:black and white,cannot fly]), animal:pinguin : If([bird,swims,color:black and white,cannot fly]), animal:albatross : If([bird,flies well]) }注意color:red-brown这类带冒号的复合键表示color 属性取值为 red-brown是属性-值对在规则语言中的直接体现。接下来定义KnowledgeBase类完成后向推理它包含工作记忆memory属性到值的字典与规则集rules核心是两个方法get(name)获取属性值必要时执行推理或向用户提问并把结果缓存进工作记忆对get(color:blue)这类带冒号的请求会先求color值再返回y/neval(expr)真正执行推理递归遍历 AND/OR 树并求值子目标。class KnowledgeBase(): def __init__(self,rules): self.rules rules self.memory {} def get(self,name): if : in name: k,v name.split(:) vv self.get(k) return y if vvv else n if name in self.memory.keys(): return self.memory[name] for fld in self.rules.keys(): if fldname or fld.startswith(name:): value y if fldname else fld.split(:)[1] res self.eval(self.rules[fld],fieldname) if res!y and res!n and valuey: self.memory[name] res return res if resy: self.memory[name] value return value # field is not found, using default res self.eval(self.rules[default],fieldname) self.memory[name]res return res def eval(self,expr,fieldNone): if isinstance(expr,Ask): print(field) return expr.ask() elif isinstance(expr,If): return self.eval(expr.x) elif isinstance(expr,AND) or isinstance(expr,list): expr expr.x if isinstance(expr,AND) else expr for x in expr: if self.eval(x)n: return n return y elif isinstance(expr,OR): for x in expr.x: if self.eval(x)y: return y return n elif isinstance(expr,str): return self.get(expr) else: print(Unknown expr: {}.format(expr))从源码结构可以清晰地看到后向推理的递归本质eval遇到字符串就回调用getget又反过来求值规则体形成目标-子目标的证明链Ask分支则对应没有规则可推导时向用户提问。启动会诊只需一行kb.get(animal)运行时会依次向你提问毛发、食性、颜色、花纹等最终给出动物结论。Notebook 的后半部分改用Experta库实现前向推理。Experta 是 Python 的规则引擎库设计上模仿经典的 CLIPS 系统朴素的前向链实现通常效率不高因此成熟引擎会采用Rete 算法加速规则匹配。推理系统被定义为继承KnowledgeEngine的类每条规则用一个带Rule注解的函数声明规则体内用declare向工作记忆追加新事实从而触发后续规则class Animals(KnowledgeEngine): Rule(OR( AND(Fact(sharp teeth),Fact(claws),Fact(forward looking eyes)), Fact(eats meat))) def cornivor(self): self.declare(Fact(carnivor)) Rule(OR(Fact(hair),Fact(gives milk))) def mammal(self): self.declare(Fact(mammal)) Rule(Fact(mammal),Fact(carnivor), Fact(colorred-brown), Fact(patterndark stripes)) def tiger(self): self.declare(Fact(animaltiger)) # ... 更多规则运行前先把初始事实灌入工作记忆再调用run()触发前向推理最终可以观察工作记忆里逐步新增的被推导事实直至得出动物结论ex1 Animals() ex1.reset() ex1.factz([ Fact(colorred-brown), Fact(patterndark stripes), Fact(sharp teeth), Fact(claws), Fact(forward looking eyes), Fact(gives milk)]) ex1.run() ex1.facts提示这类示例相当简单只是展示专家系统的样子。只有当规则数达到约 200 时系统才会表现出某种智能行为规则多到无法在脑中全盘把握时你可能开始好奇系统为何做出某些决策——而知识库系统的重要特性正是任何决策都可以精确解释其来龙去脉这是神经网络目前难以提供的。本体论与语义网20 世纪末出现了一项倡议用知识表示来标注互联网资源使得人们可以找到对应非常具体查询的资源这就是语义网Semantic Web。它建立在若干核心概念之上基于描述逻辑的特殊知识表示与框架表示相似都构建带属性的对象层级但描述逻辑具有形式化的逻辑语义与推理能力存在一整个描述逻辑家族在表达力与推理的算法复杂度之间取得平衡。分布式知识表示所有概念都用一个全局 URI 标识从而可以构建跨越整个互联网的知识层级。一族基于 XML 的知识描述语言RDF资源描述框架、RDFSRDF Schema与OWL本体论网络语言Ontology Web Language。语义网的核心概念是本体论Ontologie——用某种形式化知识表示对问题域做出的显式规格说明。最简单的本体可以只是问题域中对象的层级复杂本体则包含可用于推理的规则。在语义网中一切表示都基于三元组每个对象与每条关系都由 URI 唯一标识。例如声明这个 AI 课程由 Dmitry Soshnikov 于 2022 年 1 月 1 日开发可写为如下三元组http://github.com/microsoft/ai-for-beginners http://www.example.com/terms/creation-date Jan 1, 2022 http://github.com/microsoft/ai-for-beginners http://purl.org/dc/elements/1.1/creator http://soshnikov.com其中http://www.example.com/terms/creation-date与http://purl.org/dc/elements/1.1/creator是表达创建日期与创建者概念的广为人知且被普遍接受的 URI。更复杂的场景如表示创建者列表则可以使用 RDF 中定义的数据结构。项目仓库中的 FamilyOntology.ipynb 正是一份可直接运行的语义网三元组图数据与推理实验。语义网建设的推进速度在一定程度上被搜索引擎与能从文本抽取结构化数据的 NLP 技术所减缓但若干领域仍在坚持维护本体与知识库WikiData与维基百科关联的机器可读知识库集合大部分数据从维基百科页面内的结构化内容块InfoBox挖掘而来。可以用语义网专用查询语言SPARQL对其进行查询下面的示例查询展示人类中最流行的眼睛颜色#defaultView:BubbleChart SELECT ?eyeColorLabel (COUNT(?human) AS ?count) WHERE { ?human wdt:P31 wd:Q5. # human instance-of homo sapiens ?human wdt:P1340 ?eyeColor. # human eye-color ?eyeColor SERVICE wikibase:label { bd:serviceParam wikibase:language en. } } GROUP BY ?eyeColorLabelDBpedia与 WikiData 类似的另一个项目。若想实验构建或打开现有本体推荐可视化本体编辑器Protégé桌面版与 Web 版均可用。仓库中 lessons/2-Symbolic/data/onto.ttl 就是一份可直接用 Protégé 打开的 Turtle 格式家族本体其中定义了Man/Woman/Person/Marriage等类以及hasFemalePartner、isFatherOf、isAuntOf等对象属性类定义使用了owl:equivalentClass、owl:intersectionOf、owl:Restriction等 OWL 构造来表达男人 具有男性性别属性的 Person这类推理规则。源码实战二用家族本体推断亲属关系FamilyOntology.ipynb 演示了完整的语义网推理流水线数据是罗曼诺夫沙皇家族的谱系树获取家谱家谱采用最通用的GEDCOM格式保存仓库中的 lessons/2-Symbolic/data/tsars.ged 记录了从 Mihail Fedorovich Romanov1613 年即位到安娜·伊万诺夫娜等数十位成员的姓名、性别、生卒年份与家庭FAMS/FAMC关联。解析 GEDCOM使用python-gedcom库把文件解析为个体IndividualElement与家庭FamilyElement两级对象可列出全部成员与家庭信息。引入家族本体onto.ttl把isUncleOf、isCousinOf等复杂亲属关系定义为基础谓词isMotherOf、isFatherOf、isBrotherOf、isSisterOf的组合。例如isAuntOf被定义为isSisterOf与isParentOf的复合姨妈 某人的父母的姐妹fhkb:isAuntOf a owl:ObjectProperty ; rdfs:domain fhkb:Woman ; rdfs:range fhkb:Person ; owl:propertyChainAxiom ( fhkb:isSisterOf fhkb:isParentOf ) .构造推理图遍历 GEDCOM 文件把个体与家庭信息性别、子女、兄弟姐妹转换成三元组追加到onto.ttl本体文件末尾得到本体规则 个体事实合并的单一图。执行推理用RDFLib读取 Turtle 格式图并统计三元组数量再用OWL-RL库构建图的闭包Closure——即把一切可推导的概念与关系补充进图。对比推理前后三元组数量即可直观感受推理的威力。SPARQL 查询推理闭包建好后可以用 SPARQL 查询任意亲属关系。下面的查询输出家谱中所有的叔叔/舅舅qres g.query( SELECT DISTINCT ?aname ?bname WHERE { ?a fhkb:isUncleOf ?b . ?a rdfs:label ?aname . ?b rdfs:label ?bname . }) for row in qres: print(%s is uncle of %s % row)也可以尝试isAncestorOf等递归定义的关系查询一个人的所有祖先。源码实战三用概念图谱为新闻分类大多数本体是手工精心构建的但也存在从非结构化数据如自然语言文本中挖掘本体的路线。微软研究院曾发布Microsoft Concept Graph——一个大规模实体集合实体之间用is-a继承关系分组可以回答微软是什么这类问题答案近似为它是公司概率 0.87也是品牌概率 0.75。原图既提供 REST API也提供可下载的实体对文本文件。仓库中的 MSConceptGraph.ipynb 因原 Microsoft 概念图 API 已不可用改用功能类似的开源知识图谱ConceptNet超过 800 万节点、2100 万条边、覆盖 83 种语言作为替代其 REST API 无需 API Key。该 Notebook 的实战流程很有代表性定义query(concept)函数调用 ConceptNet 的IsA关系接口将返回的若干上位概念按权重归一化为概率分布得到每个名词短语的类属概率用 NewsAPI 抓取美国与英国的头条新闻标题需自行注册免费开发者计划获取 API Key用TextBlob抽取标题中的名词短语——直接按名词聚类得到的主题组零散不成规模对每个名词短语调用query()换成更上位的概念术语仅保留概率高于 0.1 的类属再做聚类即可得到成规模的 economy、nation、person 等主题组把新闻标题归入宏观类别。这条文本 → 名词短语 → 概念图谱上位概念 → 主题聚类的流水线直观展示了知识表示在现代文本挖掘任务中的实际价值。结语如今人工智能常被等同于机器学习或神经网络但人类同样表现出显式的推理能力而这恰恰是目前神经网络尚未覆盖的。在真实项目中显式推理仍然用于执行两类任务需要可解释性的任务以及需要以受控方式修改系统行为的任务。知识库系统知识与推理分离、决策可解释的特性使其在这些场景中依然不可替代。挑战在 Family Ontology Notebook 中尝试探索其他亲属关系发现家谱中人与人之间的新连接例如堂表亲、姻亲等验证本体推理能否正确推导出复杂关系。复习与自学研究人类历史上如何量化和系统化知识查看布卢姆教育目标分类学Blooms Taxonomy回溯林奈Linnaeus对生物的分类学工作观察门捷列夫如何为化学元素建立描述与分组方法。你还能找到哪些有趣的知识编码案例课后作业作业 构建一个本体英文原版见 lessons/2-Symbolic/assignment.md选定一个主题人、地点或事物用本课学到的表示与建模策略为它建立知识模型。示例为客厅构建本体家具、灯具等思考它与厨房浴室的区别是什么如何知道一个房间是客厅而非餐厅——并使用 Protégé 完成本体构建。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐知识表示与专家系统AI-For-Beginners 符号人工智能课程第 2 课实战指南知识表示与专家系统AI For Beginners 符号人工智能课程第 2 课实战指南 本文基于 AI For Beginners 课程 2 Symbol教程人工智能机器学习深度学习知识表示与专家系统AI-For-Beginners 符号人工智能课程深度解析与实战知识表示与专家系统AI For Beginners 符号人工智能课程深度解析与实战 本篇指南围绕 AI For Beginners 课程第 2 课 less教程人工智能机器学习深度学习AI-For-Beginners 符号智能核心课知识表示、专家系统与语义网实战解析AI For Beginners 符号智能核心课知识表示、专家系统与语义网实战解析 符号智能Symbolic AI追求的是让机器像人一样拥有知识并基于知教程人工智能机器学习深度学习上一篇github-push-action完全指南如何自动推送代码到GitHub仓库下一篇Webpack构建隐藏陷阱duplicate-package-checker-webpack-plugin帮你揪出重复包创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表