Study Notes / 2026 ・ No.02
模型札记
绘画・视频・代码 ── 擅长的领域由什么决定
发布
同样是 Transformer 这一套底座
决定擅长领域的不是结构,而是让它去猜什么
会画画的模型、能生成视频的模型、擅长写代码的模型。
差别究竟从哪里来?分六章追下去。
原理的前提整理在第 1 期《LLM 札记》。
擅长由什么决定
这不是「聪明的模型/不聪明的模型」之分。真正起决定作用的是三点:让它猜什么、给它看什么,以及正确与否能不能由机器判定。
底座反而越来越一致
可能有些意外:如今主流的图像与视频模型,内部同样是 Transformer。把图像切成一个个小方块(patch),当成一串序列来处理,就能用上和文字一样的那台机器。所以「画画的模型」和「说话的模型」,从零件上看非常相似。
不同的是,让这台机器练了什么。
三个旋钮
| 类型 | 让它猜什么 | 主要数据 | 评分 |
|---|---|---|---|
| 语言 | 下一个词元 | 文本 | 只有一部分能自动 |
| 代码 | 下一个词元/填空 | 代码、题目、运行结果 | 自动 测试是否通过 |
| 图像 | 被加上去的噪声 | 图像+说明文的配对 | 以人的偏好为主 |
| 视频 | 时空上被加的噪声 | 视频+说明文的配对 | 以人的偏好为主 |
这张表最右边一列,几乎就等于进步的速度。能由机器评分的领域,不必等人,可以把练习跑上千万遍。代码和数学一路突飞猛进,原因基本就在这里。
会画画的模型
语言模型是从左到右一个词一个词地写,图像模型则是整张一起,从模糊走向清晰。这种方式叫扩散模型(diffusion)。
训练就是「猜出加了什么噪声」
它做的事,一行就说得完。
正确答案(加进去的噪声)是自己造的,不需要人来标注。这和第 1 期里「答案就在数据里」是同一个格局。所以图像这边同样可以无限扩充数据。
为什么能用语言指挥
关键在于把文字和图像放进同一个坐标系。收集海量的「图像+说明文」配对,训练坐标使得对应的一组彼此靠近、不相干的一组彼此远离(对比学习,代表就是 CLIP)。
这个空间一旦建立,就能把「黄昏的港口」这句话变成一个向量,再以它为路标去减噪声。语言成了指引雕刻方向的罗盘。
决定成品质量的,其实也包括说明文的质量。比起只写「狗」的图片,连构图和光线都写清楚的图片,能把文字与画面的对应教得细致得多。
潜空间 — 直接处理像素太重
1024×1024 的像素直接算,成本撑不住。于是先用另一个网络把它压缩成长宽各约 1/8 的潜空间,在那里做扩散,最后再还原成图像。个人电脑能跑图像生成,靠的就是这一手。
为什么文字和手曾经画不好
扩散是不断堆叠「此处看起来像不像」的方式。只要局部说得过去,损失就会下降。可文字要求的是精确的排列,差一笔意思就坏了。手也一样,五根这种数量约束,靠局部的像不像是守不住的。
近年之所以改善,是因为把文字侧的编码器做大、把说明文的质量提上去、把模型本身做大。与其说机制变了,不如说是把资源投到了原本的短板上。
会做视频的模型
视频并不是「一串图片」。多出一个维度之后,难度的性质就变了。
难点① 量
512×512 的画面,每秒 24 帧,做 5 秒,要处理的信息量就超过单张图的一百倍。第 1 期・二章说的平方成本在这里照样发作,时长翻倍,算力远不止翻倍。能生成的长度常常停在几秒到十几秒,卡的就是这堵墙。
难点② 一致性
如果一帧一帧独立地画,下一瞬间就换了个人。于是要让注意力也在时间方向上打通:某一瞬间的画面,要参照前后帧的相同位置来决定。
→ 看着「刚才衣服的颜色」「刚才走路的速度」决定下一帧
实现上,如今主流同样是把时空切成 patch、交给 Transformer 处理(DiT)。这样一来,语言模型上验证过的做大就会变好这条经验规律,在视频上也照样成立。
它并没有学过物理
这一点很容易误解:模型里并没有重力或流体的公式。它只是从海量影像中学到了「掉落的东西看起来是这样」「水是这样流的」这类外观上的规律。
所以常见场景自然得惊人,却会出现东西凭空消失、忽然变多、前后关系互换。像样是满足了,守恒却没有守住——这与第 1 期・四章的幻觉同根同源。
擅长代码的模型
代码之所以特别,不是因为它难,而是因为它可以被评分。跑得起来还是跑不起来,机器能判定。就这一点,拉开了与其他领域的差距。
① 运行结果就是答案
文章的好坏只能由人来定,代码却取决于测试是否通过。于是不必经过奖励模型(第 1 期・三章),可以直接拿正确与否当奖励来训练。不必等人的练习,直接换成了进步的速度。
② 填空式的练习
编辑器里的补全,光会「往下写」是不够的,得看着光标前后把中间补上。所以训练时会故意遮住中间一段,让它从上下文还原,这叫填空(fill-in-the-middle)。
→ 让它从前后还原出「for i in items: s += i」
③ 长上下文,以及上下文之外
真实项目里,用到的函数定义可能在几百行之外,甚至在别的文件里。光把上下文拉长还不够,必须配上去找出需要的文件再交给它的机制,才真正可用。第 1 期・六章的智能体,管的正是这一段。
④ 格式严苛,反而是优势
少一个括号就跑不起来的严苛,反过来说就是错误可以被机器识别。文章那种「总觉得怪」没法量,代码的「跑不了」却能量。能被评价的领域,改进就会不断累积。
怎么读懂意图
把「看起来理解了意图」的部分逐层拆开。先说结论:与其说是理解,不如说是条件化。
① 预训练时读过海量的「对话套路」
网络上有无数的提问与回答、咨询与建议、习题与讲解。在练习猜下一个词的过程中,「这样问,就该这样答」的套路本身被学了进去。
② 后训练让它站到回答者的位置上
裸模型甚至会用问题回应问题。用「指令+示范回答」的配对继续训练,再用人的评价打磨(第 1 期・三章)。到这一步,被问就回答的站位才固定下来。
③ 实际的推断 —— 给线索加权
从输入里能读出的,远多于字面写下的内容。
- 用词与礼貌程度 ── 对方的位置,以及期望的距离感
- 贴进来的代码是什么语言、什么框架 ── 默认的环境
- 有没有专业术语 ── 该讲到多细
- 此前的往来 ── 眼下正在做的是什么
注意力给这些线索加权,生成在这个上下文里最可能的下文。所谓「读懂意图」,实体就是这套加权。
所以没写出来的东西就不存在。含糊地丢过去,模型就会靠向「这样说话的人最常见的意图」。只补一行读者、目的、格式,结果就会不一样,道理正在于此。
④ 它会不会察觉含糊
近来的模型也学会了在前提不足时反问。但那与其说是「知道自己不知道」,不如说是反问能拿到更高的评价这一学习结果。别太指望它,自己把前提写清楚更稳妥。
怎么找出缺陷
找 bug 这件事,是由性质不同的三层叠起来才成立的。
第一层 典型形态的记忆
训练数据里含有大量公开仓库的修复提交:「坏掉的样子」和「修好的样子」成对排列。从中学到的是边界差一位、未检查的 null、忘记释放的资源、被吞掉的异常这类典型形态。
这属于知识型的检出,快,而且覆盖面广。
第二层 看语义上的错位
更接近人类评审的是这一层:把名字、注释、类型、调用方的预期与实际的处理放在一起对照。
linter 只能说「floor 是个合法函数」。能抓到这里,是因为它把注释与代码放在同一段上下文里互相印证。
第三层 真的跑一遍
光读是有极限的。写测试跑一遍、复现报错、读栈追踪来收敛假设——第 1 期・六章的智能体承担的就是这一层。有了这道把猜测变成验证的工序,精度才够用。
擅长与不擅长
| 检出难度 | 缺陷类型 |
|---|---|
| 易 | 典型形态(边界差一位、未检查 null、资源未释放、异常被吞) |
| 易 | 注释、函数名、类型与实现之间的错位 |
| 中 | 边界条件、错误处理缺失、输入校验遗漏 |
| 难 | 并发竞争、依赖时序的问题 |
| 难 | 成因在上下文之外的(配置、运行环境、调用方) |
与静态分析的分工
linter 和类型检查是一套规则的集合:覆盖完整、可复现,但规则之外看不见。模型能抓到读一遍就明白的错位,却没有覆盖性,而且每次运行说法可能不同。
性质正好相反,所以现实的做法不是替换而是叠加:能机械衡量的交给静态分析,模型负责看「意图与实现之间的偏差」。
它也会给出看着很像回事的误报(第 1 期・四章)。实务上有三招能提高精度:只把 diff 交给它、要求每条意见附上对应行的引用、重要的用测试复现一遍。
结 — 一页总结
- 底座都在向 Transformer 靠拢。拉开差距的是让它猜什么与给它看什么。
- 图像练的是猜出加进去的噪声。之所以能用语言指挥,是因为把文字和画面放进了同一个坐标系。
- 视频多出一个维度,靠时间方向上的参照维持一致性,但它并没有学过物理。
- 代码进步快不是因为难,而是因为有测试这种自动评分。
- 对意图的理解是条件化。没写出来的就不存在,所以要写清读者、目的、格式。
- 缺陷检出是典型形态的记忆、语义错位、运行验证三层。
- 它与静态分析性质相反,不要替换,叠着用。
模型札记 — 全六章 / 2026.09