跳转至

P7-3.2 比较 CNN、序列与注意力模型族

Section ID: P7-3.2 Version: v2026.08.01

本节把 CNN、序列模型和注意力模型族理解为对不同输入关系的回应,而不是架构排行榜。局部视觉邻域、有顺序的位置和远距离关系,各自会让不同的信息更容易或更难被使用。

每个模型族优先保留什么

模型族 最强的结构假设 复核问题
CNN 相邻位置共享有用的局部模式。 局部空间结构是否决定任务?
序列模型 较早与较晚的位置具有顺序意义。 改变顺序会改变含义吗?
注意力模型族 相距很远的位置可能需要直接比较。 哪些远距离关系真正重要?

模型族不会证明其假设已经存在于数据中。作出选择前,还要比较表示、任务输出、错误案例、计算成本和缺失证据。

学习复核

对每个候选模型族,写下一条它可能使用的输入关系、一项它引入的限制,以及一个下一次实验。只有模型名称不是项目解释。

学习问题

  1. 哪个保留评估样本为下一次试验提供错误证据?
  2. 当前问题中哪些属于数据范围、表示或模型族?
  3. 为什么弱空间补丁比序列模型更直接地打开 CNN 问题?
  4. 哪个固定回归样本可发现新误报?

完成复核时,应保存准确错误,为每一层写一个有限假设,并说明下次运行的固定参考。

将弱划痕错误读成结构问题

表面补丁练习的第三个评估补丁是弱划痕。它的亮度分布接近正常表面,但中央偏右出现一条很淡的纵向划痕。简单分类器输出如下概率。

1
2
3
4
5
test probabilities =
[[0.994, 0.006],
 [0.003, 0.997],
 [0.730, 0.270],
 [0.973, 0.027]]

第三行的真实标签是划痕警告,模型却偏向正常表面。这是弱位置模式可能与普通照明变化混淆的案例。

问题 简短回答
为什么保留该样本? 它比一个准确率数字提供更多复核证据。
应检查什么? 缺陷强度、训练数据范围和空间信息。
记录应包含什么? 已确认事实、模型族假设和下一步计划。
候选模型族 首先考虑的强项 该错误提出的问题
CNN 保留相邻空间模式。 局部空间特征能否使淡划痕更清楚?
序列模型 使用有序累积。 这是二维位置问题,顺序不是首要假设。
注意力模型族 直接关联远距离元素。 是否确实需要更大上下文或分离区域关系?

安全结论不是“换一个更大的模型”。先问弱位置是否被遗漏、训练中是否有相似弱缺陷,以及展平表示是否弱化了空间关系。对这个 8×8 补丁,CNN 是比序列模型更直接的下一问题;只有证据表明需要更宽上下文时,注意力才变得相关。

flowchart TD
    A[固定弱划痕错误样本] --> B{先检查什么?}
    B --> C[数据范围:是否有可比弱划痕与阴影]
    B --> D[表示:是否保留局部位置]
    B --> E[模型族:局部关系是否需要专门结构]
    C --> F[增加边界数据并保留回归样本]
    D --> G[比较明确的空间表示]
    E --> H[CNN 是直接的局部空间假设]
    H --> I[仅在证据支持更宽上下文时考虑注意力]
    F --> J[比较恢复、新错误与未解决错误]
    G --> J
    I --> J

分开数据、表示与模型假设

层次 本练习中的问题 后续模型族问题
数据 训练中是否充分出现弱划痕? 增加可比案例后同一错误是否仍在?
表示 展平 8×8 灰度是否充分保留弱位置? 是否应保留局部空间邻域?
模型族 简单线性边界是否难以分开阴影和淡划痕? 是否应先比较 CNN?

这些都是假设,不是已证实的原因。小型合成补丁集不能证明某一张样本为何出错,只能为下一个受控比较排定优先级。

把错误记录成可复用项目材料

记录字段 为什么需要
错误样本 ID 后续实验能找到同一补丁。
审查理由 区分低置信度、错分与数据范围担忧。
后续项目 说明先检查数据、表示还是结构。
共同回顾句 让其他项目复用同一结果格式。

相关输入为 p7-3-surface-patches.zh.csvp7-3-error-review.zh.csvp7-3-followup-actions.zh.csv。第一个文件说明训练模式,第二个记录预测与置信度,第三个列出候选行动。

flowchart LR
    A[评估预测记录] --> B{预测与标签一致?}
    B -- 否 --> C[确认错误:保存样本、概率和边际]
    B -- 是 --> D{是否需要审查?}
    D -- 是 --> E[保存预防性回归样本]
    D -- 否 --> F[保存稳定参考]
    C --> G[按数据、表示、模型族分类假设]
    E --> G
    G --> H[只改变一个组件]
    H --> I[报告恢复、新错误、持续错误]

安全的回顾陈述

弱划痕评估补丁带有划痕警告标签,却被分类为正常。当前训练集集中于更清楚的正常和划痕模式;展平 8×8 补丁可能弱化局部纵向变暗信号;简单分类器也可能无法分开弱划痕与阴影变化。先添加弱划痕和阴影边界补丁,再比较空间表示,之后才讨论是否需要不同模型族。

这段陈述保存观察到的错误,限制因果解释,并指出下一次实验。它不把分类器简单称作“坏”,也不把一张错误补丁当成序列模型或注意力模型必需的证明。

结构选择的复核清单

检查 要回答的问题
错误样本 能否找回准确补丁和置信差?
数据范围 训练是否有可比弱缺陷模式?
表示 保留或丢弃了哪些空间信息?
模型族假设 哪个模型族直接匹配要保留的关系?
下次试验 哪个固定评估样本判断数据与结构假设?

读取三份复核文件的不同证据

表面补丁、错误复核和后续行动文件承担不同责任。若把一个文件当作能回答所有问题,复核就会失去可靠性。

文件 直接证据 单独不能解决的问题
表面补丁 模式名称、标签和像素值。 为什么产生某一预测。
错误复核 实际、预测、概率、边际和审查标记。 哪项修改会恢复错误。
后续行动 数据、表示和结构候选行动。 行动是否已经验证。

弱划痕复核记录给出实际划痕警告、预测正常、概率 [0.730, 0.270] 与边际 0.459。这是已确认的保留评估错误。行动列表给出的是待测假设,而不是错误行已经证明的解释。

建立三层错误记录

层次 有限假设 最小受控试验
数据 训练范围可能缺少弱划痕或阴影组合。 增加带标签边界补丁,保留当前测试。
表示 展平可能使局部纵向模式不明显。 用清楚的空间轮廓与展平像素比较。
模型族 前两项检查后线性边界仍可能不足。 在同一回归集上测试局部空间模型。

顺序很重要。CNN 试验可以是有用假设,但不能掩盖尚未检查的数据范围缺口。同样,新增训练补丁也不能证明局部性从不重要。每项解释都应保持条件性,每次试验都应保持狭窄。

按改变的内容分类候选行动

行动类型 示例 保持不变的内容
数据覆盖 添加弱划痕强度案例。 当前表示和回归补丁。
数据覆盖 添加阴影加缺陷组合。 标签映射和错误复核记录。
表示 比较中心带或位置感知特征。 划分和分类器设定。
模型族 测试保留局部性的 CNN。 数据版本和命名回归案例。
需要澄清 模糊的“改进预处理”。 未说明预期变化前不运行。

无法分类的行动应保持未分类。没有证据就把它归为数据或模型工作,会让回顾更难复现。

设计安全的下一次试验

  1. 把弱划痕和阴影正常保留为固定评估参考。
  2. 选择一项干预:边界数据、表示比较或局部空间模型。
  3. 运行前写下预期转换,例如“弱划痕从错误变为正确,阴影正常不回归”。
  4. 运行后列出每个恢复、新错和仍未解决的补丁。
  5. 只有比较相同参考补丁后才更新假设。

这个过程把架构讨论转为实验,也防止后来的准确率提高掩盖代价高的新误报。

按输入关系选择模型族

模型族 假设有用的输入关系 排定优先级前所需证据
CNN 相邻像素形成局部视觉模式。 可比数据检查后弱或偏移缺陷仍存在。
序列模型 早晚位置形成有意义顺序。 输入是真正有序信号,不是任意图像扫描。
注意力模型族 远距离区域需要直接交互。 任务需要局部补丁外的上下文。

当前 8×8 补丁的淡纵向局部模式使 CNN 问题更直接。序列模型需要有文档记录的序列含义,注意力模型需要证据表明远距离上下文改变决策。这些是调查优先级,不是模型威望排名。

可复现错误摘要

在提出架构前,先创建一个将审查数量与确认错误分开的摘要。

1
2
3
4
5
6
7
8
评估行数:
错误行数:
审查候选数:
同时错误且需审查的行数:
代表错误 ID:
代表错误的概率与边际:
训练模式比较:
按类别整理的候选行动:

下面程序从三份项目文件生成该摘要。请在仓库根目录运行;它是错误分析记录,不是 CNN、序列或注意力实现。

import csv
from pathlib import Path

asset_dir = Path("docs/assets/part-07/chapter-03")
surface_rows = list(csv.DictReader((asset_dir / "p7-3-surface-patches.zh.csv").open(encoding="utf-8")))
review_rows = list(csv.DictReader((asset_dir / "p7-3-error-review.zh.csv").open(encoding="utf-8")))
action_rows = list(csv.DictReader((asset_dir / "p7-3-followup-actions.zh.csv").open(encoding="utf-8")))

target_id = "평가-결함-약함"
label_name = {0: "正常表面", 1: "划痕警告"}
training_patterns = {row["pattern_name"] for row in surface_rows if row["split"] == "train"}

def action_category(action):
    if any(term in action for term in ["학습 데이터", "변형 추가", "라벨", "hard negative", "평가 묶음", "조도 구간"]):
        return "数据覆盖"
    if any(term in action for term in ["정규화", "전처리", "촬영"]):
        return "表示"
    if "공간 구조" in action or "모델" in action:
        return "模型族"
    return "需要澄清"

records = []
for row in review_rows:
    actual, predicted = int(row["true_label"]), int(row["pred_label"])
    records.append({"sample": row["sample"], "pattern": row["pattern_name"], "actual": actual,
                    "predicted": predicted, "probabilities": [float(row["class_0_prob"]), float(row["class_1_prob"])],
                    "margin": float(row["confidence_margin"]), "review_needed": row["review_needed"] == "예",
                    "incorrect": actual != predicted})

target = next(record for record in records if record["sample"] == target_id)
actions = [{"action": row["action"], "category": action_category(row["action"]), "reason": row["reason"]} for row in action_rows]
summary = {"evaluation_samples": len(records), "incorrect_samples": sum(row["incorrect"] for row in records),
           "review_candidates": sum(row["review_needed"] for row in records),
           "incorrect_and_review": sum(row["incorrect"] and row["review_needed"] for row in records),
           "follow_up_actions": len(actions)}

print("复核摘要 =", summary)
print("目标错误 =", {"sample": target["sample"], "actual": label_name[target["actual"]], "predicted": label_name[target["predicted"]],
                   "probabilities": target["probabilities"], "margin": target["margin"], "incorrect": target["incorrect"],
                   "weak_defect": target["pattern"] == "약한 스크래치", "pattern_present_in_training": target["pattern"] in training_patterns})
print("前三项行动 =", [action["category"] for action in actions[:3]])

当前文件给出的事实为:36 个评估样本、14 个错误、22 个审查候选、14 个同时错误且需审查的样本,以及 36 项后续行动。目标弱划痕不在训练模式中;前三项行动属于数据覆盖、数据覆盖和模型族。

前三项行动只是候选方案,不是已验证的补救措施。它们建议增加弱划痕案例、增加阴影加缺陷变体,并检查能够读取空间结构的模型。因此,记录明确区分:弱划痕是观察到的错误;数据覆盖不足和局部结构模型是下一步待测假设。

错误、审查候选与稳定参考

状态 含义 下一步如何使用
错误 预测与已知标签不一致。 保留为必需回归案例。
正确但需审查 某个信号要求检查。 保留为预防性回归案例。
正确且稳定 当前没有触发审查条件。 作为非预期回归参考。
标签不确定 标签规则或来源证据不完整。 归因给模型前先解决标签证据。

审查候选可以多于错误行。正确但边际低的案例是预防性证据,不应写成错误;相反,高置信度错误也可能更紧急,因为模型在当前边界的错误一侧很坚定。

不要过度解释置信度

类别概率差是训练模型的分数,可用于排序案例,但不是物理缺陷存在的校准概率。

概率模式 安全读法 不安全读法
弱划痕 0.730 / 0.270 当前分类器偏向正常。 现实中只有 27% 的缺陷可能。
接近相等 在当前表示下模型分离很少。 标签必然含糊。
高置信度错误 当前模型强烈偏向错误类别。 来源标签一定错误。

弱划痕边际 0.459 不低于 P7-3.1 的小边际阈值,但仍是错误。这提醒我们:审查条件必须包含错分,不能只看低边际。

比较数据试验与结构试验

试验 改变 固定证据 回答的问题
弱数据扩展 添加弱划痕与阴影边界补丁。 展平方式和错误参考。 数据覆盖能否恢复弱划痕?
空间轮廓比较 用明确空间汇总代替 64 原始值。 相同划分与简单分类器。 紧凑空间关系是否足够?
CNN 比较 使用保留局部性的模型。 数据版本与回归案例。 显式局部表示是否改变错误?
更宽上下文 仅在任务需要时增加上下文。 局部补丁参考。 远距离区域是否改变决策?

若运行多个试验,不能把它们的分数当作同一个实验比较。每项都应说明改变的组件、稳定参考和新出现的错误。

数据增加也需要反例

只增加正向弱划痕案例可能让小练习看似更容易,却没有教会模型拒绝相似的正常变化。每种弱划痕应考虑附近正常或阴影族。

新增组 标签 为什么加入
中央淡划痕 1 覆盖主要漏检模式。
偏移淡划痕 1 测试位置依赖。
阴影正常 0 防止变暗成为捷径。
阴影加划痕 1 测试干扰与缺陷组合。

每个新增组都应记录来源和标注依据。否则后来的恢复无法与任务定义变化区分。

最终复核问题

  • 能否从复核 CSV 找回准确错误样本?
  • 是否区分了错误行与正确但低边际的行?
  • 下一行动是否说明改变数据、表示还是模型结构?
  • 弱划痕和阴影正常是否都保留为回归测试?
  • 选择的模型族是否匹配有文档的输入关系?
  • 结论是否限制在当前合成补丁证据?

小结

模型族选择从错误样本开始,而不是从流行架构开始。对本练习而言,局部弱划痕打开了 CNN 的可检验问题;它没有证明 CNN 必然更好,更没有证明序列或注意力模型无用。

先保存错误和稳定参考,再把数据、表示与模型假设分开,最后通过只改变一个组件的比较更新判断。这样,架构名称才会服务于项目证据。

用项目问题而不是名称开始

面对 CNN、序列和注意力等名称时,最容易犯的错误是先问“哪个更先进”。更有用的起点是输入中哪些关系必须保留,以及当前错误是否真的指向那种关系。

起始问题 对本节案例的回答 不应跳过的检查
输入是什么? 8×8 灰度表面补丁。 样本是否保留二维位置?
错误是什么? 弱划痕被预测为正常。 标签、样本 ID 与概率是否一致?
哪种关系可能遗漏? 相邻像素的局部淡暗带。 训练是否已有可比边界案例?
首个结构假设? 局部性可能重要。 能否以固定数据比较该假设?
尚未支持的主张? 远距离上下文必然重要。 需要什么额外证据?

这种顺序能让模型选择回到观察到的输入与错误。它也允许结论是“当前证据不足”,而不是被迫在三个模型族中选一个赢家。

CNN 的问题形式

CNN 不是“图像就必须使用”的同义词。它提出的是一个可测试问题:如果邻近像素组合形成有意义的局部图案,保留这种邻域结构是否会改变固定错误案例?

证据 可以支持的下一步 仍不能支持的结论
淡纵向划痕具有局部位置。 比较局部空间表示或小型 CNN。 CNN 在所有视觉任务中最佳。
展平后出现弱划痕漏检。 检查展平与局部关系。 展平必然是唯一原因。
阴影正常仍正确。 把它保留为误报参考。 新模型不会产生任何阴影误报。

序列模型需要真实顺序

序列模型适合前后位置的交换会改变意义的任务,例如按时间记录的传感器读数、词语顺序或操作步骤。把二维图像按行扫描成一个向量,不会自动创造这种语义顺序。

输入情境 顺序是否有原始含义 序列模型问题是否直接
温度传感器随时间变化 是。 是。
一句话中的词序 是。 是。
8×8 表面补丁的行扫描 否,只是存储方式。 不直接。
生产线上的连续帧 可能有。 需要记录时间关系后再判断。

这不表示序列方法不能参与视觉项目。若任务改为观察补丁随时间的变化,或相机扫描顺序本身具有物理含义,序列关系就应成为独立的项目问题。

注意力模型需要关系证据

注意力模型族适合直接比较相距很远的元素。在只有 8×8 局部补丁的练习中,远距离关系尚未被记录为错误来源,因此它不是首个优先级。

可能的更宽上下文 需要先收集的证据
同一表面不同区域是否共同决定标签。 标出哪些分离区域在错误样本中相关。
缺陷是否只能由相邻补丁比较判断。 保存成对或多补丁的评估记录。
长距离照明模式是否影响判断。 区分照明变化与真实缺陷标签。
多个时间点是否必须直接关联。 记录时间间隔与任务规则。

没有这些证据时,直接加入注意力模块只是扩大复杂度,不会使当前弱划痕解释更清楚。

计算与维护也是比较条件

项目选择不只比较准确率。训练时间、输入量、调试难度、标注成本和部署限制都应成为明确条件。

比较维度 本练习中的记录方式
数据量 12 个训练补丁与 4 个固定评估补丁。
计算成本 小型教学运行;不能外推真实部署成本。
实现复杂度 先写清数据与表示,再增加模型组件。
复核成本 每个候选都要输出样本级预测。
维护成本 数据版本、标签规则和回归案例必须可找到。

当两个候选在固定回归集上都没有清楚改善时,较复杂者不应仅因名称而获胜。

将结果写成比较表

每次试验结束后,用相同字段写结果,而不是只保存一个新的准确率。

字段 数据扩展试验 表示试验 CNN 试验
单一修改 新增指定边界训练补丁。 改为已说明的空间汇总。 改为局部空间模型。
固定内容 测试补丁与标签。 数据版本与分类器范围。 数据版本与回归样本。
弱划痕 正确、错误或未运行。 正确、错误或未运行。 正确、错误或未运行。
阴影正常 稳定或新误报。 稳定或新误报。 稳定或新误报。
限制 小样本与合成范围。 特征选择仍需说明。 训练条件与数据量仍有限。

这样的表使“恢复”与“新错误”都可见,也让读者能判断比较是否公平。

复核会议的提问顺序

  1. 先展示目标错误的输入、标签、预测、概率和边际。
  2. 再展示训练集中是否存在相同或相近模式。
  3. 说明当前表示保留了什么、隐藏了什么。
  4. 选择一个与输入关系匹配的候选模型族。
  5. 明确固定的弱划痕和阴影正常参考。
  6. 运行后报告所有样本转变,而不是只报告平均值。
  7. 把未解决内容保留为下一轮问题。

该顺序避免会议从架构偏好开始,也避免把尚未验证的解释写成既成事实。

学习产出检查

完成本节后,读者应能交付以下内容。

  • 一张区分局部性、顺序和远距离关系的模型族表。
  • 一条包含弱划痕事实与有限解释的回顾陈述。
  • 一个把数据、表示、模型族分开的错误记录。
  • 一个只改变一个组件的下一次试验计划。
  • 一组包括弱划痕与阴影正常的固定回归样本。
  • 一句明确说明当前小型数据范围限制的话。

如果交付物只能写“试试 CNN”,说明比较问题还没有被定义。回到错误记录,补齐输入关系、固定条件和判定标准。

提交前检查

  • 两个中文流程图是否都由正文中的同一错误案例解释?
  • 代码摘要是否把候选行动与已验证结果分开?
  • 表格是否明确 CNN、序列与注意力各自需要的关系证据?
  • 是否把弱划痕和阴影正常写成固定参考,而非一次性例子?
  • 是否说明小型合成数据不能证明生产性能?

通过这些检查后,模型族讨论才具有可审查的项目边界。

记住三条原则

局部关系需要局部证据。 顺序关系需要顺序语义。 远距离关系需要远距离影响的证据。

错误样本决定下一问题。 固定参考决定比较是否可信。 单一总分不能代替样本级审查。

先记录。 再比较。 后解释。

这也是本节所有候选试验的共同纪律。

来源与参考

本节的数据和示例为本书创建的练习材料。