Appearance
人工智能基础
概念
人工智能(AI) 是"让机器完成那些本来需要智能才能完成的任务"的一类工程的统称。它不是一个单项技术,而是一组技术:有的靠搜索,有的靠学习,有的靠人写规则。
四根支柱:
| 支柱 | 回答的问题 | 代表方法 |
|---|---|---|
| 搜索 | 在巨大的可能空间里怎么找解 | 状态空间、启发式、A* |
| 表示 | 现实怎么变成机器能算的形式 | 特征、逻辑式、图、向量 |
| 学习 | 参数怎么从数据里定出来 | 损失函数、梯度下降、反向传播 |
| 推理 | 从已知怎么推出未知 | 逻辑演绎、概率推断 |
一句话:搜索回答"怎么找",表示回答"怎么放",学习回答"怎么调",推理回答"怎么用"。
历史上的三条路线:
| 路线 | 高峰 | 知识从哪来 |
|---|---|---|
| 符号主义 | 1960s – 1980s | 人写下来(规则、专家系统) |
| 连接主义 | 1980s 起,2010s 爆发 | 从数据里学出来(神经网络) |
| 行为主义 | 1990s 起 | 与环境交互中学出来(强化学习) |
今天的主流是连接主义,但另两条线并未消失:规则仍用于约束与校验,强化学习在决策类问题上不可替代。
它与本站主线的关系最直接。 主线【由硅到 C】讲的是从沙子到可执行程序的整条通路——半导体、数字电路、指令集、微机与系统软件 一路向上。AI 不改变底层的物理定律,却把底层的计算需求拉到极限:它把"做矩阵乘法"这件事变成了当代最贵的运算。所以本章的落点不在"AI 有多神奇",而在它的每一步都能算成数。
原理
一、搜索:把问题变成图
任何可以写成"从初始状态出发、每一步做一种选择、看能否到达目标"的问题,都能变成一个状态空间图:结点是状态,边是允许的动作,边上的权是代价。
四种基本策略,差别只在"先扩展谁":
| 策略 | 选点规则 | 优点 | 缺点 |
|---|---|---|---|
| 广度优先 | 先扩展层数浅的 | 边权相同时一定最短 | 存下整层,内存爆炸 |
| 深度优先 | 先扩展刚生成的 | 内存只需一条路径 | 可能钻进死胡同 |
| 一致代价 | 先扩展已走代价 | 有权图上也最优 | 只看过去,不看方向 |
A* | 先扩展 | 兼顾已付代价与剩余估计 |
其中
A* 保证最优的前提是
也就是估计永远不超过真实值。这是"不乱吹"的形式化。反过来,如果某个 A* 会先沿着被高估吸引的方向走偏,最优性就没了——这是最常见的误用。
二、表示:把现实变成向量
机器只会算数,所以任何输入最终都要落到数值结构上:
| 表示形式 | 适合什么 | 典型代价 |
|---|---|---|
| 特征向量 | 表格型数据 | 需要人工设计特征 |
| 图与关系 | 关系型、网络型数据 | 结构不规整,难批量算 |
| 逻辑式 | 规则明确的推理 | 对噪声极敏感 |
| 分布式向量 | 语言、图像等感知任务 | 可解释性差 |
维度诅咒是表示环节的硬约束:设每个维度归一化后取
所以"降维"不是装饰性的技巧,而是让样本密度不至于归零的必要手段。主成分分析、自编码器都在做同一件事。
三、学习:把经验变成参数
监督学习的设定是:给定若干"输入—标签"对,找一个函数使预测接近标签。做法是把"接近"写成一个损失函数
以最简单的均方误差与线性模型为例,参数的更新方向由梯度给出:
三点必须记住:
- 学习率太小:步子碎,收敛慢。
- 学习率太大:会跨过谷底来回振荡,甚至每一步越走越远(发散)。
- 学习率恰好:很快到底。
神经网络只是把这个框架叠深:一层是"线性组合 + 非线性激活",多层串起来就能逼近复杂函数。非线性激活不可省——若没有它,多层线性叠起来仍是一个线性变换,深度毫无意义。
2010 年代后深度网络能训练起来,靠的正是反向传播:用链式法则把损失对每层参数的梯度从后往前一次算清,代价与一次前向传播同阶。
四、评价:把"好不好"变成数字
分类任务最常用的四个量来自混淆矩阵:
| 预测为正 | 预测为负 | |
|---|---|---|
| 实际为正 | TP | FN |
| 实际为负 | FP | TN |
由它导出四个指标:
| 指标 | 公式 | 含义 |
|---|---|---|
| 准确率 | 整体答对的比例 | |
| 精确率 | 被判为正的里面,真正为正的比例 | |
| 召回率 | 真正为正的里面,被找出来的比例 | |
| F1 | 精确率与召回率的调和平均 |
准确率在类别不平衡时会骗人。 设想一个"绝大多数样本都是负类"的数据集,模型只要一律输出"负",准确率就能很高,而召回率为零——它什么都没找出来。
五、算力账:AI 为什么吃矩阵乘法
一层全连接层,输入
(后一项是偏置)。每处理一个样本的浮点乘加次数约为
示例
把上面四节的算术各跑一遍:
python
import heapq
# 例 1:A* 搜索(g 为已走代价、h 为启发式、f = g + h)
edges = {'S': [('A', 1), ('B', 4)], 'A': [('B', 1), ('C', 5)], 'B': [('D', 3)],
'C': [('D', 1)], 'D': [('G', 2)], 'G': []}
h = {'S': 7, 'A': 6, 'B': 2, 'C': 1, 'D': 1, 'G': 0}
def astar():
pq = [(h['S'], 0, 'S', ['S'])]
best = {}
while pq:
f, g, u, path = heapq.heappop(pq)
if u in best and best[u] <= g:
continue
best[u] = g
print(f"出队 {u}: g={g} h={h[u]} f={f}")
if u == 'G':
return path, g
for v, w in edges[u]:
heapq.heappush(pq, (g + w + h[v], g + w, v, path + [v]))
path, cost = astar()
print("最优路径", "->".join(path), "代价", cost)
# 例 2:梯度下降 —— 最小化 f(w) = (w - 3)^2,f'(w) = 2(w - 3)
w, lr = 0.0, 0.1
for i in range(1, 21):
w -= lr * 2 * (w - 3)
if i <= 5 or i == 20:
print(f"第 {i:2d} 步 w = {w:.6f}")
print(f"理论值 3 - 3*0.8^20 = {3 - 3 * 0.8 ** 20:.6f}")
for lr in (0.5, 1.0):
w, seq = 0.0, []
for _ in range(4):
w -= lr * 2 * (w - 3)
seq.append(round(w, 4))
print(f"lr={lr} 前四步 {seq}")
# 例 3:混淆矩阵 -> 四个指标
TP, FN, FP, TN = 90, 30, 10, 870
acc = (TP + TN) / (TP + TN + FP + FN)
prec, rec = TP / (TP + FP), TP / (TP + FN)
print(f"准确率 {acc:.4f} 精确率 {prec:.4f} 召回率 {rec:.4f} F1 {2 * prec * rec / (prec + rec):.4f}")
# 例 4:一层全连接 1024 -> 1024 的算力账
print(f"参数量 {1024 * 1024 + 1024} 每样本 FLOPs {2 * 1024 * 1024 / 1e6:.2f} MFLOPs")
print(f"1000 万样本 x 10 轮 = {2 * 1024 * 1024 * 1e7 * 10:.3e} FLOPs")出队 S: g=0 h=7 f=7
出队 B: g=4 h=2 f=6
出队 A: g=1 h=6 f=7
出队 B: g=2 h=2 f=4
出队 D: g=5 h=1 f=6
出队 C: g=6 h=1 f=7
出队 G: g=7 h=0 f=7
最优路径 S->A->B->D->G 代价 7
第 1 步 w = 0.600000
第 2 步 w = 1.080000
第 3 步 w = 1.464000
第 4 步 w = 1.771200
第 5 步 w = 2.016960
第 20 步 w = 2.965412
理论值 3 - 3*0.8^20 = 2.965412
lr=0.5 前四步 [3.0, 3.0, 3.0, 3.0]
lr=1.0 前四步 [6.0, 0.0, 6.0, 0.0]
准确率 0.9600 精确率 0.9000 召回率 0.7500 F1 0.8182
参数量 1049600 每样本 FLOPs 2.10 MFLOPs
1000 万样本 x 10 轮 = 2.097e+14 FLOPs例 1 读的是"出队顺序",也就是搜索的思考顺序:
| 次序 | 结点 | 说明 | |||
|---|---|---|---|---|---|
| 1 | S | 0 | 7 | 7 | 起点 |
| 2 | B | 4 | 2 | 6 | 直达, |
| 3 | A | 1 | 6 | 7 | 另一个邻居 |
| 4 | B | 2 | 2 | 4 | 经 A 得到更优的 |
| 5 | D | 5 | 1 | 6 | 经 B |
| 6 | C | 6 | 1 | 7 | 经 A |
| 7 | G | 7 | 7 | 7 | 目标,结束 |
三点结论:① B 出队了两次,因为第一次的
例 2 读的是学习率。收敛速度由因子
例 3 给出的是一组"看着不错、其实偏科"的结果:准确率
例 4 是成本:一层
要点
要点与常见误区
- AI 不等于神经网络。搜索、规则推理、统计方法都是 AI 的组成部分;工程上常常是"学习 + 规则约束"的混合体。
A*的最优性依赖 可采纳。 一旦高估,就退化成贪心,可能给出次优解。先问" 会不会高估",再谈最优。- 启发式越紧,搜索越快,但不是越紧越安全。紧到与真值相等最优;紧到超过真值就出错——方向只有一边是安全的。
- 学习率不是一个可以随便取的超参数。太小慢、太大散;
越大,收敛因子 的绝对值越大,超过 就彻底发散。 - 没有非线性激活,深度就是装饰。多层线性叠加仍等价于一层线性。同理,去掉激活就等于把模型砍回线性回归。
- 准确率高可能是数据不平衡造成的假象。类别严重不平衡时,要看精确率、召回率、F1,以及混淆矩阵本身。
- 精确率与召回率是此消彼长的。把判定门槛放宽,召回率上去了、精确率下来了;阈值的选择取决于"漏判"和"误判"哪个代价更大。
- 训练集表现好不等于模型好。在训练集上背下答案、在新数据上崩掉,就是过拟合;因此必须留出验证集与测试集,并且测试集只用来汇报,不用来调参。
- 相关不等于因果,模型学到相关也不等于学到机制。模型给出的是预测,不是解释。
小结
- 四根支柱:搜索(怎么找)、表示(怎么放)、学习(怎么调)、推理(怎么用)。
- 搜索的钥匙是评价函数
; 管已付代价、 管方向,可采纳性保最优。 - 学习的钥匙是梯度:
,学习率决定收敛还是发散。 - 评价的钥匙是混淆矩阵:准确率会被不平衡数据欺骗,精确率、召回率与 F1 才看得到偏科。
- 成本结构:参数量决定"能装多少",乘加次数决定"要烧多少"。一层的参数量是
,每样本乘加数约为 。 - 验算锚点:
A*最优路径 S → A → B → D → G,代价 7;梯度下降第 20 步 2.965412、 一步到位、 回弹不收敛;混淆矩阵准确率 0.9600、精确率 0.9000、召回率 0.7500、F1 0.8182; 全连接层参数量 1049600、每样本 2.10 MFLOPs。 - 主线呼应:本章是"由硅到 C"这条链顶端的负载——底层的半导体器件、数字电路、指令集、中断与总线决定了算力的上限,而 AI 决定了把算力用在哪里;数学工具来自线性代数与概率论,优化方法则与编译器后端的优化是同一类思路在两种对象上的应用。
- 还呼应两处通识:神经科学提供了神经元与连接的原始灵感,教育心理学讲的"强化程式与反馈节奏"与本章的"奖励信号设计"是同一个问题在人与机器上的两个版本。
下一篇:数据科学基础 —— 模型要吃数据,而真实世界交出来的第一批数据一定是不干净的。
评论(0)
当前浏览器不允许本地存储,评论无法保存。
还没有评论,来说两句。