当前位置: 首页 > article >正文

Embedding的用法

1. 什么是 Embedding?

Embedding 是一种将 离散数据(例如词汇、类别、索引等)转化为连续向量表示 的方法。它的核心思想是:

  • 将每个离散值(通常是索引)映射到一个连续的高维向量(嵌入向量)。
  • 嵌入向量在训练过程中是可学习的,能够捕捉到离散数据之间的潜在语义关系或结构。

数学表示:
Embedding ( i ) = W [ i ] \text{Embedding}(i) = W[i] Embedding(i)=W[i]
其中:

  • W W W 是嵌入矩阵,形状为 ( num_embeddings , embedding_dim ) (\text{num\_embeddings}, \text{embedding\_dim}) (num_embeddings,embedding_dim)
  • i i i 是输入的索引, W [ i ] W[i] W[i] 是嵌入矩阵第 i i i 行的向量。

2. torch.nn.Embedding 的参数解析

torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)
参数含义
num_embeddings嵌入矩阵的行数,对应输入索引的总类别数。
embedding_dim嵌入向量的维度。每个索引会被映射到这个维度的向量。
padding_idx指定某个索引为填充索引,嵌入层会将这个索引对应的嵌入向量置为全零,不参与梯度更新。这通常用于处理序列填充(padding)。
max_norm如果设置了值,会将每个嵌入向量的 L2 范数裁剪为 max_norm,用于正则化,防止向量过大。
norm_typemax_norm 搭配使用,定义范数的类型(默认是 L2 范数)。
scale_grad_by_freq如果为 True,梯度会根据某个索引在输入中出现的频率进行缩放。这种设置在处理语言模型时很有用,因为高频词通常需要更小的更新步长。
sparse如果为 True,会使用稀疏更新以节省内存和计算资源。这对大规模的嵌入矩阵特别有用(例如处理超大词表的语言模型)。

3. 工作原理

(1) 嵌入矩阵

嵌入层的核心是一个可以学习的矩阵 W W W,形状为:
W ∈ R num_embeddings × embedding_dim W \in \mathbb{R}^{\text{num\_embeddings} \times \text{embedding\_dim}} WRnum_embeddings×embedding_dim

  • 行数 num_embeddings 对应输入索引类别的总数。
  • 列数 embedding_dim 每个索引的嵌入向量的维度。
(2) 索引到嵌入向量的映射

输入一个整数索引 i i i,Embedding 层会从矩阵中取出第 i i i 行:
Embedding ( i ) = W [ i ] \text{Embedding}(i) = W[i] Embedding(i)=W[i]
输出的是一个大小为 embedding_dim 的连续向量。

(3) 如何学习嵌入?

嵌入矩阵 W W W 的每一行向量会在训练过程中通过梯度下降优化,使得这些向量捕捉到输入索引的语义或特征关系。


4. Embedding 的作用

(1) 离散数据的连续化表示

嵌入层可以将离散数据(例如单词、分类标签)转化为连续向量,便于深度学习模型处理:

  • 离散数据本质上是无序的,无法直接输入到神经网络中。
  • 嵌入层通过学习使得每个索引有一个向量表示,可以直接作为网络输入。
(2) 捕捉隐式关系

嵌入向量的维度允许模型学习到输入索引之间的隐式语义关系。例如:

  • 在词嵌入中,torch.nn.Embedding 会学习到词汇之间的语义距离。
  • 在图神经网络中,嵌入层可以学习到节点之间的结构关系。
(3) 降低维度

相比独热编码(One-Hot Encoding)方法,Embedding 映射可以显著减少输入维度:

  • 独热编码会将一个索引映射为 n u m _ e m b e d d i n g s num\_embeddings num_embeddings 维的稀疏向量。
  • Embedding 将索引映射为 embedding_dim 维的稠密向量,大大降低计算成本。

5. 应用场景

(1) 自然语言处理
  • 用于词嵌入(Word Embedding),例如将单词索引转化为词向量。
  • 示例:
    embedding = torch.nn.Embedding(1000, 64)  # 1000个词汇,每个词映射到64维向量
    input_indices = torch.tensor([0, 5, 7])  # 输入的单词索引
    output_vectors = embedding(input_indices)  # 输出对应的嵌入向量
    
(2) 图神经网络
  • 将节点索引映射为节点嵌入,用于捕捉图的结构信息。
(3) 强化学习
  • 用于表示离散动作或状态。例如强化学习中的动作空间可以用嵌入层表示,使得每个动作具有高维语义向量。
(4) 推荐系统
  • 将用户 ID 和商品 ID 转化为连续嵌入,用于用户行为建模。

6. 示例代码与输出

代码示例
import torch
import torch.nn as nn

# 定义Embedding层
embedding = nn.Embedding(10, 3)  # 10个类别,嵌入维度为3

# 打印嵌入矩阵
print("初始嵌入矩阵:")
print(embedding.weight)

# 输入索引
input_indices = torch.tensor([0, 4, 7])

# 计算嵌入向量
output_vectors = embedding(input_indices)
print("\n输入索引:", input_indices)
print("对应的嵌入向量:")
print(output_vectors)
输出结果
  1. 初始嵌入矩阵
    一个随机初始化的嵌入矩阵 W W W,每行是一个嵌入向量:

    tensor([[ 0.05,  0.12, -0.03],
            [-0.11,  0.25,  0.18],
            [ 0.21, -0.01, -0.13],
            ...])
    
  2. 输入索引
    输入 [0, 4, 7]

  3. 输出嵌入向量
    从嵌入矩阵中取出索引对应的行:

    tensor([[ 0.05,  0.12, -0.03],
            [-0.11,  0.25,  0.18],
            [ 0.21, -0.01, -0.13]])
    

7. 总结

  • 核心功能: 将离散的索引映射为连续向量表示。
  • 优点:
    • 提高模型处理离散数据的能力。
    • 显著降低计算复杂度。
    • 能学习到输入数据的语义关系。
  • 应用: 广泛用于 NLP、推荐系统、图神经网络和强化学习等领域。

http://www.kler.cn/a/398910.html

相关文章:

  • Ceph PG(归置组)的状态说明
  • 鸿蒙中如何实现图片拉伸效果
  • 计算机视觉 1-8章 (硕士)
  • Pytest从入门到精通
  • 微信小程序设置屏幕安全距离
  • GitLab 如何降级?
  • SSDT Hook
  • 小程序-基于java+SpringBoot+Vue的校园失物招领系统设计与实现
  • outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务
  • TCP实现网络通信(多进程与多线程版本)
  • 正则表达式语法详解(python)
  • Area-Composition模型部署指南
  • vue 中使用rem布局
  • Pytest-Bdd-Playwright 系列教程(10):配置功能文件路径 优化场景定义
  • AB矩阵秩1乘法,列乘以行
  • AWD脚本编写_1
  • JQuery 基础知识学习(详尽版)2024.11.17
  • 内联函数与普通函数有什么区别?如何定义和使用内联函数?
  • Thinkphp6视图介绍
  • oracle19c开机自启动
  • 洛谷刷题日记||基础篇8
  • HarmonyOs DevEco Studio小技巧31--卡片的生命周期与卡片的开发
  • uni-app快速入门(八)--常用内置组件(上)
  • 人机界面中的数据、信息、知识、算法分层
  • UE5遇到问题记录—在sequence制作时如何让角色隐藏/显示?
  • 数据结构_图的遍历