AI 分类
1. 自顶向下: 符号推理Symbolic Reasoning
让机器像人类行为一样
主要通过大量的知识构建整个知识体系, 一定是在知识体系内回答(获取知识代表并进行推论), 不会出现幻觉等情况
This approach was based on two big ideas:
- Knowledge Representation
- Reasoning
先来聊一聊 Knowledge Representation
比较形象的从下到上的描述: Data -> Information -> Knowledge -> Wisdom
Data is something represented in physical media, such as written text or spoken words. Data exists independently of human beings and can be passed between people.
Information is how we interpret data in our head. For example, when we hear the word computer, we have some understanding of what it is.
Knowledge is information being integrated into our world model. For example, once we learn what a computer is, we start having some ideas about how it works, how much it costs, and what it can be used for. This network of interrelated concepts forms our knowledge.
Wisdom is yet one more level of our understanding of the world, and it represents meta-knowledge, eg. some notion on how and when the knowledge should be used.
当然上面说的是抽象的逻辑概念,当然也有具体的表示方法:
| 表示方法 | 核心思想 | 示例 | 特点 |
|---|---|---|---|
| 网络型 | 概念 + 关系 | 三元组 <Python, is, Untyped-Language> | 可表示对象关系,容易做推理 |
| 层次型 | 对象层次 / 框架 | Python Frame | 支持默认值、继承、复杂场景 |
| 程序型 | 条件 → 动作 | IF high fever → inflammation | 直接反映操作流程 |
| 逻辑型 | 数学逻辑 | Horn Clause | 可做严谨推理,支持计算机推理 |
网络型(Network representations)
简单来说: A = B, B = C那么A = C, 每个知识之间都是使用边和节点去构建的
层次型(Hierarchical representations)
类似于OOP的对象, 先定义一个总体类, 然后进行对象赋值:
| Slot | Value | Default Value | Interval |
|---|---|---|---|
| Name | Python | ||
| Is-A | Untyped-Language | ||
| Variable Case | CamelCase | ||
| Program Length | 5-5000 lines | ||
| Block Syntax | Indent |
这样当多个knowledge形后就会可以进行slot的关联
程序型知识表示(Procedural representations)
IF patient has high fever OR high C-reactive protein
THEN patient has inflammation核心是: 条件满足时 → 得出结论 → 可以进一步推理, 类似于规则引擎的构建
逻辑型知识表示(Logic)
可做严谨推理,支持计算机推理, 拓展学习搭建: 语义网(Semantic Web)
聊聊推理(Reasoning)
主要是通过存储的knowledge进行推理, 类似于规则的构建后, 系统怎么使用规则去自动做关联, 在上面也有解释, 每一种knowledge的存储, 其中的推理方式也不太相同, 主要看需要实现哪些场景:
- 网络型/层次型 → 关注“存储和组织”
- 程序型/逻辑型 → 关注“推理和应用”
拓展学习(Forward vs. Backward Inference)
- 前向推理(Forward Inference / Forward Chaining): 从已知事实出发,不断应用规则推导新事实,直到达到目标或不能再推导为止。
正向推理(数据驱动),其基本思想是:
- 从问题已有的事实(初始证据)出发,正向使用规则,
- 当规则的条件部分与已有的事实匹配时,就把该规则作为可用规则放入候选规则队列中,
- 然后通过冲突消解,在候选队列中选择一条规则作为启用规则进行推理,并将其结论放入数据库中,作为下一步推理时的证据。
- 如此重复这个过程,直到再无可用规则可被选用或者求得了所要求的解为止。
冲突消解:
- 优先度排序。事先给知识库中每条规则设定优先度参数,优先度高的规则先执行。
- 规则的条件详细度排序。条件较多、较详细的规则,其结论一般更接近于目标,优先执行。
- 匹配度排序。事先给知识库中每条规则设定匹配度参数,匹配度高的规则先执行。
- 根据领域问题的特点排序。根据领域知识可以知道的某些特点,事先设定知识库中的规则的使用顺序。
已知事实: today_is(Monday)
│
▼
匹配规则: R1 (IF today_is(Monday) THEN tomorrow_is(Tuesday))
│
▼
生成新事实: tomorrow_is(Tuesday)
│
▼
匹配规则: R2 (IF tomorrow_is(Tuesday) THEN day_after_tomorrow_is(Wednesday))
│
▼
生成新事实: day_after_tomorrow_is(Wednesday)
│
▼
推理完成: 得到所有可能结论比如: 假设我们有一个规则: 如果今天是星期一,那么明天是星期二。如果我们知道今天是星期一,那么我们可以推断出明天是星期二。这样就可以推出全部可能, 比如明天不仅是星期二还是晴朗的, 还可以去开车, 还可以逛公园。
- 后向推理(Backward Inference / Backward Chaining): 从目标结论出发,逆向查找支持该结论的规则,直到找到已知事实为止。
反向推理(结果驱动),其基本思想是:
- 从问题要验证的 目标结论 出发,逆向查找能够支持该目标的规则;
- 检查每条规则的条件部分:
如果条件已经在事实库中 → 规则成立,目标被支持;
如果条件不在事实库中 → 将这些条件作为新的 子目标,递归进行逆向推理;
对每条可用规则按冲突消解策略选择启用规则进行验证;
如此重复,直到:
目标被支持(所有条件都被事实满足) → 推理成功
无可用规则或条件无法满足 → 推理失败或无法确定结果
目标: tomorrow_is(?day)
│
▼
规则 R1: IF today_is(Monday) THEN tomorrow_is(Tuesday)
规则 R2: IF today_is(Tuesday) THEN tomorrow_is(Wednesday)
规则 R3: IF today_is(Wednesday) THEN tomorrow_is(Thursday)
│
▼
子目标: today_is(?day)
│
▼
已知事实: today_is(Monday)
│
▼
推导结果: tomorrow_is(Tuesday)比如: 如果我们想要知道明天是星期几,我们可以从目标结论“明天是星期几”出发,逆向查找支持该结论的规则,直到找到已知事实“今天是星期一”, 那么明天是星期二。这样就很明确, 就是一条直线推理明天是星期几。
| 流程 | 前向推理 | 后向推理 |
|---|---|---|
| 起点 | 已知事实 | 目标结论 |
| 推导方式 | 逐步推出新事实 | 逆向验证规则前提 |
| 驱动方式 | 数据驱动 | 目标驱动 |
| 典型应用 | 专家系统推理 | 问答系统、诊断系统 |
| 规则检查方式 | 检查规则前提是否满足事实 | 检查规则结论是否能得到目标 |
简单实践: 实现一个专家系统
核心是数据+推理, 其实业界已经有公认的标准脚本了, 那就是CLIPS脚本语法
发现java也有自己的实现框架: jess(Java Expert System Shells), 研究了一下: 编写脚本语言就可以实现很复杂的人机交互
2. 自下向上: 机器学习和神经网络(Neural Networks)
简单理解
自下向上的机器学习也分两种, 分为经典机器学习和深度学习, 目前我们只讨论深度学习, 也就是多层神经网络学习
最常见的机器学习问题:
- 分类:需要将输入对象分类到两个或多个类别中。
- 回归:需要为每个输入样本预测一个数值。
感知机(二分类模型)
核心就是找到能把数据分类的边界,可以将输入进行分类,是最简单的神经网络, 只有一层神经元, 每个神经元都有一个权重和一个偏置, 感知机就是通过调整权重和偏置来找到最佳的分类边界
也就是: f(y) = wx + b
当多元时也就是: f(y)=w1x1+w2x2+⋯+wnxn+b
那么我们就可以引申出来一个小问题, 就是w和b是这样计算出来的?
我们就可以用如下公式进行计算:
在感知机学习算法中,权重 w 和偏置 b 的更新是通过随机梯度下降(SGD)方法进行的。对于每个误分类的样本 (x_i, y_i),其中 x_i 是特征向量,y_i 是标签(通常取 +1 或 -1),更新规则如下:
计算该样本的预测输出
y_hat_i = sign(w · x_i + b),其中sign是符号函数。如果
y_hat_i ≠ y_i,则更新权重和偏置:w <- w + η * y_i * x_ib <- b + η * y_i
其中,η 是学习率,是一个介于 0 和 1 之间的常数,用于控制权重更新的幅度。
这个过程会一直重复,直到没有误分类的样本为止。但需要注意的是,感知机算法并不能保证在所有情况下都能找到这样的超平面。如果数据集不是线性可分的,感知机算法可能无法收敛。
在实际情况中,我们通常会设置一个最大迭代次数,或者当权重和偏置的变化小于某个阈值时停止迭代,以避免无限循环。