Embedding(向量化)
一、 什么是 Embedding(向量嵌入)?
在机器学习和大语言模型(LLM)的语境下,Embedding(嵌入,或称向量嵌入) 是一种将现实世界中高维且非结构化的离散符号(如汉字、英文单词、整篇文章、物理图片、音频甚至用户行为),转化为低维、连续、密集实数向量(Vector)的数学方法。
它是现代人工智能和所有多模态/大模型架构的通用通行证。如果没有 Embedding,AI 就无法理解、也无法计算任何现实世界中的符号。
二、 为什么要引入 Embedding?(它干掉了什么痛点)
在 AI 领域,芯片和算力底座本质上只能高频运行纯粹的数学运算(如矩阵乘加),它根本不认识字母或符号。要想让电脑处理文字,最初的办法是 One-Hot Encoding(独热编码)。
1. 传统 One-Hot 的灾难
假设我们的词典里只有 4 个词:['狗', '猫', '狼', '苹果']。用 One-Hot 表示它们:
- 狗 =
[1, 0, 0, 0] - 猫 =
[0, 1, 0, 0] - 狼 =
[0, 0, 1, 0] - 苹果 =
[0, 0, 0, 1]
致命缺陷:
- 维度灾难:如果中文词典有 10 万个词,每个词向量的长度就是 10万维,但其中 99.99% 的位置全是 0(极度稀疏),这会瞬间挤爆 GPU 的存储(SRAM/HBM)。
- 语义孤岛(最致命):在数学上,任意两个 One-Hot 向量进行点积(Dot Product)计算,结果永远是 0。这意味着在算法眼里,“狗”和“狼”的亲缘关系,与“狗”和“苹果”的亲缘关系完全一样(它们的正交夹角都是 $90^\circ$)。这彻底抹杀了现实语言的“上下文语义”。
2. Embedding 的降维打击
Embedding 通过算法学习,把高维稀疏的符号压缩进一个固定维度(如 768 维、1536 维或 3072 维)的连续数学空间中。每个位置不再是 0 或 1,而是变成了类似 [-0.23, 0.45, 0.89, ...] 这样的浮点数。
它的核心魔法在于语义几何化。含义相近的词,在空间中的物理距离会非常接近。比如在空间中计算余弦相似度,向量 $\vec{\text{狗}}$ 和 $\vec{\text{狼}}$ 的夹角会非常小,而它们与 $\vec{\text{苹果}}$ 的夹角会非常大。
三、 Embedding 是怎么实现的?
在底层的工业级代码和架构中,Embedding 的实现可以分为静态字典映射(大模型输入端)和神经网络动态学习两个故事线:
1. 在 PyTorch / 大模型输入端:利用查找表(Lookup Table)秒级实现
在大模型(如 Transformer 架构)的开头,通常会看到一行标志性的核心代码:
import torch.nn as nn
# 声明一个 Embedding 层:词表大小为 32000,每个词压缩成 768 维的向量
embedding_layer = nn.Embedding(num_embeddings=32000, embedding_dim=768)
物理层面的执行机理:
- 本质是个大矩阵:
nn.Embedding在底层显存(HBM)中,物理上就是开辟了一个大小为 $32000 \times 768$ 的二维浮点数矩阵。这矩阵里的数值一开始是随机初始化的。 - “查表”代替“矩阵乘法”:当输入一个单词的 ID(比如“狗”的 ID 是
142)时,这个算子在底层不需要进行任何繁琐的数学乘法计算。它直接利用 GPU 的指针偏移寻址,直接去该矩阵中把第 142 行的那个 768 维向量“捞出来”。 - 前向传播的产物:查表出来的这行向量,就是该 Token 的物理 Embedding,接着它就会被送入后面的 Transformer 层。
2. 空间里的语义分值,是怎么学出来的?(以经典的 Word2Vec 算法为例)
查表矩阵一上来全是随机乱码,它怎么就知道“狗”和“狼”应该挨在一起?这是靠海量数据自监督训练出来的。
最经典的实现方式是 Word2Vec(连续词袋模型 CBOW 或 Skip-gram 架构)。其核心物理第一性原理是:“一个单词的含义,由它周围的上下文决定。”
- 实现步骤(以预测上下文为例):
- 准备数据:拿来几百 GB 没有任何人工标注的原始网页文本(比如大量包含
“猎人带着小狗去森林里打猎”这种句子)。 - 构建训练任务:强行让神经网络玩一个“完形填空”的游戏——输入中间词
“小狗”,让模型去预测周围可能出现的词“猎人”、“森林”。 - 计算 Loss 修正空间:
- 如果模型一开始随机预测成了
“苹果”,损失函数(Cross-Entropy Loss)就会算出极大的惩罚得分。 - 反向传播(Backward)启动,梯度沿着网络回传,无情地修改
nn.Embedding矩阵中第 142 行(“小狗”那一行)的 768 个浮点数数值。
- 百亿次迭代后的奇迹:因为在海量语料中,“狗”和“狼”的周围高频出现相似的词(如“骨头”、“尾巴”、“森林”),经过几百个 Epoch 的梯度轰炸后,“狗”和“狼”这两行的向量数值在数学上会极其平滑地向彼此靠拢、逼近。
四、 从文本到万物:多模态与现代 RAG 中的 Embedding
随着技术演进,Embedding 已经不再局限于给“单个单词”编码,它进化出了更高级的物理实现:
- 整句/整篇语义嵌入(Sentence / Text Embedding):
利用训练好的 BERT 或者是 OpenAI 的text-embedding-3-small模型。你丢给它一整篇上万字的故障运维日志,模型内部的 Attention 层会对全篇特征进行多层加权聚合,最终同样只吐出一个单一的 1536 维向量。这个向量代表了整篇文章的“核心思想”。它是构建我们之前聊过的 RAG(检索增强生成)向量数据库 的绝对物理基石。 - 多模态对齐嵌入(如 OpenAI CLIP 架构):
怎么把文字和物理图片联系起来?
- 实现方法:并排拉起两个神经网络,左边是
Text Encoder(处理文字),右边是Image Encoder(通过 CNN / ViT Patch 抽取图片像素)。 - 强行对齐:灌入海量“图文配对”数据。如果输入一张真狗的图片,同时输入文字
"一隻可爱的柯基"。算法会强行计算两边向量的余弦夹角,目标是让配对的图文向量乘积最大,不配对的(如狗图配上“苹果”文字)乘积最小。 - 最终成果:训练结束后,图像和文字被完美融合成同一个宇宙的坐标系。大模型自此能够用文字去精准检索图片,或者看图说话。
💡 总结一句话
实现 Embedding,在工程层面上就是构建并训练一个超大的“特征查找字典”矩阵。 它通过反向传播将复杂的、人类可读的现实语义,润物细无声地压缩重构为 GPU 最擅长高频暴算的密集连续向量,建立起 AI 认知万事万物的数字几何空间。对于这一套向量生成系统,你接下来打算优先在哪个实战场景(例如搭建 RAG 知识库向量检索,或是多模态对齐)中去落地它呢?
