nn.Embedding(嵌入)的作用,以及具体实现步骤

nn.Embedding 是 PyTorch 中的一个模块,它用于将稀疏的离散数据表示为密集的嵌入向量(embeddings)。这在处理分类特征(如单词、商品、用户ID等)时非常有用,因为这些特征的数量可能非常大,但每个特征的取值范围有限。通过嵌入,可以将这些离散特征转换为具有丰富语义信息的连续向量表示。

nn.Embedding是PyTorch中的一个常用模块,其主要作用是将输入的整数序列转换为密集向量表示。在自然语言处理(NLP)任务中,可以将每个单词表示成一个向量,从而方便进行下一步的计算和处理。B×N(B张图,N维度特征)---》B×N×w(B张图,N维度特征,每维度特征又分解为w个向量)

作用

  1. 降维: 嵌入可以将高维的稀疏数据转换为低维的密集向量。
  2. 特征学习: 嵌入向量可以通过训练学习到有用的特征表示。
  3. 计算效率: 嵌入向量是密集的,这使得后续的计算(如矩阵乘法)更加高效。
  4. 语义信息: 嵌入向量能够捕捉和表示特征之间的语义关系。

具体实现步骤

  1. 定义嵌入层:
    • 创建一个 nn.Embedding 层,指定嵌入的维度(embedding_dim)和词汇表的大小(num_embeddings)。

python

import torch.nn as nn

# 假设词汇表大小为1000,每个嵌入向量的维度为64
embedding_layer = nn.Embedding(num_embeddings=1000, embedding_dim=64)
  1. 索引嵌入:
    • 使用离散的索引值来检索对应的嵌入向量。索引值通常来自于数据集中的分类特征。

python

# 假设我们有一些索引值,每个索引对应一个嵌入向量
indices = torch.tensor([1, 2, 984, 205], dtype=torch.long)
embedded_vectors = embedding_layer(indices)
  1. 使用嵌入向量:
    • 获取的嵌入向量可以用于后续的深度学习模型,如用于构建句子或文档的表示,然后输入到 LSTM、Transformer 等模型中。

python

# 嵌入向量可以用于后续的模型中
# 例如,作为LSTM的输入
lstm_input = embedded_vectors
  1. 训练和更新:
    • 在训练过程中,嵌入层的权重(嵌入向量)会通过反向传播自动更新。

python

# 在训练循环中,嵌入层会随着梯度下降更新
optimizer = torch.optim.Adam(embedding_layer.parameters(), lr=0.001)
loss_function = nn.CrossEntropyLoss()

# 假设我们有target标签和计算得到的logits
target = torch.tensor([3, 987, 115, 32], dtype=torch.long)
logits = ...  # 模型的输出

# 计算损失
loss = loss_function(logits, target)

# 反向传播
optimizer.zero_grad()
loss.backward()

# 更新权重
optimizer.step()
  1. 冻结嵌入层:
    • 如果需要,可以冻结嵌入层的权重,使其在训练过程中不更新。

python复制

# 冻结嵌入层
embedding_layer.weight.requires_grad = False

nn.Embedding 是自然语言处理(NLP)和推荐系统中常用的技术,它为处理离散特征提供了一种有效的方式。

代码

转化成ID表示的两个句子如下:

  • 1,2,3,4

  • 1,2,5,6,5,7

import torch
from torch import nn
 
# 创建最大词个数为10,每个词用维度为4表示
embedding = nn.Embedding(10, 4)
 
# 将第一个句子填充0,与第二个句子长度对齐
in_vector = torch.LongTensor([[1, 2, 3, 4, 0, 0], [1, 2, 5, 6, 5, 7]])
out_emb = embedding(in_vector)
print(in_vector.shape)
print((out_emb.shape))
print(out_emb)
print(embedding.weight)

运行结果显示如下:

torch.Size([2, 6])
torch.Size([2, 6, 4])
tensor([[[-0.6642, -0.6263,  1.2333, -0.6055],
         [ 0.9950, -0.2912,  1.0008,  0.1202],
         [ 1.2501,  0.1923,  0.5791, -1.4586],
         [-0.6935,  2.1906,  1.0595,  0.2089],
         [ 0.7359, -0.1194, -0.2195,  0.9161],
         [ 0.7359, -0.1194, -0.2195,  0.9161]],
 
        [[-0.6642, -0.6263,  1.2333, -0.6055],
         [ 0.9950, -0.2912,  1.0008,  0.1202],
         [-0.3216,  1.2407,  0.2542,  0.8630],
         [ 0.6886, -0.6119,  1.5270,  0.1228],
         [-0.3216,  1.2407,  0.2542,  0.8630],
         [ 0.0048,  1.8500,  1.4381,  0.3675]]], grad_fn=<EmbeddingBackward0>)
Parameter containing:
tensor([[ 0.7359, -0.1194, -0.2195,  0.9161],
        [-0.6642, -0.6263,  1.2333, -0.6055],
        [ 0.9950, -0.2912,  1.0008,  0.1202],
        [ 1.2501,  0.1923,  0.5791, -1.4586],
        [-0.6935,  2.1906,  1.0595,  0.2089],
        [-0.3216,  1.2407,  0.2542,  0.8630],
        [ 0.6886, -0.6119,  1.5270,  0.1228],
        [ 0.0048,  1.8500,  1.4381,  0.3675],
        [ 0.3810, -0.7594, -0.1821,  0.5859],
        [-1.4029,  1.2243,  0.0374, -1.0549]], requires_grad=True)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值