入门层 · 第 2 / 25 课
Embedding:每个词是一个向量
学完这课你能
- 理解 embedding 是一张查询表:token id → 按行取出一个 128 维向量(pythia 的 50304×128)。
- 理解「语义相近 = 向量夹角小」,会用余弦相似度比较两个词。
- 理解这些向量是预训练自己学出来的、不是人标的;高维散点图是 UMAP 降维后的投影。
夜晚的星空看着杂乱,其实每颗星都有固定的坐标,挨得近的星连成星座。模型的词表也是一幅星图——每个词一颗星,意思近的词,在天上就凑在一起。
01从 id 到向量
上一课收尾时,文字已经变成了整数。但先停一下——id 50256 和 id 1024,谁跟谁更「接近」?盯着数字看半天也没用:编号只是排队顺序,不携带意义。模型的第一个内部部件就是来解决这件事的:一张 50304 行、128 列的大表。每行对应词表里的一个 token,取出来就是一个 128 个数字组成的向量。
这张表叫 embedding 表(词嵌入表)。你可以把它理解成一本「语义指纹册」:每个 token 领到一行属于自己的数字。模型后续的所有计算,都从取出这行指纹开始。
02向量是什么
128 个数字听着吓人,换个说法就亲切了:把每个向量当成 128 维空间里的一个点。关键的性质在于距离——语义相近的词,对应的点在这个高维空间里彼此靠近。「猫」和「狗」挤在一起,「猫」和「宪法」隔得很远。注意到了吗?这不是谁规定的,而是模型为了完成预测任务自己长出来的几何结构。
二维图里画不下 128 维,但降维后的投影能让你对「词云分布在高维空间里」有个体感——视觉隐喻借自 3Blue1Brown 的讲法,只借思想,坐标不是原图。
03余弦相似度
那怎么量化「两个词有多近」?最常用的尺子是余弦相似度:两个向量的点积,除以它们各自的长度。几何上它就是两个向量夹角的余弦——只看方向、不看长短。方向一致时接近 1,垂直时为 0,相反时为 -1。
为什么高维里常用角度而不用直线距离?因为向量的长度往往和词频等无关因素纠缠在一起,而方向(这个词跟哪些词共现、用来干什么)才承载语义。光看公式不过瘾——下面的余弦实验台让你亲手算。
04这些数哪来的
这些向量是预训练的副产品:模型的唯一任务是预测下一个词,而要预测得准,它必须把用法相近的词表示得相近——因为它们能出现在几乎相同的上下文里。训练不断微调这张表,直到「指纹」好用到能完成任务为止。
所以 embedding 里存的是「用法」而非「定义」:bank 在存钱和河岸两种语境里用法不同,单个静态向量只能取两种含义的某种混合。这个缺陷正是后面注意力机制要部分弥补的。
05怎么画出来
128 维没法直接画,那星系图是怎么来的?UMAP 这类降维算法能把高维点云压到二维,同时尽量保住「谁是谁的近邻」这一局部关系——降维后的图上两个点挨着,通常意味着原空间里它们也挨着,像同一条街上门牌相邻的住家。本课的星系图坐标是构建期用 Python 离线算好存成 JSON 的:本站服务器只有 2 核 2G,不参与任何访客的计算,你打开页面时浏览器只是下载现成的坐标。
06看图说话
放大星系图自己转转,能看见几类天然聚集:标点符号抱成一团;数字挤在一个街区;同义词拉成长条——因为它们可以在大部分上下文里互换。这些结构没有任何人教过模型,全部是「预测下一个词」这一件事的副产品。记住这幅图——解剖层拆开模型时,你会反复遇到这些向量的踪影。
交互实验:embedding 星系图 + 余弦实验台
引擎加载中…
星系图:拖拽平移、滚轮缩放,hover 任意点看 8 个真近邻。实验台:从 200 个常用词里选词,浏览器现场算 128 维真向量的余弦相似度。小模型算类比(国王−男+女)常常不灵,这本身是诚实的发现。
组件加载中…(星系图 + 余弦实验台需要 JavaScript)
组件加载失败。
降级方案:两份预计算数据独立加载、独立降级——星系图数据失败时该区域显示错误信息并附「重试」按钮;余弦实验台数据失败时本卡显示「不可用」提示。页面不会白屏,图文正文不受影响。