跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

神经网络 Embedding 原理及作用详解

嵌入(Embedding)是将离散数据对象映射为低维稠密向量的技术,使相似对象在向量空间中距离更近。相比 One-hot 和整数编码,Embedding 能捕捉语义信息并降低维度。通过神经网络训练,可构建图像、文本等多模态联合空间,广泛应用于分类、检索及推荐系统。详细讲解了向量空间数学基础、嵌入构建原理及 PyTorch 代码实现。

狂少发布于 2025/2/7更新于 2026/9/975 浏览
神经网络 Embedding 原理及作用详解

神经网络 Embedding 原理及作用详解

在学习各种算法模型,特别是深度学习模型时,嵌入(Embedding)的应用无处不在。机器学习模型只接受数值组作为输入,字符或者图片首先需要转化成数值组,才能进入模型。常用的转化方式有三种:One-hot 编码、整数编码、嵌入(Embedding)的方法。

  • One-hot 编码是最常用的特征表示方法,优点是简单,但是随着特征空间的变大维度爆炸,而且无法学习到词语间的联系。
  • 整数编码将词映射为整数,但编码数值本身无含义,具有误导性,模型会误以为数字大小代表语义顺序。
  • 嵌入的方法通过学习构造一个低维、稠密的向量,可以更好地学习到字符的表示。常见的框架有 Word2Vec(基于浅窗口的方法)、FastText(基于浅窗口的方法)、GloVe(矩阵分解方法 + 窗口方法)等。在表示学习后,相似的词汇在向量空间中距离是接近的。

什么是嵌入?

嵌入是将某些数据对象表示为向量,其构造使得数据对象的某些属性被编码到其向量表示的几何属性中。

这非常抽象,但并不像听起来那么复杂。首先,我们需要介绍一点数学知识。向量是两个听起来不同但实际上相同的东西:

  1. 向量是多维空间中的一个点。
  2. 向量是标量值(即数字)的有序列表。

要了解其工作原理,请考虑包含两个数字的列表。例如 (6, 4) 和 (2, 8)。我们可以将它们视为 x-y 轴上的坐标,每个列表对应于二维空间中的一个点。

如果我们有三个数字,比如 (3, 2, 5) 和 (4, 5, 2),那么这对应于三维空间中的点。

重要的一点是,我们可以将其扩展到更多维度:四、五、一百、一千,甚至数百万或数十亿。绘制一个有一千个维度的空间是非常困难的,但从数学上讲,这真的很容易。

向量距离与相似度

点与点之间的距离只是毕达哥拉斯定理的应用。给定两个点 $a$ 和 $b$,它们之间的距离为:

$$ d(a, b) = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2} $$

对于 (6, 4) 和 (2, 8),这意味着:

$$ d((6, 4), (2, 8)) = \sqrt{(6-2)^2 + (4-8)^2} = \sqrt{16 + 16} = \sqrt{32} \approx 5.66 $$

对于三维,我们只是通过添加一个项来扩展公式。对于 $a=(3, 2, 5)$ 和 $b=(4, 5, 2)$:

$$ d(a, b) = \sqrt{(3-4)^2 + (2-5)^2 + (5-2)^2} = \sqrt{1 + 9 + 9} = \sqrt{19} \approx 4.36 $$

我们可以将这个公式扩展到任意数量的向量。除了距离之外,我们在高维向量空间中使用的另一种测量是两个向量之间角度的余弦。如果您不仅将每个向量视为一个点,而且将其视为原点的一条线,则可以计算两个向量之间的角度 $\theta$。

为了计算这一点,我们有另一个公式可以扩展到任意数量的维度。我们知道向量 $a$ 与 $b$ 之间的角度 $\theta$ 的余弦为:

$$ \cos(\theta) = \frac{a \cdot b}{|a| |b|} = \frac{\sum_{i=1}^{n} a_i b_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \sqrt{\sum_{i=1}^{n} b_i^2}} $$

这比看起来要复杂,但并不多。$a \cdot b$ 称为两个向量的点积,很容易计算。至于 $|a|$ 和 $|b|$,这些是向量的长度,即从原点到该点的距离。

这个余弦对应于大约 39.3° 的角度,但在机器学习中,我们通常会在计算余弦后停止,因为如果两个向量中的所有数字都大于零,那么角度的余弦将在 0 和 1 之间。这看起来像很多数学,但如果你仔细看一下,你会发现它只是加法、减法、乘法、除法、一个指数和一个平方根。你实际上不必做任何这些数学运算,计算机保留的全部原因就是为了做这种事情。

这一点之所以如此重要,是因为我们在计算机上保存的任何数据也只是一个数字列表。如果我们选择以这种方式看待它,那么每个数据项——数字图片、文本、录音、3D 模型文件,以及任何你能想到的可以放入计算机文件中的东西——都是一个向量。

我们如何为事物分配嵌入向量?

嵌入的目的是将向量分配给数据对象,以便它们在高维空间中的位置对有关它们的有用信息进行编码。数据对象——文本或图像或我们正在处理的任何其他对象——如果我们选择以这种方式看待它们,它们就已经是向量了。这些向量的位置并不能告诉我们任何关于它们的有用信息。

请看以下四张图片:每张图片都是 450x450 像素的图像,使用标准 RGB 调色板着色。这意味着图片由 202,500 个像素组成,每个像素的红色、绿色、蓝色值都有一个介于 0 到 255 之间的数字。将其转换为具有 607,500 个维度的向量是微不足道的。

我们可以拍摄任何一对图像并计算它们之间的距离或测量它们的余弦,但苹果不太可能彼此特别接近或与橙子特别远。至少,如果我们使用数百张苹果和橙子的图片,而不仅仅是四张,那是不可能的。

更有可能的是,我们会得到这样的东西:苹果和橙子是半随机放置并混合在一起的。我们不能画 600,000 维的图画,所以这张图只用两个维度来证明这一点:我们应该期望苹果和橙子是半随机放置并混合在一起的。

我们希望为每个图像分配一个唯一的嵌入,以便苹果靠近和远离橙子,反之亦然。为此,我们构建了一个神经网络(我们称之为嵌入模型),该网络将 607,500 维向量作为输入并输出一些其他向量,通常具有较少的维度。例如,广泛使用的 ViT-B-32 图像嵌入模型将输入图像转换为 512 维嵌入向量。

然后,我们用苹果和橙子的标记图片训练嵌入模型,指示它慢慢调整网络的权重,以分离苹果和橙子的嵌入向量。经过许多周期的训练后,我们预计,当我们将苹果的图片作为输入时,它将输出彼此更接近的向量,而不是当我们将橙子图片作为输入时,它们更接近我们得到的向量。

这些输出向量是嵌入,它们共同形成一个嵌入空间。单个嵌入的位置对有关其相应数据对象的有用信息进行编码:在这种情况下,无论某物是苹果还是橙子的图片。

区分苹果和橙子是一个非常简单的场景,但你可能很容易想象将其扩展到许多功能。在某些用例中,我们甚至可以构建嵌入,其中我们没有明确说明哪些特征是相关的,我们让神经网络在训练过程中弄清楚。例如,我们可以通过拍摄人脸照片并训练嵌入模型来构建人脸识别系统,以输出将同一个人的照片放在一起的嵌入。然后,我们可以构建一个以嵌入向量为键的人物图片数据库。

我们可能期望这个嵌入空间会编码许多我们从未显式训练它编码的特征。例如,它可能会将男性和女性隔离开来,或者人们通过头发的特征聚集在一起,例如秃顶或灰色。但是我们预计,如果我们在数据库中给它另一张某人的图片,那么该新图片的嵌入将更接近我们存储的该人的图片,而不是其他任何人。

当然,它也会找到长相相似的人,尽管我们希望他们不会像实际上相同的两个人那样亲密。这突出了嵌入空间的逻辑:输入是多种多样的,但通过将它们转换为嵌入,我们将特征(有时是复杂的、隐藏的、微妙的或不明显的特征)转化为软件可以轻松识别的几何属性。

嵌入空间还可以支持多种输入类型,如文本和图像,从而创建公共嵌入空间,并使您能够在两者之间进行映射。例如,如果我们有一个带有描述性标题的图片数据库,我们可以共同训练两个嵌入模型(一个用于图像,一个用于文本)以在同一嵌入空间中输出向量。结果是图像描述的嵌入和图像本身的嵌入将彼此接近。

原则上,任何类型的数字数据都可以作为创建嵌入的输入,任何成对的数据类型(不仅仅是文本和图像)都可以用于创建多模态联合嵌入空间。

嵌入有什么用?

我们已经展示了如何使用嵌入进行图像分类和人脸识别,但这还远远没有穷尽所有可能性。例如,从文本描述生成 AI 图像首先为文本和图像构建一个联合嵌入空间,然后,当用户输入文本时,它会计算该文本的嵌入并尝试构建一个将产生附近嵌入的图像。

嵌入通常非常有用,以至于它们在人工智能和机器学习中都可以看到应用。任何需要相似性/差异性评估、依赖于隐藏或不明显的特征,或者需要不同输入和输出之间的隐式上下文相关映射的对象,都可能以某种形式使用嵌入。

代码实现示例

在实际开发中,我们通常使用深度学习框架来实现 Embedding。以下是使用 PyTorch 实现一个简单的词嵌入层示例:

import torch
import torch.nn as nn

# 假设词汇表大小为 10000,嵌入维度为 128
vocab_size = 10000
embedding_dim = 128

# 定义 Embedding 层
embedding_layer = nn.Embedding(vocab_size, embedding_dim)

# 模拟输入:一批次包含 3 个样本,每个样本长度为 5 的词索引
input_indices = torch.tensor([
    [1, 2, 3, 4, 5],
    [10, 20, 30, 40, 50],
    [100, 200, 300, 400, 500]
])

# 获取嵌入向量
output = embedding_layer(input_indices)

print(f"输入形状:{input_indices.shape}")
print(f"输出形状:{output.shape}")
print("前几个嵌入值:")
print(output[0, :3, :5])

在这个例子中,nn.Embedding 层会自动初始化一个查找表,将输入的整数索引映射为指定维度的稠密向量。训练过程中,这些向量会根据损失函数不断调整,以捕捉词语之间的语义关系。

结论

嵌入背后的理论甚至并不复杂:它所涉及的只是从数据对象到高维向量空间中的点的映射,让具有共同属性的事物聚集在一起,相似事物有相近的向量数值。使用它们只是向量距离和余弦的问题,这仅仅是简单的数学运算!通过合理设计嵌入模型,我们可以有效地处理文本、图像、音频等多种模态的数据,为后续的机器学习任务提供高质量的输入表示。

常见的 Embedding 模型包括 Word2Vec、GloVe、BERT 等,它们在不同场景下各有优势。理解 Embedding 的原理有助于我们更好地设计和调优深度学习模型。

目录

  1. 神经网络 Embedding 原理及作用详解
  2. 什么是嵌入?
  3. 向量距离与相似度
  4. 我们如何为事物分配嵌入向量?
  5. 嵌入有什么用?
  6. 代码实现示例
  7. 假设词汇表大小为 10000,嵌入维度为 128
  8. 定义 Embedding 层
  9. 模拟输入:一批次包含 3 个样本,每个样本长度为 5 的词索引
  10. 获取嵌入向量
  11. 结论

更多推荐文章

查看全部
  • DeepSeek 使用指南:提示词技巧与本地知识库搭建
  • 微信小程序 WebView 与内嵌网页双向通信指南
  • Git 高效统计:作者提交次数与代码行数分析
  • Raphael AI:全球首个无限制免费 AI 图片生成器
  • OpenClaw 自托管 AI 网关安装部署指南
  • 免费 Trae 编辑器体验:i18n 任务排队千名及 AI 编程现状分析
  • Mac mini 打造家庭数据中心:集成 OpenClaw 与私有云导航服务
  • libwebkit2gtk-4.1-0 安装指南:Linux 桌面 WebView 开发配置
  • Jenkins 构建集群在 Kubernetes 上的实践与优化
  • RISC-V 智能家居中控开发实战:硬件、固件与通信全链路
  • 基于 LLaMA-Factory 微调与 vLLM 部署的大语言模型实战
  • OpenClaw Docker 部署指南:集成飞书钉钉 QQ 企业微信机器人
  • Python 调用 Ollama 本地大模型 API 实战指南
  • Python 环境安装与配置完整指南
  • 基于 Nexent 打造 AI 烹饪顾问:知识库与 MCP 生态实战
  • 花生二手车交易平台全栈项目实战:Spring Boot 3 与 Vue 3 高并发架构
  • SpringAI 大模型应用开发新手入门指南
  • Neo4j 在 Windows 上的安装与配置教程
  • AI 时代时序数据库进化论:选型逻辑已变
  • Minecraft 开源注入式客户端 LiquidBounce 使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online