简介:神经网络只能处理数字,文本进入模型前必须先完成数值化。本文系统对比“编号/One-Hot表示”与“Embedding向量表示”两类主流文本表示方案,从语义表达、维度规模、可学习性、检索能力、工程成本等维度拆解核心差异,并给出典型场景的选型建议与迁移注意事项,帮助你为文本建模选对第一块基石。
神经网络有一个天然限制:只能处理数字,不能直接处理文字或符号。比如一句话“猫在睡觉”,在计算机眼中只是一串字符,既没有含义,也无法参与矩阵运算。因此,任何文本相关任务(分类、搜索、推荐、翻译、对话)在建模之前,都必须先回答一个问题:把词变成什么形式的数字?
这个问题看似简单,实际上很大程度上决定了下游模型的能力上限。业界常见做法可以归纳为两类方案:
两类方案都能“把文字变成数字”,但它们在语义表达、可学习性、工程成本与使用边界上的差异非常大。本文围绕这两类方案展开系统对比,说明它们分别解决什么问题、差异来自哪里、什么场景该选什么,以及从方案A走向方案B时需要注意什么。
最直观的做法是建一张词表,给每个词分配一个编号:猫→1,在→2,睡觉→3。
编号解决了“能不能算”的问题,但引入了新的麻烦:编号本身没有任何相似性信息。1和2在数值上很接近,但“猫”和“在”毫无关系;反过来,语义相近的“猫”和“狗”可能被分配到相距很远的编号。更糟的是,编号的连续性会让模型误以为存在”1<2<3”的顺序关系,而这种关系纯属词表分配的偶然结果。
One-Hot是对编号的规范化:把编号展开为“长度等于词表大小、仅对应位置为1、其余为0”的二值向量。它消除了虚假的顺序关系(任意两个词的向量互相正交),但代价是:任意两个不同的词相似度恒等于0——“猫”和“狗”的相似度,与“猫”和“汽车”的相似度完全一样。语义信息依然彻底丢失。
Embedding的核心思想是:用向量表示词语,用向量空间中的几何关系刻画语义。每个词不再是单个数字,而是固定维度的实数向量:word → v ∈ R^d,例如:
在这种表示下,“猫”与“狗”的向量非常接近,“猫”与“汽车”相距很远,与人类认知一致。更重要的是,这些向量通常不是人工指定的,而是作为模型参数从大量数据中训练出来的:经常出现在相似上下文中的词,会被推向空间中相近的位置。语义结构是“学”出来的,不是“编”出来的。
从实现上看,Embedding本质上是一张可学习的查找表:一个形状为“词表大小×向量维度”的矩阵,词的编号作为行索引,取出对应行向量。这也解释了一个关键事实:Embedding等价于One-Hot向量经过一个线性变换的结果,两者在数据流上是衔接的,本质差异在于“这个变换是固定的,还是可学习的”。
尽管差异显著,两类方案也有明确共同点,理解它们有助于把握适用边界:
在One-Hot世界中,任意两个不同词的内积恒为0、余弦相似度恒为0——所有词在几何上“等距”,模型无法从中学到“谁和谁更相关”的任何信息。整数编号则更糟:它不仅没有相似性,还伪造了顺序性。而Embedding中,语义相近的词被训练到相邻位置,“猫”与“狗”夹角很小,与“汽车”夹角很大;且这种相似度是可计算的(余弦相似度、内积、欧氏距离),可以直接进入损失函数与检索系统,成为可优化的对象。这是两类方案最本质的分水岭:语义从“不可表示”变为“可计算”。
One-Hot的维度等于词表大小,常见词表可达数万乃至数十万级,向量中只有一个1,其余全为0,是极端稀疏表示。这带来两个问题:一是维度灾难,高维稀疏输入使下游层参数量随词表爆炸,容易过拟合;二是无效计算,绝大部分乘法在和0相乘。Embedding的维度与词表解耦,是人为设定的超参数,常见从几十维到上千维;无论词表多大,每个词都被压缩为同一长度的稠密向量,查表后的下游计算全部是稠密矩阵运算,对硬件更友好。
One-Hot是“设计出来的”,确定词表后就固定不变,不携带任何可优化的语义。Embedding矩阵本身是模型参数的一部分,随反向传播逐轮更新:任务要求“猫和狗可以互换”,梯度就会把它们的向量拉近;任务要求区分情感,表示就会朝情感方向分化。同一个词在不同任务、不同语料下学到的向量并不相同——语义空间是被数据与训练目标共同塑造的。这种端到端可学习性,是Embedding成为深度学习标配组件的根本原因。
One-Hot下每个词是孤立原子,“猫”出现一万次对“狗”的表示毫无帮助。Embedding下,相近词共享几何邻域,统计强度可以互相借力:低频词可以借助其近邻获得泛化。此外,Embedding支持“先在通用语料上预训练、再迁移到具体任务”的范式,小数据任务也能站在大数据的肩膀上;One-Hot不存在这种迁移——它的全部“知识”就是词表本身。
语义检索的本质,是把“找意思相近的内容”转化为“找向量相近的邻居”。One-Hot的正交性使这一步无从谈起。Embedding使相似度成为向量运算,配合近似最近邻(ANN)索引,可以在亿级向量中毫秒级完成近邻查询,这是语义搜索、推荐召回、知识库问答的通用技术底座。计算层面,Embedding是一次查表加稠密矩阵乘,实现高效且易于批量并行。
One-Hot几乎零成本:建词表、写映射即可,无需训练、无需向量索引。Embedding的成本分布在多个环节:训练算力(或选型预训练向量的评估成本)、向量存储与索引内存(维度×数量×索引开销)、线上检索的延迟与容量规划、词表与模型版本管理、以及更换模型时的全量向量重建。这些成本不是缺点,而是语义能力的“对价”,但必须在架构设计阶段纳入预算。
One-Hot边界明确:表达不了语义,不适合大词表的深度模型。Embedding的边界同样需要正视:其一,向量空间是黑盒,可解释性弱,排查问题需借助近邻可视化等手段;其二,会忠实编码训练数据中的偏见与噪声,敏感场景需额外评估;其三,为每个词学习单一静态向量,难以处理一词多义,因此业界进一步发展出基于上下文的动态向量表示;其四,大规模检索需在召回率与延迟之间做权衡调优。
| 对比维度 | 编号 / One-Hot 表示 | Embedding 向量表示 |
|---|---|---|
| 表示形态 | 整数ID或词表长度的稀疏二值向量 | 固定维度的稠密实数向量 |
| 语义信息 | 无,任意两词正交 | 有,距离与方向刻画语义相似度 |
| 向量维度 | 等于词表大小,可达数十万维 | 与词表解耦,常见几十至千余维 |
| 可学习性 | 固定,不可训练 | 模型参数,随任务端到端学习 |
| 泛化迁移 | 差,词间无统计共享 | 强,可预训练后迁移 |
| 相似度检索 | 不可行 | 支持近邻检索,语义搜索与推荐召回的基础 |
| 计算与存储 | 稀疏、高维、运算低效 | 查表+稠密运算高效,但需维护向量与索引 |
| 实现维护成本 | 极低,无需训练 | 需训练或选型,需管理词表版本与索引 |
| 可解释性 | 直观 | 弱,黑盒空间 |
| 典型适用 | 类别少且无序的特征、规则系统、树模型输入 | 文本理解、语义检索、推荐召回、聚类、大模型输入 |
# ========== 方案A:One-Hot 表示(示意) ==========vocab = {"猫": 0, "狗": 1, "汽车": 2}one_hot("猫") = [1, 0, 0]one_hot("狗") = [0, 1, 0]one_hot("汽车") = [0, 0, 1]cos(one_hot("猫"), one_hot("狗")) = 0 # 不同词一律正交,无差别cos(one_hot("猫"), one_hot("汽车")) = 0 # 无法体现"猫狗更相近"# ========== 方案B:Embedding 表示(示意) ==========embedding_table = {"猫": [0.9, 0.8, 0.1],"狗": [0.85, 0.75, 0.12],"汽车": [0.2, 0.1, 0.9],}cos(embedding["猫"], embedding["狗"]) ≈ 0.99 # 语义相近 → 距离极近cos(embedding["狗"], embedding["汽车"]) ≈ 0.33 # 语义无关 → 距离明显拉远
同样三个词,One-Hot给出了三张“彼此无关”的标签,Embedding则给出了一个“猫狗抱团、汽车远离”的语义结构。
适合编号/One-Hot的场景:
适合Embedding的场景:
在工程落地阶段,训练、存储与检索链路既可以完全自建,也可以使用托管化能力。例如,百度智能云提供了向量检索、模型服务与大模型平台等通用类产品,可将训练资源、向量索引与推理部署的基础设施运维交给托管服务,团队更聚焦于表示方案设计与业务效果验证。自建还是托管,取决于团队运维能力、数据合规要求与成本结构,并无绝对优劣。
回到最初的问题:到底什么是Embedding,为什么要引入它?一句话概括——编号/One-Hot解决了“文字能不能算”的问题,Embedding解决了“语义能不能被表达和计算”的问题。One-Hot告诉你“每个词是不同的”,Embedding告诉你“词与词之间如何相关”。
从离散到稠密、从固定到可学习、从无语义到可检索,是文本表示演化的主线。选型的核心判断依据有三条:任务是否需要语义、数据规模是否支撑训练或迁移、工程与成本约束是否允许。想清楚这三点,再对照上文维度表与场景清单,就能为你的系统选到合适的文本表示方案——既不低估语义表示的价值,也不过度设计。