入门层 · 第 2 / 25 课

Embedding:每个词是一个向量

代码实验 仅预计算数据 ~0.2MB · 无模型权重(进阶模式除外) 建议 15–30 分钟

学完这课你能

  1. 理解 embedding 是一张查询表:token id → 按行取出一个 128 维向量(pythia 的 50304×128)。
  2. 理解「语义相近 = 向量夹角小」,会用余弦相似度比较两个词。
  3. 理解这些向量是预训练自己学出来的、不是人标的;高维散点图是 UMAP 降维后的投影。

夜晚的星空看着杂乱,其实每颗星都有固定的坐标,挨得近的星连成星座。模型的词表也是一幅星图——每个词一颗星,意思近的词,在天上就凑在一起。

米色纸面上的星图,几组星座由连线串起,网格线给每颗星标出固定位置
类比 星座连线给每颗星固定坐标=embedding 给每个 token 一个语义位置

01从 id 到向量

上一课收尾时,文字已经变成了整数。但先停一下——id 50256 和 id 1024,谁跟谁更「接近」?盯着数字看半天也没用:编号只是排队顺序,不携带意义。模型的第一个内部部件就是来解决这件事的:一张 50304 行、128 列的大表。每行对应词表里的一个 token,取出来就是一个 128 个数字组成的向量。

这张表叫 embedding 表(词嵌入表)。你可以把它理解成一本「语义指纹册」:每个 token 领到一行属于自己的数字。模型后续的所有计算,都从取出这行指纹开始。

02向量是什么

128 个数字听着吓人,换个说法就亲切了:把每个向量当成 128 维空间里的一个点。关键的性质在于距离——语义相近的词,对应的点在这个高维空间里彼此靠近。「猫」和「狗」挤在一起,「猫」和「宪法」隔得很远。注意到了吗?这不是谁规定的,而是模型为了完成预测任务自己长出来的几何结构。

词「猫」 token id 查 embedding 表 按行取出 128 维向量 一行 128 个数 UMAP 压到二维 画在图上:星系图 近的词,坐标也近
结构 词 → 查 embedding 表 → 取出 128 维向量 → 压到 2 维画在图上

二维图里画不下 128 维,但降维后的投影能让你对「词云分布在高维空间里」有个体感——视觉隐喻借自 3Blue1Brown 的讲法,只借思想,坐标不是原图。

03余弦相似度

那怎么量化「两个词有多近」?最常用的尺子是余弦相似度:两个向量的点积,除以它们各自的长度。几何上它就是两个向量夹角的余弦——只看方向、不看长短。方向一致时接近 1,垂直时为 0,相反时为 -1。

为什么高维里常用角度而不用直线距离?因为向量的长度往往和词频等无关因素纠缠在一起,而方向(这个词跟哪些词共现、用来干什么)才承载语义。光看公式不过瘾——下面的余弦实验台让你亲手算。

04这些数哪来的

这些向量是预训练的副产品:模型的唯一任务是预测下一个词,而要预测得准,它必须把用法相近的词表示得相近——因为它们能出现在几乎相同的上下文里。训练不断微调这张表,直到「指纹」好用到能完成任务为止。

所以 embedding 里存的是「用法」而非「定义」:bank 在存钱和河岸两种语境里用法不同,单个静态向量只能取两种含义的某种混合。这个缺陷正是后面注意力机制要部分弥补的。

05怎么画出来

128 维没法直接画,那星系图是怎么来的?UMAP 这类降维算法能把高维点云压到二维,同时尽量保住「谁是谁的近邻」这一局部关系——降维后的图上两个点挨着,通常意味着原空间里它们也挨着,像同一条街上门牌相邻的住家。本课的星系图坐标是构建期用 Python 离线算好存成 JSON 的:本站服务器只有 2 核 2G,不参与任何访客的计算,你打开页面时浏览器只是下载现成的坐标。

成片线稿小房子组成的街区,正中一栋橙色小房子被四周相邻的房子围着
类比 挨得近的住家互为邻居=语义相近的词在向量空间互为近邻

06看图说话

放大星系图自己转转,能看见几类天然聚集:标点符号抱成一团;数字挤在一个街区;同义词拉成长条——因为它们可以在大部分上下文里互换。这些结构没有任何人教过模型,全部是「预测下一个词」这一件事的副产品。记住这幅图——解剖层拆开模型时,你会反复遇到这些向量的踪影。

交互实验:embedding 星系图 + 余弦实验台

引擎加载中…

星系图:拖拽平移、滚轮缩放,hover 任意点看 8 个真近邻。实验台:从 200 个常用词里选词,浏览器现场算 128 维真向量的余弦相似度。小模型算类比(国王−男+女)常常不灵,这本身是诚实的发现。

组件加载中…(星系图 + 余弦实验台需要 JavaScript)