☰
<八>Embedding(一):文字怎么变成数字
2026/9/26 1:41:17 网站建设 项目流程

上篇<七>从3秒记忆到过目不忘——语言模型的三代进化把语言模型这三代进化捋了一遍,结尾停在 Transformer 用 Self-Attention 把"记不住"这个问题给解决了。不过有个更基础的问题我还一直没碰。计算机里全是 0 和 1,这没啥可说的,可汉字、英文这些符号,到底怎么送进 Transformer 让它算?这篇就来理一理。

先说一个绕不开的矛盾。语言的本质是符号。你看"猫"、"cat"、"猫咪",三个写法,指的都是同一种东西,一条四只脚、会"喵喵"叫的小动物。它们本身没有任何数值,纯粹是咱们人类商量好了、拿来当"记号"用的一套东西。

可 Transformer 是个纯数值的系统。它只会做加减乘除,喂它一个"猫"字,它根本接不住。要让一个只懂数字的机器去理解一堆充满符号的语言,这是第一步就得解决的事。

第一次尝试:给每个词发个编号

最直白的想法,是给每个词发个编号。假设词表特别小,就五个词:猫、狗、喜欢、吃、鱼。那就给每个词配一个五维向量,它自己那个位置填 1,别的位置全填 0。

猫 = [1, 0, 0, 0, 0] 狗 = [0, 1, 0, 0, 0] 喜欢 = [0, 0, 1, 0, 0] 吃 = [0, 0, 0, 1, 0] 鱼 = [0, 0, 0, 0, 1]

这样每个词都成了数字,能交给计算机了。这种编法有个专门的名,叫 One-Hot 编码。

它的定义一句话就说完:一个词用一个向量表示,整个向量里只有一位是 1,其余全是 0。至于哪个位置是 1,取决于这个词在词表里排第几个。

听着挺像回事,但真要用起来,毛病一下就冒出来了,还不止一个。

第一个毛病:维度太高

上面才五个词,就得用五维。那换成 ChatGPT 呢?GPT-3 的词表大概有五万个 token,每个 token 就得用一个五万维的向量来表示,里面四万九千九百九十九个位都是 0,就一个 1。只为了表达一个词,就得存下五万个数字,里面还几乎全是废的。又高维又稀疏,算起来存起来,开销直接爆炸。

第二个毛病:语义没了

这个更要命。先说一下"相似度"是啥,它就是量两个词挨得近不近的一个数,越大越像。算法也不复杂:两个向量挨着位置相乘,把结果全加起来(这一步叫点积),再除以它俩各自长度,得到的值在 -1 到 1 之间。

拿 One-Hot 里"猫"和"狗"算一遍:

猫 = [1, 0, 0, 0, 0] 狗 = [0, 1, 0, 0, 0] ​ 挨着位置乘起来,再相加 1×0 + 0×1 + 0×0 + 0×0 + 0×0 = 0 ​ 它俩长度都是 1,所以 相似度 = 0 ÷ 1 = 0

结果是零,一丁点相似性都没有。可现实里,"猫"和"狗"都是动物,都爱当宠物,老在各种养猫养狗的讨论里一起冒头,明明亲得很。再算"猫"跟"鱼",还是 0——"猫爱吃鱼"这话谁都听过,俩词关系近得很,可在这套编码里照样是零。再换"猫"跟"吃",也还是 0。这套编码里,谁跟谁都一样远。

这就跟图书馆按入库顺序给书编号一个道理。每本书都有个独一无二的号,你拿着号确实能精准取到书,可光看号码,你完全不知道这本是小说还是菜谱、跟另一本是不是同一个作者写的。号码能定位,但给不了你任何关于书本身的信息。

说白了,One-Hot 把词变成了数字,可把词的"意义"给弄丢了。而语言模型偏偏是最缺不得"意义"的。它得知道"猫"和"鱼"沾边,才能猜对"猫喜欢吃"后面大概率该接"鱼",而不是"电脑"。

换个思路:Embedding

那怎么办?2013 年,Google 有个研究员叫 Mikolov,搞出一个叫 Word2Vec 的东西,后来慢慢演化成咱们现在说的 Embedding。

"Embedding"字面是"嵌入",你就想成把一个号码牌,塞进一大块密密麻麻写满字的软木板上,塞进去的位置还是精心挑的。

它跟 One-Hot 比起来,就换了三件事:

  • 位数不用那么多了,五万维砍到一万两千多维

  • 数字不再是清一色的 1 和 0,而是一堆有正有负的小数,每个位都塞了点信息

  • 词跟词之间有了远近关系,不再是各占一个坑、谁也不挨着谁

一句话,别再把词当成一个个孤零零的编号,改成把它放在一张能比出远近的地图上。

什么叫"带着语义"?GPT-3 没用那五万维的 One-Hot,而是给每个词一个 12288 维的向量。这一万多个数可不是只有一个 1 别处全 0,它每个位置都有讲究:

猫 = [0.2, -0.5, 0.7, 0.1, -0.3, ..., 0.4] ← 12288

这一万两千多个数,合起来在描述"猫"这个形象:它是动物(生物属性)、有四条腿(长啥样)、老跟"鱼"一起出现(共现关系)、会"喜欢"会"抓"会"睡觉"(平常干啥)。就这一串数,把"猫"的意义整个裹进去了。

这不就跟拿一张"体检表"描述人一个道理吗?光看编号认不出人,可换成一堆具体指标就不同了:

指标 身高 体重 饭量 力气 跑得快 唱歌 ──────────────────────────────────────────── 阿明 175 70 3 8 7 2 阿伟 173 68 3 7 8 3 ← 跟阿明很像 阿强 165 60 1 3 2 9 ← 完全另一路人

阿明跟阿伟,个头差不多,体重差不多,体力也接近,这串数字自然就挨得近。阿强完全是另一路,数字就离得老远。

所以 One-Hot 只能把人分开,Embedding 既能叫人分开,又能比个亲疏,还能算出到底多像。这才是它真正值钱的地方。

这串数字是哪儿来的

总不会是哪个专家手工填的吧。当然不是,全是模型自己练出来的。整个过程分四步,走一遍就清楚了。

第一步,先随便给个数

训练刚开始的时候,每个词的向量就是一堆随机数,毫无意义:

猫 = [0.01, -0.03, 0.05, ...] ← 随机数字,啥也不代表 鱼 = [0.02, 0.01, -0.04, ...] ← 一样是随机数字

就好比一群人刚上场,先随便站,谁也不挨着谁。这时候的向量是纯噪声,别说语义了,连"猫"和"鱼"该不该靠近都还不知道。

第二步,慢慢调

模型开始读海量文本,几百万篇里,"猫吃鱼""猫抓老鼠""狗喜欢跑"这种话它看了无数遍。每读到一个句子,它就顺手调一下相关那几个词的向量:

读到"猫喜欢吃鱼" → 把"猫"和"鱼"拉近一点 读到"猫抓老鼠" → 把"猫"和"老鼠"拉近一点 读到"狗喜欢跑" → 把"狗"和"跑"拉近一点

第三步,调到稳下来

这样调上几千万次,向量就不怎么动了,稳定下来:

词 训练后的向量 语义关系 ──────────────────────────────────────────────── 猫 [0.2, -0.5, 0.7, ...] 编码了"猫"自己的味道 鱼 [0.15, -0.48, 0.65, ...] 和"猫"靠得近(常同框) 狗 [0.18, -0.52, 0.68, ...] 和"猫"也近(都是动物) 电脑 [-0.3, 0.6, -0.1, ...] 离"猫"十万八千里

第四步,验收

这时候再让模型看"猫喜欢吃",它就比一下:

P(鱼 | 猫喜欢吃) = 0.35 ← 高,因为"猫"和"鱼"贴得近 P(电脑 | 猫喜欢吃) = 0.001 ← 低,因为"猫"和"电脑"八竿子打不着

所以 Embedding 根本就不是人设计出来的,是模型为了把"预测下一个词"这活干好,被逼着悟出来的。它得摸清哪些词老一起出现、哪些词用法像、哪些词语义挨得近,然后把这一堆发现全塞进那一万两千多个数字里。这也是为啥这些向量"充满语义",不充满不行,任务完不成。

这个思路,跟上篇学的"归纳法"是一回事,不给规则,给海量数据,规律自己就冒出来了。

一句话是怎么跑完六步的

接下来说说 ChatGPT 处理一句话,实际是咋一步步跑的,大概六步。先看一张图,有个整体印象,下面再一步步说。

第一步,分词。输入先切成一个个 token。比如"今天天气真好",切成 [今天, 天气, 真, 好]。

第二步,映射成整数。每个 token 在词表里有个固定的号:

今天 → 12456 天气 → 8901 真 → 3345 好 → 7823

为啥要有号?因为计算机不认字,只认数字,每个 token 都得对应一个。

第三步,查 Embedding 表。ChatGPT 里头其实有一张特别大的"查找表",拿编号一查,就能取出对应的那一万两千多维向量:

12456 → [0.23, -0.45, 0.67, ..., 0.12] ← "今天" 8901 → [0.34, -0.12, 0.45, ..., 0.23] ← "天气" 3345 → [-0.12, 0.56, -0.34, ..., 0.45] ← "真" 7823 → [0.45, 0.23, -0.67, ..., -0.12] ← "好"

第四步,把这组向量喂给 Transformer。它里头主要转两道手:一道叫 Self-Attention(上篇学过的那个"圆桌会议",让每个词都看看周围别的词,决定该关照谁),另一道叫前馈网络,把拿到的信息再加工一遍。这两个东西具体怎么算,后面分开学,现在只要知道有这两道手就行。

第五步,Transformer 输出那五万个 token 各自的概率,挑概率最高的当"下一个词"。

第六步,把新生成的这个词接回原来那串,然后重复上面这一套,一个词一个词地"顺"下去。

看到这里就明白了,Embedding 就是那座把符号世界(文字)跟数值世界(计算)连起来的桥,缺了它,后面这些都无从谈起。

顺带提个小细节。这张 Embedding 表的参数,是算进模型总参数里的。拿 GPT-3 算算:词表大小乘维度,五万乘一万两千二百八十八,约等于六点一四四亿个参数。这六亿个数,只是那传说中一千七百五十亿参数里的一个小角,大概占了百分之零点三五。剩下的绝大部分,都藏在 Transformer 里面那些层——注意力层、前馈网络、归一化层这些(名字先不用记,后面会一个个学)。分工上,Embedding 那层管"词都啥意思",别的层管"这些词怎么排布",它俩是一起训的,不是分开弄。

到这里,"文字怎么变成数字"这件事就顺下来了。One-Hot 能把符号变成数字,可惜维度太高、又把语义弄丢了;Embedding 换成一万两千多维的稠密向量,每个位都有说法,既能分开词,又能比个亲疏。这些数不是人填的,是模型为了"预测下一个词"自己学出来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询