Token ID映射稠密向量:高效嵌入技术详解
摘要
09aba-从离散 Token ID 到连续稠密向量的语义映射 将离散的 Token ID 转换为承载语义的连续向量
09aba-从离散 Token ID 到连续稠密向量的语义映射
将离散的 Token ID 转换为承载语义的连续向量,是 Embedding 层的核心职责。本文深入剖析这一过程——从基本原理到代码实现,覆盖稠密向量的选用理由以及查找表的运行机制,逐步拆解每个细节。

内容导航与学习路径 ?️
- 核心概念 → 厘清 Token、Embedding 与向量化的本质差异
- 为何需要 Embedding → 从 One-Hot 到稠密向量的演进逻辑
- Embedding 层的本质 → 查找表与矩阵乘法的等价关系
- 总结 → 回顾关键要点
1. 基础概念梳理 ?
动手编码之前,先明确几个基础定义。
1.1 什么是 Token?
Token 是模型处理文本的最小原子单元——可以理解为语言的基本积木块,它可以是以下任一形式:
- 完整单词:如 "hello"、"world"
- 子词单元:如 "un-"、"believ-"、"-able"(BPE 分词产物)
- 单一字符:如 "h"、"e"、"l"、"l"、"o"
- 特殊符号:如
、、
经过 Tokenizer 处理后,每个 Token 都会被映射为一个唯一的整数 ID:
"我" → 1024"喜欢" → 2048"深度" → 3072"学习" → 4096
Tokenizer 的作用相当于模型的“翻译官”——将人类语言转换为机器可识别的整数 ID,位于模型输入的出发层。
例如:
文本: "我喜欢深度学习"↓ (Tokenizer 切分)Token: ["我", "喜欢", "深度", "学习"]↓ (查词汇表映射)ID:[1024, 2048, 3072, 4096]
1.2 什么是 Embedding?
Embedding 的工作是将那些离散的整数 ID,映射为连续的稠密向量,每个向量都携带丰富的语义信息。
以向量维度 4 为例:
Token ID: 1024 ("我")→[0.2, -0.5, 0.8, 0.1]Token ID: 2048 ("喜欢") → [0.6, 0.3, -0.2, 0.9]Token ID: 3072 ("深度") → [0.1, -0.8, 0.5, 0.4]Token ID: 4096 ("学习") → [0.7, 0.2, 0.3, -0.6]
核心在于“稠密向量”——每个维度都承载语义特征,几乎无冗余空间。这与 One-Hot 那种大部分为零的稀疏向量截然相反。
例如:
- 稠密向量:
[0.2, -0.5, 0.8, 0.1](所有维度均非零) - 稀疏向量(One-Hot):
[0, 0, 1, 0, 0, ...](仅一位为 1,其余全为零)
稠密向量的三大优势:
- 语义相似性:语义相近的词,向量在空间中的距离更近
- 信息密度高:每个维度编码某种语义特征,压缩效率极高
- 维度较低:通常 128~768 维,远低于 One-Hot 的数万到数十万维
1.3 Embedding vs 向量化
很多资料混淆了这两个概念,但它们本质不同。
| 维度 | Embedding(嵌入) | 向量化(Vectorization) |
|---|---|---|
| 目的 | 学习低维稠密语义表示 | 将数据转换为数值向量(可能稀疏) |
| 是否需要学习 | 需要(通过神经网络训练) | 不需要(基于规则或统计) |
| 语义表示 | 保留深层语义关系和相似性 | 可能不保留语义,仅机械化表示 |
| 典型方法 | Word2Vec、BERT、GloVe | One-Hot、TF-IDF、词袋模型 |
| 结果维度 | 低维且稠密(如 512 维) | 高维且稀疏(如 50000 维) |
直观理解:
- 向量化像是“机械翻译”——将文字转为数字,不深究含义
- Embedding 像是“智能翻译”——不仅转成数字,还理解语义关系
以“新年快乐”四个字为例:
- 向量化:生成四个独立向量,彼此无关联
- Embedding:生成的向量蕴含语义结构(“新”与“年”可能更接近,“快”与“乐”可能更接近)
2. 为何需要 Embedding ?
计算机无法直接理解文字,必须将其转化为数字。关键在于如何转化才能既保留语义又保持高效,这就引出了 Embedding 的演进脉络。
2.1 第一阶段:直接使用数字(索引化)
最朴素的方法是为每个词分配一个编号:
词汇表 = {"新": 1, "年": 2, "快": 3, "乐": 4}"新年快乐" → [1, 2, 3, 4]
但问题显而易见:单个数字承载的信息量极其有限。例如 “abeyance”(中止)、“abide”(遵守)、“ability”(能力)在字典中索引相近,但语义天差地别;而 “a” 与 “an” 这两个同质词却相隔很远。根本缺陷在于:单一标量无法表达复杂语义。
2.2 第二阶段:One-Hot 编码
为弥补单数字信息量不足,我们采用多个数字(向量)表示一个词。最直观的方法是 One-Hot 编码:
词汇表大小 = 4"新" → [1, 0, 0, 0]"年" → [0, 1, 0, 0]"快" → [0, 0, 1, 0]"乐" → [0, 0, 0, 1]
One-Hot 编码规则简单:
- 向量长度 = 词汇表大小
- 每个词对应一位为 1,其余全为 0
- 第 i 个词的向量,第 i 位为 1
其缺陷同样突出:
维度灾难:若词汇表有 50000 个词,每个向量就是 50000 维,存储一个句子需巨大内存,计算效率极低。
语义孤立:任意两个 One-Hot 向量的点积为 0(正交),无法表达“相似性”——比如“猫”和“狗”本应相似,但它们的向量完全不相关,每个词沦为独立孤岛。
稀疏性:99.99% 元素为 0,信息密度极低,存储空间大量浪费。
2.3 第三阶段:稠密向量(Embedding)
为破解 One-Hot 的困境,稠密向量应运而生:
词汇表大小 = 50000向量维度 = 512# 远低于 50000"新" → [0.2, -0.5, 0.8, ..., 0.3]# 512 维稠密向量"年" → [0.1, -0.4, 0.7, ..., 0.2]"快" → [0.6, 0.3, -0.2, ..., 0.9]"乐" → [0.7, 0.2, 0.3, ..., 0.8]
稠密向量好在哪里?
语义相似性:语义相近的词,向量空间距离更近。例如
cos("猫", "狗") = 0.85(高相似度),而cos("猫", "汽车") = 0.12(低相似度)。信息密度高:每个维度编码某种语义特征,如维度 1 可能指示“动物 vs 非动物”,维度 2 可能表示“尺寸”,维度 3 可能反映“情感极性”,压缩表达远比 One-Hot 高效。
维度大幅降低:512 维 vs 50000 维,存储和计算效率提升近 100 倍,完美规避维度灾难。
可学习性:Embedding 向量在训练过程中持续优化,模型自动识别哪些语义特征对当前任务最关键。
直观类比:若描述一个人,One-Hot 就像一张超长清单,仅在一项上打勾,其余空白;而稠密向量更像一份紧凑档案,身高、体重、年龄、性格等多维数据均有具体值。哪个信息量更大,一目了然。
3. Embedding 层的本质 ?
3.1 Embedding 层的本质是查找表
Embedding 层内部维护一个嵌入矩阵(Embedding Matrix),形状为 [vocab_size, embedding_dim]。可将其视为一本字典:
词汇表大小 = 5向量维度 = 4嵌入矩阵 = [[0.1,0.2, -0.3,0.4],# Token 0 的向量[0.5, -0.1,0.6,0.2],# Token 1 的向量[0.3,0.8, -0.2,0.1],# Token 2 的向量[0.9,0.4,0.5, -0.3],# Token 3 的向量[0.2, -0.6,0.7,0.8] # Token 4 的向量]
当输入 Token ID 为 [2, 0, 3] 时,Embedding 层直接查表取出对应行,就像翻字典一样迅速:
输入 ID: [2, 0, 3]查表结果:Token 2 → [0.3,0.8, -0.2,0.1]Token 0 → [0.1,0.2, -0.3,0.4]Token 3 → [0.9,0.4,0.5, -0.3]输出形状: [3, 4]# 3个token,每个4维
之所以叫“查找表(Lookup Table)”,是因为 Embedding 操作本质上以 Token ID 为索引,从矩阵中直接提取对应行,时间复杂度 O(1),与字典查找同样高效。
3.2 查找表 vs 矩阵乘法的等价性
你或许会想,直接用 One-Hot 乘矩阵是否也能达到相同效果?数学上确实等价,但计算开销天差地别。
# 方法 1: 查找表(高效)Token ID: 2嵌入矩阵[2] → [0.3, 0.8, -0.2, 0.1]# 方法 2: 矩阵乘法(理论等价,但低效)One-Hot(2) = [0, 0, 1, 0, 0]# 第 2 位为 1One-Hot(2) × 嵌入矩阵:[0, 0, 1, 0, 0] × [[0.1,0.2, -0.3,0.4],[0.5, -0.1,0.6,0.2],[0.3,0.8, -0.2,0.1],← 仅这一行被选中[0.9,0.4,0.5, -0.3],[0.2, -0.6,0.7,0.8]]= [0.3, 0.8, -0.2, 0.1]# 结果完全一致!
为何等价?因为 One-Hot 向量中仅有一位为 1,矩阵乘法的结果就是嵌入矩阵中对应行的加权和,其余位置均为 0,实际只取出第 i 行。
但查找表比矩阵乘法快 3~5 倍:矩阵乘法需要执行 vocab_size × embedding_dim 次乘法和加法,而查找表直接取出对应行,时间复杂度 O(1),避免了大量乘以 0 的无效计算。反向传播时差异更为显著:矩阵乘法会将梯度传播至整个嵌入矩阵(大部分为 0,无意义),而查找表仅更新被查询的行,既高效又精准。
4. 总结 ?
以上即为 Token Embedding 的核心主干。掌握这些,后续学习 Transformer 其他组件将顺畅许多。回顾关键要点:
| 概念 | 说明 | 关键点 |
|---|---|---|
| Token | 文本处理的最小单位 | 可以是单词、子词、字符 |
| Embedding | 将离散 ID 映射为稠密向量 | 保留语义关系,维度低 |
| 查找表 | Embedding 层的本质 | 用 ID 索引直接取行,比矩阵乘法快 3~5 倍 |
| One-Hot | 早期向量化方法 | 维度灾难、语义孤立、已被淘汰 |
| 稠密向量 | 现代表示方法 | 语义相似性、信息密度高、可学习 |
? 关键理解:
- Embedding 是查找表,而非矩阵乘法(虽数学等价,但实现差异显著)
- 稠密向量比 One-Hot 高效百倍(维度降低两个数量级,语义关系可学习)
padding_idx用于标记填充位置(保持为 0,不参与训练)- Embedding 向量在训练中持续优化(模型自主习得语义特征)
最后更新时间:2026-06-01
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。