简介:本文从底层机制出发,系统拆解Embedding如何将离散文本映射为稠密向量,解析词表构建、向量空间语义、模型训练与推理全流程,帮助开发者理解AI“语义理解”背后的数学逻辑与工程边界。
从计算本质上看,计算机只能处理数值。无论是加法、矩阵乘法还是梯度下降,底层操作对象都是浮点数或整数。当我们将“苹果”“爱情”“代码”这样的自然语言符号直接交给机器时,它无法执行任何有意义的运算——因为符号本身不具备可计算的代数结构。
Embedding(嵌入)要解决的核心问题是:如何把离散的、高维的、符号化的文本,映射为连续的、低维的、可计算的稠密向量,并且让向量之间的距离或方向能够表达语义关系。
换一个角度说,Embedding 是一套“语义编码器”。它不负责理解文字本身,而是负责把文字投射到一个数学空间中,在这个空间里,语义相近的词或句子,其向量表示也彼此靠近。AI 后续的所有“理解”行为,本质上都是在这个向量空间中做几何运算。
在 Embedding 出现之前,文本表示主要依赖两类方法:
核心矛盾在于:离散符号之间没有距离概念,而机器学习模型需要连续可导的输入。 Embedding 的目标就是构造一个映射函数,把每个离散符号变成一个稠密向量,使得向量空间中的几何关系与语义关系形成对应。
理解 Embedding 需要先掌握三个基础概念:
一个关键认知是:Embedding 向量中的每一维并不对应某个具体的人类可解释特征,而是模型在训练过程中自动学习到的分布式表示。语义信息分散在整个向量的多个维度上,这正是“分布式表示”的含义。
在典型的神经网络架构中,Embedding 层通常位于模型最前端,其结构可以拆解为以下几个部分:
| 组件 | 作用 |
|---|---|
| 词表映射模块 | 将输入 token 转换为整数索引 |
| 嵌入矩阵 | 形状为 [词表大小, 嵌入维度] 的可训练参数矩阵 |
| 查表操作 | 根据索引从嵌入矩阵中取出对应行向量 |
| 后续网络层 | 对取出的向量序列进行编码、池化或注意力计算 |
用伪代码表示 Embedding 层的前向过程:
# 假设词表大小为 V,嵌入维度为 Dembedding_matrix = 初始化形状为 [V, D] 的矩阵# 输入 token 序列tokens = ["苹果", "生长", "在", "树上"]indices = [词表[t] for t in tokens] # 例如 [1024, 3876, 56, 2098]# 查表得到向量序列vectors = [embedding_matrix[i] for i in indices]# 输出形状为 [序列长度, D]
可以看到,Embedding 层本身没有复杂的非线性变换,它的核心就是一个可学习的查找表。但正是这个查找表,承载了从离散符号到连续语义空间的映射能力。
以一段文本输入为例,Embedding 的完整处理流程可以分为以下步骤:
第一步:文本预处理与分词
将原始文本切分为 token 序列。对于中文,可能按字、按词或按子词切分;对于英文,通常按子词切分。分词结果决定了词表覆盖范围和后续语义粒度。
第二步:token 转索引
根据预先构建的词表,将每个 token 映射为唯一的整数索引。未登录词通常映射到特殊的 [UNK] 标记。
第三步:查表得到初始向量
通过索引从嵌入矩阵中取出对应的稠密向量。此时每个 token 得到一个长度为 D 的向量。
第四步:上下文编码(可选但常见)
初始 Embedding 是静态的,同一个词在不同语境下向量相同。为了引入上下文,后续会接入注意力机制或循环网络,对向量序列进行再编码,生成上下文相关的表示。
第五步:池化或聚合
对于句子级或文档级任务,需要将变长向量序列聚合成固定长度向量。常见方法包括平均池化、最大池化或使用特殊标记的向量。
第六步:输出到下游任务
最终得到的向量送入分类层、相似度计算模块或检索索引,完成具体任务。
嵌入矩阵并非人工设计,而是通过训练自动学习。其核心机制可以从以下几个角度理解:
不同的训练目标会塑造出不同性质的向量空间:
在反向传播过程中,嵌入矩阵中只有被当前 batch 中出现的 token 对应的行会收到梯度更新。这意味着:
当词表很大时,直接对全词表做 softmax 计算代价极高。常见做法是采用负采样或分层 softmax,将多分类问题转化为二分类或层次化分类问题,从而降低计算复杂度,同时仍然能够驱动嵌入矩阵学习到有区分度的向量。
训练完成后,向量空间会呈现出一些有趣的几何规律:
这些性质并非人为规定,而是训练目标与数据分布共同作用的结果。
假设词表只有四个词:[苹果, 香蕉, 电脑, 编程],嵌入维度为 2。初始时嵌入矩阵随机初始化:
苹果: [0.1, 0.3]香蕉: [0.2, 0.1]电脑: [0.8, 0.7]编程: [0.9, 0.6]
经过大量语料训练后,模型发现“苹果”和“香蕉”经常出现在相似的上下文(如“吃”“水果”“甜”),而“电脑”和“编程”经常一起出现(如“写”“代码”“运行”)。梯度更新会逐渐把前两者的向量拉近,后两者的向量拉近,最终可能变成:
苹果: [0.2, 0.8]香蕉: [0.25, 0.75]电脑: [0.8, 0.2]编程: [0.85, 0.15]
此时,计算余弦相似度会发现,“苹果”与“香蕉”相似度高,“电脑”与“编程”相似度高,而两组之间的相似度低。这就是 Embedding 表达语义的基本原理。
优势:
限制与边界:
Embedding 的本质是一张可学习的查找表,它把离散的 token 映射到连续的稠密向量空间。通过训练,语义相近的 token 在空间中彼此靠近,从而使机器能够以数值计算的方式处理语言。它不“懂”文字,但它构建了一个让后续模型能够执行语义计算的数学基础。理解 Embedding 的底层机制,有助于开发者在模型选型、维度设计、词表管理和下游任务适配时做出更合理的工程决策。