Skip to content

Embedding 是什么

Embedding 可以理解成“把离散编号变成向量”的方法。

在语言模型里,tokenizer 会先把文本切成 token,再把 token 转成 token id:

text
天空 -> 923
蓝色 -> 2048

9232048 只是编号,本身没有语义。模型真正参与计算的是向量,例如:

text
923  -> [0.12, -0.38, 0.07, ...]
2048 -> [0.03,  0.51, -0.22, ...]

这个从 token id 到向量的查表过程,就是 Token Embedding。

Embedding 表长什么样

可以把 embedding 表想象成一张大表:

text
token id    embedding 向量
--------------------------
0           [...]
1           [...]
2           [...]
...
923         [0.12, -0.38, 0.07, ...]
...
2048        [0.03, 0.51, -0.22, ...]

如果词表大小是 VV,向量维度是 dd,那么 embedding 表可以看成一个矩阵:

ERV×dE \in \mathbb{R}^{V \times d}

其中:

text
V:词表里 token 的数量
d:每个 token 向量的维度

当输入 token id 是 ii 时,模型会取出 embedding 表的第 ii 行:

xi=Eix_i = E_i

这个 xix_i 就是该 token 的向量表示。

Embedding 一开始懂语义吗

不懂。

训练刚开始时,embedding 表通常是随机初始化的。也就是说,每个 token 的向量一开始只是一些随机数字:

text
天空 -> [随机数, 随机数, 随机数, ...]
蓝色 -> [随机数, 随机数, 随机数, ...]

这时它们还没有真正学到“天空”和“蓝色”之间有什么关系。

Embedding 的含义是在训练过程中慢慢学出来的。

Embedding 表是如何训练的

语言模型训练时,核心任务通常是预测下一个 token。

比如训练样本是:

text
天空 是 蓝色 的

模型看到:

text
天空 是

它应该预测下一个 token:

text
蓝色

如果模型预测错了,损失函数会告诉模型“这次预测不够好”。随后,反向传播会把这个错误信号传回模型的各个部分,包括 embedding 表。

于是,参与这次计算的 token 向量会被微调一点点:

text
天空 的向量更新一点
是 的向量更新一点
相关模型参数也更新一点

经过大量文本、很多轮这样的更新后,embedding 表里的向量会逐渐变得有用。

为什么相似 token 的向量会接近

如果两个 token 经常出现在相似语境里,它们在训练中会收到相似的更新信号。

比如:

text
猫 喜欢 吃 ...
狗 喜欢 吃 ...

“猫”和“狗”经常出现在相似的位置,也经常参与相似的预测任务。训练久了,它们的向量可能会在某些方向上变得更接近。

这不是人手工告诉模型“猫和狗都是动物”,而是模型通过大量上下文统计关系学出来的。

Embedding 和模型参数的关系

Embedding 表本身就是模型参数的一部分。

训练时,它会和模型里的其他参数一起更新;推理时,它固定下来,用来把 token id 转成向量。

可以简单理解成:

text
训练阶段:embedding 表会被不断调整。
推理阶段:embedding 表用来查表,把 token id 变成向量。

一个完整小例子

假设输入文本是:

text
为什么天空是蓝色的?

tokenizer 先得到 token id:

text
[128, 923, 17, 2048, 9, 64]

然后 embedding 表会把每个 id 转成向量:

text
128  -> [ ... ]
923  -> [ ... ]
17   -> [ ... ]
2048 -> [ ... ]
9    -> [ ... ]
64   -> [ ... ]

于是,原来的一串数字编号就变成了一串向量:

text
[向量128, 向量923, 向量17, 向量2048, 向量9, 向量64]

这些向量会继续进入后面的 Decoder Block,结合上下文信息,最终用于预测下一个 token。

小结

Embedding 的作用可以概括为:

text
token id
-> 查 embedding 表
-> 得到 token 向量
-> 交给模型继续计算

它不是人工写好的词义表,而是模型在训练中自己学出来的一张向量表。