一文搞懂Embedding

nn.Embedding 是 PyTorch 中用于处理离散数据(如单词或字符)的一个模块。它将离散的整数索引映射为连续的稠密向量表示(embedding vectors)。这种技术通常用于自然语言处理(NLP)任务中,例如文本分类、机器翻译和语言模型。

1. 基本概念

离散数据:在 NLP 中,文本通常被表示为单词或字符的序列,而这些单词或字符是离散的符号。
Embedding:为了使模型能够学习这些离散符号之间的关系,我们可以将它们映射到一个低维的连续空间中,这个连续空间中的每个点就是一个 embedding 向量。

nn.Embedding 的作用就是定义一个查找表(lookup table),将输入的整数索引映射到对应的 embedding 向量。

2. 参数说明

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)
2.1. 参数详解:
  1. num_embeddings:
    • 表示词汇表的大小,即有多少个不同的离散符号(如单词数量)。
    • 例如,如果你的词汇表包含 10,000 个单词,则 num_embeddings=10000
  1. embedding_dim:
    • 表示每个 embedding 向量的维度。
    • 例如,如果你想将每个单词映射到一个 300 维的向量,则 embedding_dim=300
  1. padding_idx(可选):
    • 指定一个特殊的索引值,用于填充(padding)。
    • 如果设置为某个值(如 padding_idx=0),则该索引对应的 embedding 向量会被初始化为全零,并且在训练过程中不会更新。
  1. max_norm(可选):
    • 如果设置为某个值(如 max_norm=1.0),则会限制所有 embedding 向量的范数不超过该值。
    • 这有助于防止梯度爆炸。
  1. norm_type(可选,默认为 2.0):
    • max_norm 配合使用,表示计算范数时使用的类型(如 L2 范数)。
  1. scale_grad_by_freq(可选,默认为 False):
    • 如果为 True,则会根据每个索引的频率对梯度进行缩放。
    • 频率越高,梯度越小。
  1. sparse(可选,默认为 False):
    • 如果为 True,则使用稀疏梯度更新。
    • 这可以节省内存,但只支持某些优化器(如 torch.optim.SparseAdam)。
3. 输入和输出
3.1. 输入:
  • 输入是一个形状为 (batch_size, sequence_length) 的张量,其中每个元素是一个整数索引。
  • 例如,假设我们有以下输入:
input = torch.tensor([[1, 2, 3], [4, 5, 6]])

这里,input 表示一个批次中有两个句子,每个句子包含 3 个单词。

3.2. 输出:
  • 输出是一个形状为 (batch_size, sequence_length, embedding_dim) 的张量。
  • 每个整数索引都会被替换为其对应的 embedding 向量。
  • 例如,如果 embedding_dim=4,则输出可能是:
output = torch.tensor([
    [[0.1, 0.2, 0.3, 0.4], [0.5, 0.6, 0.7, 0.8], [0.9, 1.0, 1.1, 1.2]],
    [[1.3, 1.4, 1.5, 1.6], [1.7, 1.8, 1.9, 2.0], [2.1, 2.2, 2.3, 2.4]]
])
4. 使用示例
4.1. 示例 1:简单的 Embedding 查找
import torch
import torch.nn as nn

# 定义一个 Embedding 层
embedding = nn.Embedding(num_embeddings=10, embedding_dim=4)

# 输入是一个形状为 (batch_size, sequence_length) 的张量
input = torch.tensor([[1, 2, 3], [4, 5, 6]])

# 获取对应的 embedding 向量
output = embedding(input)
print(output)

输出结果可能类似于:

tensor([[[ 0.0253, -0.0374,  0.0421, -0.0123],
         [-0.0124,  0.0532, -0.0211,  0.0201],
         [ 0.0342, -0.0101,  0.0234, -0.0102]],

        [[-0.0421,  0.0213, -0.0112,  0.0321],
         [ 0.0112, -0.0342,  0.0213, -0.0123],
         [-0.0234,  0.0123, -0.0412,  0.0213]]])
4.2. 示例 2:指定 padding_idx
embedding = nn.Embedding(num_embeddings=10, embedding_dim=4, padding_idx=0)

# 输入包含 padding_idx
input = torch.tensor([[0, 1, 2], [3, 0, 4]])

# 获取对应的 embedding 向量
output = embedding(input)
print(output)

输出结果中,padding_idx=0 对应的 embedding 向量始终为全零:

tensor([[[ 0.0000,  0.0000,  0.0000,  0.0000],
         [ 0.0253, -0.0374,  0.0421, -0.0123],
         [-0.0124,  0.0532, -0.0211,  0.0201]],

        [[ 0.0342, -0.0101,  0.0234, -0.0102],
         [ 0.0000,  0.0000,  0.0000,  0.0000],
         [-0.0421,  0.0213, -0.0112,  0.0321]]])

5. 预训练 Embedding 的加载

在实际应用中,我们通常会加载预训练的词向量(如 GloVe 或 Word2Vec)来初始化 nn.Embedding 层。以下是加载预训练 embedding 的方法:

from torchtext.vocab import GloVe

# 加载预训练的 GloVe 词向量
glove = GloVe(name='6B', dim=100)

# 初始化 Embedding 层
embedding = nn.Embedding.from_pretrained(glove.vectors, freeze=False)

# 测试 embedding 层
input = torch.tensor([0, 1, 2])  # 索引
output = embedding(input)
print(output)

freeze=False 表示允许在训练过程中更新 embedding 权重。如果设置为 True,则权重将保持不变。

6. 总结

nn.Embedding 是 PyTorch 中非常重要的模块,用于将离散的符号(如单词)映射为连续的向量表示。通过合理地选择 num_embeddingsembedding_dim,并结合预训练的词向量,可以显著提升模型的性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值