把黑箱拆开:手搓一个大语言模型 书架

第 03 章 / 共 16 章

第三章 · 让词有了'意思':语义坐标系

上一章我们把句子剪成了积木块,每块贴上一个编号。可编号这东西,冷酷得没有一点道理:是 5182,是 9047,桌子是 5183。就因为 5183 紧挨着 5182,桌子就比狗更像猫吗?当然不是。编号只是一个户口本上的名字,它不携带任何"意思"。

可我们明明知道:猫和狗是一类的(都是毛茸茸会叫的动物),"高兴"和"愉快"几乎是同义词,"巴黎之于法国"就像"东京之于日本"。这些关系客观存在,只是编号完全丢掉了它们。于是本章要解决的就是这一件事:怎么给每个词一个"有意思"的身份,让含义变成机器能算的东西。

把词从"名字"升级成"坐标"

换个思路。别再用一个孤零零的编号代表一个词,改用一串数字——一个坐标。

先从我们能想象的二维说起。假设我造一张地图,横轴叫"是不是动物",纵轴叫"体型大小"。那么:

看出门道了吗?在这张地图上,猫和狗紧挨着,桌子被甩到老远。"意思相近"变成了"坐标相近"——两个词像不像,现在可以用它们在地图上的距离来量,而距离是纯数学,机器最擅长算。这就是整章的核心魔术。

编号是"你叫几号",坐标是"你站在哪"。前者只能比较相等或不相等,后者能比较远近、方向、甚至做加减。我们要的,正是后面这些。

这串代表一个词的坐标,就是 词向量(word embedding)——说白了,就是"用一长串数字给一个词定的位置"。embedding 这个词英文原意是"嵌入",意思是把词嵌进一个多维空间里,让它有个落脚点。

二维不够用,那就几百维

两根轴显然不够。"动物性"和"体型"能分开猫和桌子,可分不开"高兴"和"悲伤"(它们动物性都是 0、体型都无意义)。词与词之间的差别维度太多了:褒义还是贬义、抽象还是具体、正式还是口语、是不是国家名、是不是颜色……

怎么办?加轴。真实的语言模型里,每个词的坐标不是 2 个数,而是几百到上万个数。GPT-2 用的是 768 维,后来的大模型常见到几千维。也就是说,每个词都活在一个几百上千维的空间里,占据一个精确的位置。

"768 维"听着吓人,其实一点都不玄。它就是一串 768 个小数,比如 [0.12, -0.44, 0.03, ……]。维度多,只是因为要区分的"意思的侧面"太多了,两三个轴根本装不下。你没法在脑子里画出 768 维的图,但机器算距离时,768 个数和 2 个数用的是同一个公式,一点不费劲。

这里要破除一个常见的误解:没有哪根轴是人手工指定"这根管动物性、那根管褒贬"的。我上面说的横轴纵轴只是为了让你有画面感。真实模型里,这几百个数字是训练时自己长出来的(下一章讲神经网络怎么"长",第七章讲怎么"训练"),每根轴具体代表什么,往往说不清、也不需要说清。我们只在乎一件事:意思相近的词,坐标最终会凑到一起。

机器凭什么知道两个词像?靠"看它们跟谁做邻居"

凭空给每个词编几百个数,数从哪来?靠的是一条朴素到近乎粗暴的规律,语言学上叫 分布假设(distributional hypothesis)——一句话:一个词的意思,由它经常和哪些词一起出现来决定。

"你是谁,看你跟谁混。"扫过海量文本你会发现,周围反复出现可爱;而桌子周围是木头。既然猫和狗的"邻居圈"高度重合,模型就把它俩的坐标往一块儿挪。整个训练过程,本质就是不停微调每个词的坐标,让"经常做邻居的词坐标靠近,老死不相往来的词坐标拉远"。

注意,机器从头到尾没人告诉它"猫是一种动物"。它只是数了无数遍谁和谁一起出现,坐标就自己排布成了我们眼中"有意义"的样子。意思不是被灌进去的,是从"共同出现的统计规律"里自己浮出来的。这一点,是破除"AI 懂词义"神秘感的关键。

压轴戏:意思居然能做加减法

词一旦变成坐标,一件很反直觉的事就发生了:它们能像向量一样加减,而且加减的结果有意义。最著名的例子是:

国王 − 男人 + 女人 ≈ 王后

把它当成地图上的位移来读就通了。从"男人"走到"国王",你走的是某个方向、某段距离——这段位移大致可以理解为"加上王室身份、加上统治者这层意思"。现在你站在"女人"的位置上,朝同一个方向、走同样的距离,落脚点会非常接近"王后"。

说人话:国王之于男人,正如王后之于女人这句关系,在坐标空间里变成了一段可以平移的箭头。既然"性别差异"是一个固定方向,"王室身份"是另一个固定方向,那含义就真的能被拆成一根根方向来加减。类似的还有 巴黎 − 法国 + 日本 ≈ 东京(把"这个国家的首都"当成一个可平移的方向)。

这不是被人为设计出来的彩蛋,而是"用邻居定坐标"这套办法自然而然的副产品——含义的规律,自己在几百维空间里排成了整齐的几何。到这一步,"意思"这个虚头巴脑的东西,被彻底翻译成了坐标、距离和方向,全是机器算得动的数学。

(小声提醒: 是"约等于",不是精确相等。真实模型里结果是"离王后最近的那个词",偶尔也会翻车指向别的词——但方向对得惊人,足以说明问题。而且这类经典例子多来自早期专门的词向量模型 Word2Vec,今天大模型内部的词向量更复杂,但"坐标承载意思"这个内核完全一样。)

一个还没解决的破绽

本章我们让每个词有了固定坐标。可"意思相近坐标就近"有个致命漏洞:同一个词,坐标却是死的。

想想"苹果"。在"我啃了一口苹果"里它是水果,在"苹果发布了新手机"里它是公司。可到目前为止,无论哪句话,"苹果"用的都是同一串坐标——它没法根据上下文变脸。一个词的真正含义,明明得看它周围站着谁才能定啊。

所以本质上,这一章我们只做了一件事:把每个词钉在一张几百维地图上的固定位置,让"意思"第一次变成了能算距离、能做加减的坐标。但这只是每个词的"出厂默认含义"。怎么让"苹果"在读到"手机"时自己挪一挪、变成"那家公司"的意思?——那要靠让词与词互相"看一眼",这正是第五章那个全书心脏级别的机制。在此之前,下一章我们得先搞清楚:那个能把这些坐标揉来揉去、还能自己长出规律的"神经网络",到底在算什么。

把黑箱拆开:手搓一个大语言模型 · 王建硕
面向对世界有好奇心的人 · 费曼式写法 · 由多个 AI 代理撰写与互相审校