Embedding 是什么
Embedding 可以理解成“把离散编号变成向量”的方法。
在语言模型里,tokenizer 会先把文本切成 token,再把 token 转成 token id:
天空 -> 923
蓝色 -> 2048但 923、2048 只是编号,本身没有语义。模型真正参与计算的是向量,例如:
923 -> [0.12, -0.38, 0.07, ...]
2048 -> [0.03, 0.51, -0.22, ...]这个从 token id 到向量的查表过程,就是 Token Embedding。
Embedding 表长什么样
可以把 embedding 表想象成一张大表:
token id embedding 向量
--------------------------
0 [...]
1 [...]
2 [...]
...
923 [0.12, -0.38, 0.07, ...]
...
2048 [0.03, 0.51, -0.22, ...]如果词表大小是 V,向量维度是 d,那么 embedding 表可以看成一个矩阵:
E∈RV×d
其中:
V:词表里 token 的数量
d:每个 token 向量的维度当输入 token id 是 i 时,模型会取出 embedding 表的第 i 行:
xi=Ei
这个 xi 就是该 token 的向量表示。
Embedding 一开始懂语义吗
不懂。
训练刚开始时,embedding 表通常是随机初始化的。也就是说,每个 token 的向量一开始只是一些随机数字:
天空 -> [随机数, 随机数, 随机数, ...]
蓝色 -> [随机数, 随机数, 随机数, ...]这时它们还没有真正学到“天空”和“蓝色”之间有什么关系。
Embedding 的含义是在训练过程中慢慢学出来的。
Embedding 表是如何训练的
语言模型训练时,核心任务通常是预测下一个 token。
比如训练样本是:
天空 是 蓝色 的模型看到:
天空 是它应该预测下一个 token:
蓝色如果模型预测错了,损失函数会告诉模型“这次预测不够好”。随后,反向传播会把这个错误信号传回模型的各个部分,包括 embedding 表。
于是,参与这次计算的 token 向量会被微调一点点:
天空 的向量更新一点
是 的向量更新一点
相关模型参数也更新一点经过大量文本、很多轮这样的更新后,embedding 表里的向量会逐渐变得有用。
为什么相似 token 的向量会接近
如果两个 token 经常出现在相似语境里,它们在训练中会收到相似的更新信号。
比如:
猫 喜欢 吃 ...
狗 喜欢 吃 ...“猫”和“狗”经常出现在相似的位置,也经常参与相似的预测任务。训练久了,它们的向量可能会在某些方向上变得更接近。
这不是人手工告诉模型“猫和狗都是动物”,而是模型通过大量上下文统计关系学出来的。
Embedding 和模型参数的关系
Embedding 表本身就是模型参数的一部分。
训练时,它会和模型里的其他参数一起更新;推理时,它固定下来,用来把 token id 转成向量。
可以简单理解成:
训练阶段:embedding 表会被不断调整。
推理阶段:embedding 表用来查表,把 token id 变成向量。一个完整小例子
假设输入文本是:
为什么天空是蓝色的?tokenizer 先得到 token id:
[128, 923, 17, 2048, 9, 64]然后 embedding 表会把每个 id 转成向量:
128 -> [ ... ]
923 -> [ ... ]
17 -> [ ... ]
2048 -> [ ... ]
9 -> [ ... ]
64 -> [ ... ]于是,原来的一串数字编号就变成了一串向量:
[向量128, 向量923, 向量17, 向量2048, 向量9, 向量64]这些向量会继续进入后面的 Decoder Block,结合上下文信息,最终用于预测下一个 token。
小结
Embedding 的作用可以概括为:
token id
-> 查 embedding 表
-> 得到 token 向量
-> 交给模型继续计算它不是人工写好的词义表,而是模型在训练中自己学出来的一张向量表。