简介:Embedding 是深度学习中将离散符号转换为连续向量的核心技术。本文从定义、产生背景、学习方式、矩阵表示、典型应用场景以及与相关概念的区别等角度,系统解释 Embedding 为什么能刻画语义相似性,以及在工程实践中需要关注哪些问题,帮助读者建立完整、可落地的理解。
在深度学习中,Embedding 通常被翻译为“向量表示”“嵌入表示”或“词向量”。它的核心定义可以概括为:
Embedding 是一种将离散、稀疏的符号对象映射为连续、稠密的低维向量的表示方法。
这里的“符号对象”可以是:
映射之后,每个对象不再只是一个编号或独热向量,而是一个由浮点数组成的向量,例如:
猫 -> [0.91, 0.82, 0.13]狗 -> [0.87, 0.79, 0.15]汽车 -> [0.18, 0.11, 0.92]
从技术视角看,Embedding 是一种可学习的参数化映射。
从业务视角看,Embedding 是一种把现实世界对象转化为模型可计算表示的方式。
从使用视角看,Embedding 通常表现为“查表操作”:输入一个 ID,输出一个向量。
因此,Embedding 并不是某一种特定的神经网络结构,而是一种表示思想。它广泛应用于语言模型、推荐系统、图像分类、知识图谱等各类深度学习任务中。
要理解 Embedding 的价值,需要先回到一个基础问题:模型只能处理数值。
神经网络的计算基础是矩阵乘法、加法、非线性激活和梯度更新。这些运算都要求输入是数值。但现实世界中的很多对象并不是天然的数值,例如:
因此,在将现实对象输入模型之前,必须先进行数值化表示。
一种最直观的做法是给每个对象一个唯一编号,例如:
猫 -> 1狗 -> 2汽车 -> 3
但这种方式存在明显缺陷。
第一,编号之间的大小关系会产生误导。
模型可能认为“汽车”的编号 3 大于“猫”的编号 1,从而产生错误的计算语义。但事实上,3 并不比 1 更“高级”或更“重要”。
第二,编号无法表达对象之间的相似性。
在这种表示下,“猫”和“狗”的距离与“猫”和“汽车”的距离没有本质区别。模型无法得知“猫”和“狗”在语义上更接近。
第三,编号表示难以泛化。
模型看到编号 1 时,只能学习到“编号 1 的行为”。它不知道编号 1 和编号 2 是否有相似上下文,也无法将编号 1 的知识迁移到编号 2 上。
另一种常见方式是独热编码。例如,词表大小为 10000 时,“猫”可以表示为:
[1, 0, 0, 0, ..., 0]
独热编码解决了“编号大小产生误导”的问题,但仍然存在两个主要缺陷:
Embedding 的核心改进在于,它不再把每个对象视为孤立的符号,而是用一个可学习的连续向量表示。这个向量的每一维并没有人工规定的含义,但通过训练,可以逐步获得语义结构。
例如,经过训练后:
猫 -> [0.91, 0.82, 0.13]狗 -> [0.87, 0.79, 0.15]汽车 -> [0.18, 0.11, 0.92]
可以看到,“猫”和“狗”的向量在空间中更接近,而它们与“汽车”的向量距离较远。这样,对象的相似性就被转化为几何空间中的距离关系。
因此,Embedding 的核心价值可以归纳为三点:
Embedding 不是人工规定的向量,而是模型训练过程中自动学习出来的参数。
Embedding 学习的基本假设可以概括为:
在相似上下文中出现的对象,应该具有更接近的向量表示。
这一思想来自分布语义假设。例如,在大量语料中:
猫会喵喵叫狗会汪汪叫猫喜欢睡觉狗喜欢睡觉
“猫”和“狗”经常出现在类似的句子结构和语义环境中,而“汽车”则很少出现在这些语境中。因此,模型会逐步学习到:
cat_embedding ≈ dog_embeddingcat_embedding 远离 car_embedding
Embedding 通常不是单独训练的,而是作为整个神经网络的一部分,通过反向传播同步更新。
以语言模型为例,假设任务是给定上下文预测目标词。模型的大致流程如下:
经过大量样本训练后,语义相近的词会因为经常出现在相似任务中而获得相似的向量。
需要特别说明的是,Embedding 向量中的某个具体维度通常没有人工可解释的含义。例如,第 3 维是 0.13,并不直接表示“动物程度”或“大小”。真正有意义的是向量之间的相对关系,例如:
模型通过训练,使这些距离尽量反映对象之间的语义或业务关系。
在实际工程中,Embedding 通常表示为一个矩阵。
假设词表大小为 V,Embedding 维度为 d,那么 Embedding 矩阵可以写作:
E ∈ R^(V × d)
其中:
V:词表大小,表示一共有多少个需要表示的对象;d:每个对象的向量维度,例如 128、256、768 等。每一行对应一个对象的向量:
v_i = E[i]
当模型输入一个对象的 ID 时,Embedding 层的操作本质上是:
输入 ID i输出 E[i]
这是一种典型的查表操作。
在深度学习框架中,这通常通过 Embedding 层实现。伪代码如下:
# 通用伪代码,不绑定具体框架embedding_matrix = create_matrix(vocab_size, embedding_dim)def embedding_lookup(input_ids):return embedding_matrix[input_ids]
训练开始时,Embedding 矩阵通常使用随机初始化。随着模型训练,矩阵中的数值会不断调整,最终形成具有语义结构的向量空间。
Embedding 的应用范围非常广泛,并不局限于自然语言处理。
在语言模型中,Embedding 用于将词、子词或字符转换为向量。词嵌入是最经典的形式。
例如,在文本分类任务中,输入句子:
猫在睡觉
模型会先将其拆分为多个词,再通过 Embedding 层得到每个词的向量,最后输入到后续网络中。
Embedding 还可以用于:
在这些任务中,Embedding 的质量往往直接影响最终效果。
在推荐系统中,Embedding 用于表示用户和物品。
例如,用户 A 和用户 B 的行为历史相似,那么他们的 Embedding 向量应该更接近。物品 X 和物品 Y 经常被同一批用户点击,那么它们的 Embedding 也应该更接近。
通过 Embedding,推荐系统可以把用户和物品映射到同一个向量空间中,然后使用最近邻搜索找到与用户最匹配的物品。
这种方式相比传统协同过滤,能够更好地捕捉复杂行为模式,也更容易与深度学习模型结合。
在图像任务中,Embedding 可以表示图像、类别或视觉概念。
例如,在图像分类中,类别标签也可以通过 Embedding 表示。在图文匹配任务中,文本和图像可以分别映射到同一向量空间,使语义相似的图文对向量更接近。
这种将不同模态对象映射到统一空间中的做法,在跨模态检索、图文生成等场景中非常重要。
在知识图谱中,实体和关系可以通过 Embedding 表示。例如:
猫 -[属于]-> 动物
实体“猫”和“动物”可以通过 Embedding 学习到语义层级关系。基于 Embedding 的知识表示可以用于链接预测、图谱补全和问答系统。
在搜索系统中,查询词和文档标题可以分别进行 Embedding。通过计算查询向量与文档向量的相似度,可以召回语义相关但字面不匹配的内容。
例如,用户搜索“怎样让猫不抓沙发”,即使某篇文档没有完全出现这些词,只要其语义向量与查询向量相近,也可能被召回。
这种方式可以显著提升搜索系统的召回能力和语义理解能力。
在实际使用中,Embedding 经常与其他概念一起出现。为了避免混淆,需要明确它们之间的区别。
独热编码是静态、稀疏、高维的表示。
Embedding 是可学习、稠密、低维的表示。
独热编码无法表达相似性,Embedding 可以表达相似性。
独热编码不需要训练,Embedding 需要通过训练获得。
特征向量通常指人工设计的特征表示,例如年龄、价格、点击次数等。
Embedding 通常指自动学习得到的表示。
特征向量中的每一维通常有明确含义,Embedding 中的每一维通常没有明确含义。
特征向量不一定可学习,Embedding 是可学习参数。
在一些模型中,Embedding 特指最底层的查表向量,而编码器输出是经过多层网络计算后的上下文表示。
例如,在 Transformer 类模型中:
因此,一个词在不同句子中可能有不同的编码器输出,但它在 Embedding 层中只有一个基础向量。
在实际工程中使用 Embedding 时,需要关注多个方面。
Embedding 维度 d 是一个重要的超参数。
维度过低,表达能力不足,可能无法充分捕捉对象之间的差异。
维度过高,会增加模型参数量和计算成本,也容易导致过拟合。
常见的维度范围从几十到上千不等,需要根据数据规模、任务复杂度和模型能力进行选择。
Embedding 矩阵的大小与词表大小成正比。当词表过大时,Embedding 参数量会显著增加。
同时,实际使用中经常出现未在词表中出现过的对象,即未登录对象。常见处理方式包括:
这些策略需要在覆盖率与模型复杂度之间进行权衡。
在推荐系统或用户建模中,新用户或新物品没有足够的行为数据,其 Embedding 通常难以训练。
冷启动问题是 Embedding 工程实践中的典型挑战。常见缓解方式包括:
Embedding 矩阵通常参数量较大,且输入稀疏。训练时可能遇到以下问题:
可以使用正则化、Dropout、梯度裁剪等方式提高训练稳定性。
Embedding 会从训练数据中学习到统计规律,也可能继承数据中的偏置。
例如,词嵌入可能放大某些社会刻板印象。因此,在敏感场景中使用 Embedding 时,需要关注偏置评估和缓解。
Embedding 是深度学习中将离散世界转换为连续计算空间的核心表示方法。
它的本质不是简单地给对象一个数字编号,而是将对象映射为一个可学习的连续向量。通过训练,语义或业务上相近的对象会被映射到向量空间中相近的位置,从而使模型能够利用几何距离来理解对象之间的关系。
从形式上看,Embedding 是一个参数矩阵,输入对象 ID,输出对应向量。
从本质上看,Embedding 是一种表示学习机制,是连接现实对象与模型计算的重要桥梁。
在自然语言处理、推荐系统、搜索召回、图像与多模态学习、知识表示等场景中,Embedding 都发挥着基础性作用。理解 Embedding 的定义、原理和工程注意事项,是进一步学习深度学习模型和构建实际系统的重要前提。