目标实验目标
分两段:先搭一台最简 Transformer(注意力管通信、FFN 管加工、位置编码补顺序),再搞懂模型眼里的「字」——为什么 strawberry 数不对 r 的个数。
- 理解只靠注意力还不够:它能汇总上下文,却缺少「汇总后的逐词加工」
- 看清位置编码为什么必须存在:没有它,模型分不清「猫追狗」和「狗追猫」
- 亲手走一遍 BPE:数频率 → 合并最常见的一对 → 重复到词表攒够
课堂问题顶尖大模型为什么常常算错「strawberry 里有几个 r」?不是它语文没学好——是这一步把字母弄丢了。
1搭一条主干:一个词怎么变成下一个词
点「下一块零件」,从输入到输出逐层点亮,看每个零件是被什么问题逼出来的。
为什么需要这块零件
点击「下一块零件」开始搭建…
形状检查
输入的形状—
输出的形状—
输入和输出维度一样,所以 block 才能一层一层往上叠。
2位置编码:把顺序塞回输入
Transformer 并行处理整排词,优势是快,副作用是——它不知道谁在前谁在后。「猫追狗」和「狗追猫」用的是同一批词,意思却反过来。
不加位置编码
猫追狗
狗追猫
两句话的词袋完全相同,模型无法区分。
加上位置编码
猫@0追@1狗@2
狗@0追@1猫@2
「猫@0」和「猫@2」不再是同一个向量,两句话终于被区分开。
真正的输入 = 词向量(是什么词) + 位置向量(排第几个)
3分词:模型眼里的字是什么
模型读不了文字,只读得了向量。它内部有一张有限的对照表,所以文字进门第一步,必须先切成「表里查得到的单元」。
按「词」切
internationalization
词表约百万+;没见过的词直接变 [UNK],信息全丢。
按「字符」切
词表仅几千;但序列暴长,注意力 O(n²) 成本翻几倍。
子词(BPE)
internationalization
常见片段拼装,词表约 5 万,永不「完全不认识」。
4手走 BPE:数频率 → 合并
用三句迷你语料,手动走两轮「数 → 合并」,看词表怎么长出来。
迷你语料
①我爱吃苹果,苹果很甜。
②红苹果和绿苹果都是水果。
③水果店卖水果。
第 0 轮 · 尚未合并
「苹果是水果」的切分过程
几万轮之后高频词整个变成一个 token,「苹果」「水果」都是单 token;中频词留成常见片段,生僻字才碎到单字。既不爆词表,也不会「完全不认识」。
5掀开真相:模型其实只看到一串整数
切出 token 只是第一步。每个 token 在词表里有个固定编号(ID),模型真正吃进去的是整数。
① 文本I love strawberry
→
② 切成 tokenI · love · straw · berry
→
③ 查编号 ID40 · 3047 · 7124 · 15717
→
④ 查嵌入表向量
→
⑤ 注意力层+ 位置
谜题解开了「strawberry」被切成 straw + berry 两个 token、变成两个整数。字母 r 从一开始就没进过模型的视野——它答不准,不是笨,是因为这道题问的东西,在它的输入里压根不存在。
英文:The quick brown fox
Thequickbrownfox
→ 4 tokens
中文:那只敏捷的棕色狐狸
那只敏捷的棕色狐狸
→ 8 tokens(多数汉字要 1 个甚至更多)
挑战实验课挑战
挑战 1 · 少了位置会怎样
如果去掉位置编码,模型能区分「猫追狗」和「狗追猫」吗?为什么?
如果去掉位置编码,模型能区分「猫追狗」和「狗追猫」吗?为什么?
挑战 2 · 预测下一轮
BPE 走完两轮后,猜猜第三轮会合并哪一对?在语料里数一数验证。
BPE 走完两轮后,猜猜第三轮会合并哪一对?在语料里数一数验证。
挑战 3 · 数的能力
模型把 strawberry 当成 2 个 token。请解释「数字母 / 逆序拼写 / 藏头」这三类任务为什么都会栽。
模型把 strawberry 当成 2 个 token。请解释「数字母 / 逆序拼写 / 藏头」这三类任务为什么都会栽。
挑战 4 · 中文更费钱
同一句话中文比英文多花一倍 token。这直接影响上下文窗口和计费,怎么缓解?
同一句话中文比英文多花一倍 token。这直接影响上下文窗口和计费,怎么缓解?