乐于分享
好东西不私藏

「用初中数学讲明白AI」第2章:机器怎么认字——把文字变成数字的三步

「用初中数学讲明白AI」第2章:机器怎么认字——把文字变成数字的三步

单击上方图灵人工智能”,选择“星标”公众号

您想知道的人工智能干货,第一时间送达

仅用于学术分享,如有侵权留言删除

📚 「大兰写给小兰的暑假阅读:用初中数学讲明白AI」

昨天,第1章发出之后反响很好,感谢大家的喜欢。今天趁热打铁把第2章也赶出来,发完这篇,周末就可以安心休息了。

一个残酷的事实:机器不认字

上一章我们聊了一件挺爽的事——大模型的全部工作就是"猜下一个词"。原理简洁得像诗。

但我故意藏了一个问题没说。

机器根本不认识字。

你跟它说"今天天气真好",它的内心毫无波澜。它看到的不是五个汉字,是一坨乱码般的二进制信号,跟你翻开一本古埃及象形文字典的感受差不多。它的世界里只有数字——0和1,加减乘除,别的一概不认。

你可能会说:不对啊,我跟ChatGPT聊天聊得好好的,它明明"认识"中文。

它不认识。它只是把中文先偷偷翻译成了一堆数字,在数字的世界里算了一通,算完了再把结果翻译回文字给你看。

这个"翻译"过程,就是今天要讲的事。

说出来只有三步。听起来好像很枯燥——分个词、编个号、搞个坐标,数据库入门课的味道。但我要提前剧透一下:这三步里藏着一个让我第一次读到时脊背发凉的想法。

到时候你会懂。

先说第一步。

分词:中文是一道送命题

要让机器处理文字,第一件事是把句子切成小块。术语叫分词,英文是Tokenization。

英文分词基本属于白给。"I love hotpot",单词之间有空格,按空格咔咔咔三刀,切出三个词,收工。五岁小孩拿把剪刀都能干。

中文就惨了。

中文没有空格。"我爱吃火锅"五个字紧紧挤在一起,机器看到的就是一串不带标记的符号。好比你收到一条字母全连在一起的英文短信——"iloveyoubutialsolovehotpot"——你盯半天才能拆开,机器比你还懵。

好,那最笨的办法:一个字一个字切。"我/爱/吃/火/锅",五刀。简单粗暴,绝不纠结。

但问题来了。"火"和"锅"被分开之后,"火锅"这个概念就没了。"火"在别的地方是火焰,"锅"在别的地方是背锅。你让机器从两个散落的字拼回"火锅是一种食物"这层意思——这不叫分词,这叫出脑筋急转弯。

那按词切呢?"我/爱/吃/火锅",这样就挺好。

直到你遇见——

"南京市长江大桥"。

七个字,怎么切?

"南京市/长江/大桥"——在说一座桥。就是你开车路过、堵车堵到怀疑人生的那种桥。

"南京/市长/江大桥"——在说一个姓江的市长。可能还挺忙,忙着剪彩呢。

两种切法都符合语法,意思差了十万八千里。

人类看一眼上下文就知道是桥还是市长。机器不行。它看到七个字符,表情呆滞,一脸无辜,就跟你交出白卷时的表情一样。

类似的歧义中文里遍地都是。"研究生命的起源"——是"研究/生命的起源",还是"研究生/命的起源"?后者虽然像段子,但机器真的分不清。

所以局面就是这样:按字切,信息丢了;按词切,歧义来了。两头堵,进退两难。

这个困境折磨了中文NLP(自然语言处理)工程师好多年。好多年。直到有人换了个思路——

别纠结"字"还是"词"了。让机器自己学着切。

BPE:让机器自己学着切

BPE,全称Byte Pair Encoding,字节对编码。

名字唬人得很,听着像某种高级加密协议。

实际上呢?它的工作方式特别像小学生学认字——一开始只认字母,后来发现有些字母老是黏在一起出现,就把它们合并了。跟你小时候先学笔画、再认偏旁、最后识字,一个路子。

我说的"特别会省事的拼字游戏",就是它。

来,用一个具体例子走一遍。假设机器面前有这么一堆英文训练文本:

low low low low low

lower lower

newest newest newest

widest widest

一开始,机器的"词表"里只有最小的单元——单个字母:l, o, w, e, r, n, s, t, i, d。就这几个散兵游勇,寒酸得很。

BPE名字里那个B——Byte,字节。真正的大模型初始词表比这还底层,是计算机世界最底层的256个字节,连字母都算不上。任何语言,任何符号,大不了打碎成字节,绝不崩溃。外星文也照收。

然后它开始干一件无聊但重要的事:数数。在所有文本里,哪两个相邻的字母挨在一起出现得最频繁?

第一轮,它发现"l"和"o"紧挨着出现的次数最多("low"出现了7次——5次单独的low,加上2次lower里的low)。

好,"l"和"o"合并,变成一个新单元"lo"。词表多了一位成员。

现在"low"不再是 l-o-w 三个单元了,变成了 lo-w 两个。进步了一丢丢。

第二轮,再数。"lo"和"w"又经常挨在一起。合并,得到"low"。词表再添一员。现在"low"本身就是一个完整的token了——从三块零件焊成了一个整体。

第三轮,也许"e"和"s"频率高(newest、widest里都有es)。合并成"es"。

第四轮,"es"和"t"合并成"est"。

就这样一轮一轮数、一轮一轮合并,直到词表达到你设定的大小——比如5万个——停。

发现规律了没?

常见的搭档被合并成一个token,罕见的组合保持拆散。"low"天天出现,整个就是一个token。而像"serendipity"(意外的惊喜)这种冷僻词,可能被切成"ser""end""ip""ity"——每一小块在别的常见词里出现过,但拼在一起的频率不够高,凑不成一个整体。

这就是BPE的全部逻辑。数频率,合并,再数,再合并。

三岁小孩都能理解。

但我后来想了想,觉得BPE朴素的表面下藏着一个很深的哲学。

以前的做法是什么?是人类工程师手动编词典——"火锅"是一个词,你不许拆;"南京市"是一个词,你不许拆。几万条规则,一条一条写,写到秃头。

BPE的做法是:我不写规则。我让机器自己看几十亿字的文本,发现"火"和"锅"总是黏在一起,于是它自己决定合并。

规则是人定的,切法是机器学的。

记住这句话。后面你会反复看到类似的设计思路——能让机器自己学的事,人就绝不手动指定。这是整个大模型时代的底层信仰,几乎带有宗教色彩。

早期的GPT系列(如GPT-3)词表大约5万个token。全世界几十种语言、上百万个词汇,5万个token怎么够?

够的。BPE的底线是永远保留最基础的字符。任何从未见过的新词,最坏的情况就是被拆成一个字母一个字母——丑是丑了点,但绝不会出现"完全不认识"的死局。有底裤穿,就不会裸奔。

顺便说一个有意思的冷知识。

因为GPT的训练数据里英文远多于中文,BPE在合并的时候,英文的字母组合被合并得更充分。结果就是:同样一句话,英文可能10个token搞定,翻译成中文要20多个token。

一模一样的意思,中文占的token数差不多是英文的两倍。

这意味着什么?GPT处理中文天生就"费劲"——不是中文比英文难,是训练数据偏科了。就像一个学生数学题做了一万道、语文题只做了一千道,你不能怪他语文考不好,你只能怪试卷分配不公平。

双倍差距在早期比较明显,但在大模型发展到 2026 年的今天,OpenAI 等厂商已经将词表从 GPT-3 时代的 5 万个扩充到了 10 万个以上(GPT-4 的 cl100k_base 词典约有 10 万 token),大幅优化了中文的 Token 效率。国产大模型词表普遍在 10 万到 15 万以上。

国产大模型——通义千问、DeepSeek这些——中文训练数据多,切中文就高效得多。主场作战,连分词都占便宜。

好了。到这里,句子已经被切成了一块一块的token,每个token有了一个编号。"火锅"是42号,"月亮"是7号,"猫"是1523号。

很多人到这一步觉得完事了——数字有了嘛,塞进模型开始算就行了嘛。

但真正让我震撼的部分,才刚刚开始。

词嵌入:数学居然能算出语义

42号和7号,差35。

这个35是什么意思?"火锅"比"月亮"大35?"火锅"减去"月亮"等于"板凳"?

毫无意义。

编号只是标签,就跟你的身份证号一样——你的身份证号比你同桌大两千万,不代表你这个人比同桌大两千万。编号之间没有任何语义关系。

可我们需要的不只是"机器知道这个token是谁",还需要它知道"这个token跟其他token是什么关系"。

猫和狗很像——都是动物、都是宠物、都会被人类拍照发朋友圈。猫和卡车八竿子打不着。这种远近亲疏,光靠编号表达不了。

怎么办?

第三步来了——词嵌入(Word Embedding)。

这位才是真正的狠角色。给概念贴个标签的话,词嵌入就是一个"把文字翻译成数学"的翻译官。

它干的事是:不给每个token一个编号,给它一个坐标

我用一个简化到极致的例子来说明。假设我们只用二维坐标来表示词——就是初中数学里那个平面直角坐标系,x轴y轴,你考试画过无数遍的那个。

把几个词往坐标纸上一放:

  • "猫"在 (0.2, 0.8)
  • "狗"在 (0.3, 0.7)
  • "卡车"在 (0.9, 0.1)

你看出来了吧?猫和狗挨得很近,卡车离它们远得很。

为什么?因为猫和狗经常出现在相似的句子里——"我家养了一只猫/狗""猫/狗粮打折了""被猫/狗挠了一下"。而卡车基本不会出现在这些语境里(除非你养了一只非常大的猫)。

词嵌入的核心思想浓缩成一句话:用一组数字(一个向量)来表示一个词,让意思相近的词在数字空间里距离也相近。

好了,说到距离——来,让我们真的用初中数学算一遍。

猫 (0.2, 0.8) 和狗 (0.3, 0.7) 之间的距离,用勾股定理

猫 (0.2, 0.8) 和卡车 (0.9, 0.1) 之间的距离:

0.14 对 0.99。猫到狗的距离,只有猫到卡车距离的七分之一。

初中数学。勾股定理。就这么点东西,就能度量两个词在语义上是亲近还是疏远。

在真正的七百多维空间里,科学家们主要看的是两个向量指的方向是不是一致,而不是绝对距离——专业术语叫余弦相似度。但背后的思想和初中数学的距离是一脉相承的。

有没有觉得这件事有点离谱?

语义,那个模糊的、暧昧的、只可意会不可言传的东西,居然能用直角三角形的斜边长度来衡量。

我第一次算完这道题的时候愣了挺久。

当然,实际的大模型不是用二维来表示一个词。GPT-2用768维,GPT-3用12288维。也就是说,"猫"这个token在模型里不是两个数字,而是一串768个(甚至一万多个)小数:

[0.23, -1.07, 0.55, 0.89, -0.34, ..., 0.17]

768个数字,共同编码了"猫"的全部语义信息。

这768个维度各自代表什么含义?第1维是大小?第2维是可爱程度?第3维是能不能吃?

说实话,没人知道。这些维度之间的分工是模糊的、交织的、没法用人话解释的。但机器不在乎。它能分清猫和卡车、快乐和悲伤、巴黎和东京,这就够了。

人类看不懂没关系。谁规定翻译官的笔记本必须让旁观者也看得懂?

然后——整个故事里最让我目瞪口呆的事情来了。

2013年,Google的研究人员发现,当每个词变成向量之后,向量之间可以做加减法。

向量加减法本身不稀奇,初中数学就有。稀奇的是——算出来的结果居然有语义上的意义

他们算了这么一道题:

vec("国王") - vec("男") + vec("女") = ?

等号右边,在整个词表里找距离最近的向量,对应的词是——

"女王"。

你没看错。国王减去男加上女,约等于女王。

数学居然能算出性别关系。

怎么理解呢?在向量空间里,"国王"到"男"的方向,和"女王"到"女"的方向,几乎是平行的。它们之间存在某种"性别维度"。沿着这个方向平移,就能完成性别的转换。

不只是性别。类似的数学关系到处都有:

vec("巴黎") - vec("法国") + vec("日本") ≈ vec("东京")

国家和首都的关系,也被向量空间自动编码了。

没有人教它"巴黎是法国的首都"这条知识。它只是读了几千亿字的文本,发现"巴黎"和"法国"出现的语境关系,跟"东京"和"日本"出现的语境关系高度相似。于是向量自然就摆成了对称的几何结构。

从文字中来,到数学中去。

这就是我前面说的那个"脊背发凉"的想法——词嵌入不是简单地给文字贴个数字标签,它是把语义关系变成了几何关系。同义词靠近,反义词对称,类比关系平行。人类语言里那些微妙的、暧昧的、只可意会的东西,居然可以用坐标系里的距离和方向来精确表达。

语文题,真的变成了数学题。

位置编码:谁打了谁,这是个问题

故事还没完。还剩最后一个坑。

看这两句话:

"我打了他。"

"他打了我。"

用到的词完全一样——"我""打""了""他",四个token一模一样。如果只做词嵌入,这两句话得到的向量集合是完全相同的。

但意思天差地别。一个是你动手打人,一个是你挨了揍。一个可能要赔钱,一个可能要住院。

差别在哪?

词的顺序。

词嵌入只管"这个词是什么",不管"这个词在哪个位置"。它是一个没有空间感的翻译官——认识每一个词,但搞不清谁在前谁在后。换句话说,它是一个路痴。

要让机器分清"我打了他"和"他打了我",还需要最后一块拼图:位置编码(Positional Encoding)。

做法出乎意料地简单——给每个位置也分配一个向量。第1个位置有自己的向量,第2个位置有自己的向量,以此类推。然后把词嵌入向量和位置编码向量做加法,叠在一起。

对,就是加法。初中学过的向量加法。

来看"我打了他":

  • "我"的最终向量 = "我"的词嵌入 +第1个位置的编码
  • "打"的最终向量 = "打"的词嵌入 +第2个位置的编码
  • "了"的最终向量 = "了"的词嵌入 +第3个位置的编码
  • "他"的最终向量 = "他"的词嵌入 +第4个位置的编码

再看"他打了我":

  • "他"的最终向量 = "他"的词嵌入 +第1个位置的编码
  • "打"的最终向量 = "打"的词嵌入 +第2个位置的编码
  • "了"的最终向量 = "了"的词嵌入 +第3个位置的编码
  • "我"的最终向量 = "我"的词嵌入 +第4个位置的编码

同样一个"我"字,在第一句话里加的是位置1的编码,在第二句话里加的是位置4的编码。最终向量不同——模型就能分清谁挨打了。

没有位置编码会怎样?

模型会把"狗咬人"和"人咬狗"当成同一件事。

但前者是日常新闻(平平无奇),后者是头条新闻(太阳从西边出来了)。你不会希望AI分不清这个。

位置编码的具体实现有好几种。深度学习早期,工程师通常就让机器自己学位置编码——每个位置长什么样,训练一遍就知道了。但2017年Google发表的Transformer论文嫌这样不够灵活,特意换成了正弦和余弦函数来生成——不同位置用不同频率的波形组合,像指纹一样各不相同,这样即使遇到比训练时更长的句子,模型也不会懵。后来GPT系列又回归了"极简主义",直接让模型自己把位置信息学出来。

又是"让机器自己学"。

你发现了吧?这是大模型设计者的哲学——能让机器自己学的,人就不动手。人类工程师越来越像甩手掌柜,脏活累活全让模型干了。

说不好这是偷懒还是智慧。也许两者之间本来就没什么区别。

回头看一遍:从文字到数字的完整旅程

我们来回顾一下。一句"我爱吃火锅",在喂进大模型之前,到底经历了什么?

第一步,分词:把句子切成token。

"我爱吃火锅" → ["我", "爱", "吃", "火锅"]

(BPE负责决定怎么切。)

第二步,查编号:每个token对应词表里的一个编号。

["我", "爱", "吃", "火锅"] → [8, 203, 56, 42]

(编号本身没有语义含义,只是一个身份标识。)

第三步,词嵌入:通过一张巨大的"查找表",把编号变成向量。

[8, 203, 56, 42] → 四个768维向量

(每个向量里编码了这个词的全部语义信息。猫和狗靠近,猫和卡车远离。)

最后一步,位置编码:给每个向量加上它所在位置的编码向量。

四个768维向量 → 四个"既包含词义、又包含位置"的768维向量

到这里,模型手里拿到的是四个768维的数字向量。每个向量里既有"这个词是什么"的信息,也有"这个词在句子里排第几"的信息。

后面的一切——注意力机制、前馈网络、生成下一个词——全都建立在这些向量之上。所有操作都是向量运算:加法、乘法、点积。没有一个操作超出初中数学的范畴(好吧,维度高了一些,但运算本身就是你学过的那些)。

换句话说,大模型写出来的每一个字、每一句话、每一个标点,全都是算出来的

让机器认字的本质,说到底就一句话——

把语文题变成数学题。

这个转换完成的那一刻,人类语言就进入了数学的地盘。而在数学的地盘上,机器比你我强太多了。这不是谦虚,是事实。你用勾股定理算两个词的距离,算一遍要半分钟。机器一秒钟算几十亿遍。

所以,别觉得"把文字变成数字"这一步很无聊。它是整个大模型的地基。地基歪了,上面盖得再漂亮也白搭。

下一章我们聊拿到这些向量之后,模型做的第一件事。剧透一下:它用了一种叫"注意力"的机制。本质上就是加权平均——对,你期末考试算总评成绩时用的那个加权平均。

但就是这么个平平无奇的数学操作,改变了整个世界。


这是「大兰写给小兰的暑假阅读:用初中数学讲明白AI」系列文章。

文章精选:

1.图灵奖得主姚期智最新演讲: AI有边界,恰恰是好事

2.图灵奖得主本吉奥警告全网:AI已经学会“演给安全测试看”,下一代我们可能真的抓不住了!
3.图灵奖得主萨顿 WAIC 2026 最新演讲:现在的 AI 还不算真智能,我们正迈入经验时代
4.菲尔兹奖得主陶哲轩最新访谈:未来数学属于人类与 AI 的混合体
5.图灵奖得主、AI教父辛顿:AI已具备意识,且将进化成远超人类的智能生命体
6.图灵奖得主、“AI教父”辛顿认错:我当年想得太简单!卡死医疗AI落地的,其实是背后的法律
7.图灵奖得主Bengio预言o1无法抵达AGI!Nature权威解读AI智能惊人进化,终极边界就在眼前
8.图灵奖得主、强化学习之父Rich Sutton:大语言模型是一个错误的起点
9.图灵奖得主杨立昆:大语言模型缺乏对物理世界的理解和推理能力,无法实现人类水平智能
10.压缩即是全部 —— 菲尔兹奖得主 Michael Freedman 给数学和 AI 的一封信