K 的一隅

AI Transformer 入门

Token ID 只是编号,语义从哪里来:Embedding

从坐标直觉走到高维矩阵,理解一次查表为什么能把 Token 变成向量。

5 分钟阅读 更新于 2026-07-28
本文目录

Token ID 如何定位矩阵中的一行

Embedding 查表

点一个 Token,取出矩阵中对应的一行

Token ID 只负责定位行号。被点亮的那一行,就是这个 Token 的 4 维初始表示。

Embedding 矩阵 · 3×4列 = 维度
行 1
行 2
行 3

查表结果

ID 301

取出第 1 行,得到 4 维初始表示:

d1 0.2 d2 0.5 d3 -0.1 d4 0.8
[ 0.2, 0.5, -0.1, 0.8 ]

Token ID 只负责定位词表中的条目。Embedding(嵌入)矩阵存放向量:选择 ID 对应的那一行,就是一次查表(Lookup)。三个 Token、每个四维,便组成 3×4 矩阵;行数对应 Token 数量,列数对应表示维度。这些数字是高维连续表示的起点,不是最终语义判决。

一行是不是空间位置

数学上,一行 [0.2, 0.5, -0.1, 0.8] 可以看作四维空间中的坐标,也可以看作从原点出发的向量。两种解释使用同一组数字,关注点不同。

但不要把每一列硬命名成“情感维”“动物维”。模型的高维特征通常是分布式的:某种语义由许多维度共同表达,一个维度也会服务多种模式。

这里只是初始表示

词嵌入给出 Token 的初始表示(Initial Representation)。相同 Token 在查表时通常拿到相同向量;单凭这一行,模型还不知道它出现在句子的第几位。

所以更准确的链路是:

Token ID → Embedding 查表 → 加入位置信息 → 多层上下文化

Embedding 解决“离散编号变成连续向量”;位置信息解决“同一向量出现在不同座位”;Attention 再解决“座位之间如何互相读取”。

位置信息怎样真正加进去

最容易落地的一种做法是可学习位置嵌入:再准备一张位置表 P,行号是位置 0,1,2,…,列数同样是 d_model。查完词嵌入 E 后做逐元素相加:

X = E + Ppositions

用实验里的形状举例。三个 Token 查表得到 E3×4)。若位置是 0,1,2,再取出位置表的前三行 P(也是 3×4),对应格相加得到 X。两个「相同 Token ID」若出现在不同位置,E 行可以相同,但加上不同的 P 行后,X 行就不同了。

经典 Transformer 还用过正弦/余弦位置编码:不训练一张位置表,而用固定公式按位置生成一串数字,再与词嵌入相加。较新的解码器常用相对位置或 RoPE 一类方案,把位置信息编进注意力的旋转/偏置里,而不一定在输入处显式加一张 P

本章只需记住一件事:位置不是靠 Token ID 自带的,必须另有通道告诉模型“它在第几位”。 交互里看到的仍是查表后的初始行。绝对位置嵌入常在进入第一层 Block 前与词嵌入相加;RoPE 等相对方案则在注意力计算内部注入位置,不要求进 Block 前已经存在一张显式的 E+P

Embedding 矩阵的形状从哪里来

假设词表有 50,000 个 Token,模型维度 d_model 是 768,Embedding 权重就是 50000×768。行数必须覆盖词表中的每个 ID,列数决定每个 Token 被表示成多少个数字。

输入 [12, 85, 12] 时,查表会依次取第 12、85、12 行,组成 3×768 输出。相同 ID 出现两次,最初查到的词向量相同;加上不同位置并经过 Attention 后,后续表示会逐层分化。

Embedding 查表看起来不像普通矩阵乘法,但可以用 one-hot 向量理解:把 Token ID 写成只有对应位置为 1 的超长向量,再乘 Embedding 矩阵,结果恰好就是目标行。工程实现直接索引,是因为没有必要真的创建大量为 0 的 one-hot 矩阵。

“距离近”究竟说明什么

两个向量的欧氏距离较小或余弦相似度较高,说明它们在模型学到的表示中更接近,但不能自动推出人类语言中的单一关系。相近可能来自共同出现、句法用途类似,也可能来自训练目标共同需要它们。

此外,初始 Embedding 的距离与经过多层 Transformer 后的上下文向量距离不是同一个东西。初始向量是静态词表参数;上下文向量会吸收整段序列的信息。讨论“这个词的向量”时,先说明指的是哪一层,结论才有意义。

这些数字是怎样学出来的

Embedding 矩阵也是模型参数。初始化时通常只是小的随机数;训练中,损失通过反向传播到使用过的 Token 行,优化器逐步更新它们。大量语境共同作用后,某些方向才形成可供后续层使用的结构。

模型保存的是这张训练后的表,不是为每个句子提前保存一份语义答案。推理时查表参数固定,句子的动态含义主要由后续 Attention 和 FFN 继续计算。

操作实验时观察行,不要只看单个数

点击 Token 后,先确认高亮的是整行,再读矩阵形状。单个分量例如 −0.17 很难独立解释;真正代表该 Token 的是这一行所有分量的组合。再切换到另一个 Token,比较的是两整行怎样变化,而不是寻找“哪一格叫动物、哪一格叫动作”。

从这里进入 Attention

当 n 个 Token 查表并混入位置信息后,输入形状仍是 n×d_model。接下来各层不会把每行当作互不相关的最终答案,而会从这张矩阵生成 Q、K、V,让每个位置按上下文读取其他位置的信息。

Embedding 负责“把编号变成可计算的起点”;Attention 负责“让这些起点在当前句子里互相影响”。两步共用同一矩阵形状,但职责不同。