- 教程
- 机器学习
- 深度学习
【免费下载链接】thereisnospoon
A machine learning primer built from first principles. For engineers who want to reason about ML systems the way they reason about software systems.
正在构建机器学习系统时,很多人把精力花在"选哪个模型"上,却忽略了更前置的一步:数据要先进入正确形状。There Is No Spoon 是一个从第一性原理构建的机器学习入门项目,面向工程师讲解如何像推理软件系统一样推理 ML 系统,其中 ml-primer.md 的 Encoding 章节把"分词器、图像 patch、多模态对齐"讲得尤其透彻——这篇专题带你完整读懂它。
为什么"形状"决定模型上限:编码器的三个核心决策
在 There Is No Spoon 的心智模型里,编码器把原始数据转换成下游架构能操作的向量格式,它决定了模型的能力天花板——模型只能从编码器保留下来的信息中学习(ml-primer.md#L498-L504)。
选编码器之前,要先回答三个问题:
| 决策 | 含义 | 典型例子 |
|---|---|---|
| 什么是"一个元素" | 粒度(granularity) | 词?子词?像素?16×16 的 patch? |
| 每个元素的向量捕捉什么 | 原始信号 vs 上下文化表示 | 原始像素 vs 语义化 token 嵌入 |
| 保留了哪些结构信息 | 顺序、邻接关系、层级 | 文本顺序、图像空间邻接、分子拓扑 |
项目有一句非常关键的设计原则(ml-primer.md#L504):
编码器必须保留你需要的东西,而这个判断要在选编码器之前做,而不是之后。
一个为某个目标预训练的编码器,可能会主动销毁另一个任务所需的信息。有了端到端训练,梯度会告诉编码器"下游到底需要什么";没有端到端训练,你就是在手工雕琢一个接口。
完整的主题地图见 SYLLABUS.md,其中 "Encoding: Getting Data Into the Right Shape" 一节明确把编码器与架构的配对视为联合设计决策(SYLLABUS.md#L82-L86)。
文本如何进入正确形状:分词器把字符串变成向量序列
文本模态的标准流程是(ml-primer.md#L507):
原始文本 ──分词器(BPE/WordPiece/SentencePiece)──> 子词 token 序列 └── 每个 token 查学习到的嵌入表 ──> 向量序列 → Transformer三个工程要点:
- 子词分词(BPE、WordPiece、SentencePiece):把开放词表问题变成有限词表,同时保留构词能力,未登录词也不会 OOV。
- 分词方式决定模型"看得见什么":
unhappy是一个 token,还是un+happy两个 token?前者模型只能把它当整体处理;后者前缀结构可见,组合语义才有可能被学习。 - 代码等结构化文本需要专门照顾:好的分词器要能保留缩进、不拆开关键字(ml-primer.md#L656 的"代码生成"实战案例)。
Token 嵌入之后,token 之间的关系靠点积对齐来表达——两个向量越"同向",语义越相关。这正是分词器 + 嵌入表 + 注意力能组合出语义理解的最小闭环。
图像如何进入正确形状:像素网格与图像 Patch 两种路线
图像有两条主流路线,对应两种归纳偏置(ml-primer.md#L508):
| 路线 | 元素定义 | 匹配架构 | 隐含假设 |
|---|---|---|---|
| 像素网格 | 每个像素(含局部邻域) | CNN | 局部性 + 平移不变性 |
| 图像 patch | 16×16 像素块投影成一个向量 | ViT(Vision Transformer) | patch 之间靠注意力动态路由 |
图像 patch 是粒度权衡:16×16 是业界标准值。
- patch 太大 → 细粒度信息在投影时就被丢掉;
- patch 太小 → 序列长度暴涨,attention 的二次方成本失控。
一个实用的混合做法(ml-primer.md#L695):ViT 用卷积做 patch embedding 负责局部,再用 attention 负责 patch 间的全局路由——"每一层用最便宜的操作捕捉该层级的结构"。
多模态对齐:投影容易,对齐才是难的部分
给系统加一个新模态(文本 + 图像、代码 + 文档),这是一个编码器问题,不是架构问题——核心模型通常不变(ml-primer.md#L770-L779)。
难点在于(ml-primer.md#L512):
- 投影是容易的:每个模态一个 adapter,投影到共享维度即可。
- 对齐是难的:如何保证"语义匹配的跨模态输入落在共享空间的同一区域"?
- 对比学习提供对齐信号:CLIP 式训练把匹配对拉近、不匹配对推远,这是让不同模态"说同一种向量语言"的梯度来源。
- 落地形态:GPT-4o、Gemini 这类系统,就是把多个对齐后的编码器喂进同一个共享 Transformer。
对齐之后,FFN 层在共享表示空间里做"容积式查表",应用存储的知识——模态差异被抹平为统一的向量几何(ml-primer.md#L472-L480)。
一张表总结:四种模态的编码器选择
| 模态 | 编码器方案 | 关键权衡 | 易踩的坑 |
|---|---|---|---|
| 文本 | 子词分词(BPE 等)+ 学习嵌入 | 词表大小 vs 组合可见性 | 关键字被拆开、顺序信息丢失 |
| 图像 | CNN 用像素网格;ViT 用 16×16 patch | patch 粒度 vs 序列成本 | patch 过粗丢细节 |
| 音频 | 转频谱图(时间-频率图像)+ 卷积前端或 patch 嵌入 | 时间分辨率 vs 频率分辨率 | 把波形直接当一维序列 |
| 图结构 | 定义节点/边/特征,结构本身就是编码 | 需要领域知识 | 特征选错 → 天花板锁死 |
(依据 ml-primer.md#L506-L510 与各模态实战案例 ml-primer.md#L610-L685)
动手之前记住的 3 条核心原则
- 先定"要保留什么",再选编码器——编码器决定模型上限,事后补救代价最高。
- 编码器与架构是联合设计决策:卷积要局部性,attention 要内容动态路由,patch 大小直接改写两者的工作分工。
- 优先端到端训练:让梯度替你回答"下游需要什么",否则多模态对齐、编码器-模型接口都是在手工雕琢。
想更深入?把 ml-primer.md 交给你的 AI 编程助手,围绕 "Encoding" 一节对话式探索,是这个项目推荐的学法(README.md "How to Use This")。
延伸阅读:项目内相关资料
- 教程正文(本专题核心来源):ml-primer.md
- 完整主题地图:SYLLABUS.md
- 注意力机制可视化脚本:scripts/05_attention_mechanism.py
- FFN 容积式查表脚本:scripts/06_ffn_volumetric.py
- 点积对齐脚本:scripts/09_dot_product.py
- 组合规则对比脚本:scripts/12_combination_rules.py
- 项目介绍与阅读建议:README.md
- 教程
- 机器学习
- 深度学习
【免费下载链接】thereisnospoon
A machine learning primer built from first principles. For engineers who want to reason about ML systems the way they reason about software systems.
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考