为了直观地理解,以一个简化的大模型为例,追踪输入句子 "AI write code" 的 Embedding 过程。
假设设定:
- 词表大小 ($|V|$):10,000
- 向量维度 ($d$):4 (为了方便展示,实际中通常是 4096+)
- 位置编码:简单的加法绝对位置编码
步骤 1:Tokenization (数字化)
原始输入:"AI write code"
分词器将其切分为 Token,并查找对应的 ID(假设):
- "AI" $\rightarrow$ ID:
256 - "write" $\rightarrow$ ID:
4092 - "code" $\rightarrow$ ID:
1055
输出序列:[256, 4092, 1055]
步骤 2:Embedding Lookup (查表)
模型有一个巨大的 "账本"(Embedding Matrix),有 10,000 行,每行存着 4 个数字。我们根据 ID 取出对应的行:
- ID
256("AI") 对应向量 $\mathbf{v}_1$:[0.1, 0.8, -0.2, 0.5](假设值,代表AI的概念) - ID
4092("write") 对应向量 $\mathbf{v}_2$:[-0.5, 0.1, 0.9, 0.1](假设值,代表动作) - ID
1055("code") 对应向量 $\mathbf{v}_3$:[0.2, 0.7, -0.1, 0.9](假设值,代表编程)
此时,计算机理解了这三个词分别是什么,但还不知道谁先谁后。
步骤 3:注入位置信息 (Positional Encoding)
为了告诉模型 "AI" 是第一个词,"code" 是第三个词,我们需要加上位置向量 $\mathbf{P}$:
- 位置 0 (对应 "AI") 的向量 $\mathbf{p}_0$:
[0.0, 0.1, 0.0, 0.1] - 位置 1 (对应 "write") 的向量 $\mathbf{p}_1$:
[0.0, 0.2, 0.0, 0.2] - 位置 2 (对应 "code") 的向量 $\mathbf{p}_2$:
[0.0, 0.3, 0.0, 0.3]
最终计算(向量相加):
-
"AI" (Token + Pos):
[0.1, 0.8, -0.2, 0.5] + [0.0, 0.1, 0.0, 0.1] = [0.1, 0.9, -0.2, 0.6] -
"write" (Token + Pos):
[-0.5, 0.1, 0.9, 0.1] + [0.0, 0.2, 0.0, 0.2] = [-0.5, 0.3, 0.9, 0.3] -
"code" (Token + Pos):
[0.2, 0.7, -0.1, 0.9] + [0.0, 0.3, 0.0, 0.3] = [0.2, 1.0, -0.1, 1.2]
结论
最终送入大模型第一层神经网络的,就是这三个融合了语义(是什么词)和**语序**(在什么位置)的 4 维向量。