pytorch基础 nn.embedding
nn.Embedding
是 PyTorch 中的一个模块,用于创建嵌入层(embedding layer),它将离散的索引(例如词汇表中的单词索引)映射为固定大小的稠密向量。这是许多 NLP 模型(包括 Transformer)中的基本组件。
示例用法:
import torch
import torch.nn as nn
# 定义一个嵌入层
vocab_size = 10000 # 词汇表大小
embedding_dim = 512 # 嵌入向量的维度
embedding_layer = nn.Embedding(num_embeddings=vocab_size, embedding_dim=embedding_dim)
# 示例输入:一批词索引序列
# 形状:(batch_size, sequence_length)
input_indices = torch.tensor([[1, 2, 3], [4, 5, 6]]) # 2 个序列,每个序列长度为 3
# 获取嵌入向量
output_embeddings = embedding_layer(input_indices)
print(output_embeddings.shape) # 输出形状:(batch_size, sequence_length, embedding_dim)
输出:
输出的张量形状为 (batch_size, sequence_length, embedding_dim)
。对于上面的例子:
-
batch_size = 2
-
sequence_length = 3
-
embedding_dim = 512
因此,输出形状为 (2, 3, 512)
。
主要参数:
-
num_embeddings
:词汇表的大小(唯一词的数量), 通常比较大。 -
embedding_dim
:嵌入向量的维度。 -
padding_idx
:(可选)用于填充词的索引。如果提供,该索引对应的嵌入向量将固定为零向量,并且在训练过程中不会更新。 -
max_norm
:(可选)如果指定,嵌入向量将被重新归一化,使其范数不超过该值。 -
norm_type
:(可选)如果指定了max_norm
,则使用该范数类型(默认是 2,表示 L2 范数)。 -
scale_grad_by_freq
:(可选)如果为True
,梯度将根据批次中词的频率进行缩放。
在 Transformer 中的使用:
在 Transformer
类中,nn.Embedding
通常用于创建:
-
源嵌入:用于输入(源)序列。
-
目标嵌入:用于输出(目标)序列。
-
位置编码:为嵌入添加位置信息(可选,因为位置编码也可以单独添加)。
以下是在 Transformer
类中的使用示例:
class Transformer(nn.Module):
def __init__(self, n_src_vocab, n_trg_vocab, src_pad_idx, trg_pad_idx, d_word_vec=512):
super().__init__()
# 源和目标嵌入层
self.src_word_emb = nn.Embedding(n_src_vocab, d_word_vec, padding_idx=src_pad_idx)
self.trg_word_emb = nn.Embedding(n_trg_vocab, d_word_vec, padding_idx=trg_pad_idx)
# Transformer 的其他组件...
这是对 nn.Embedding
及其在 Transformer 模型中的作用的简要介绍。如果你需要进一步的解释或示例,请告诉我!