torch.nn.Embedding
torch.nn.Embedding
是 PyTorch 中的一个模块,它是一个简单的查找表,用于存储固定字典和大小的嵌入。这个模块通常用于存储词嵌入并使用索引检索它们。模块的输入是索引列表,输出是相应的词嵌入。
参数
num_embeddings
(int):嵌入字典的大小。embedding_dim
(int):每个嵌入向量的大小。padding_idx
(int, optional):如果指定,那么在padding_idx
的条目不会贡献到梯度中;因此,训练期间padding_idx
的嵌入向量不会更新,即它保持为固定的“pad”。max_norm
(float, optional):如果给定,每个具有大于max_norm
的范数的嵌入向量将被重新归一化,使其具有max_norm
的范数。norm_type
(float, optional):计算max_norm
选项的 p-范数的 p。默认为 2。scale_grad_by_freq
(bool, optional):如果给定,这将通过小批量中单词的频率的倒数来缩放梯度。默认为 False。sparse
(bool, optional):如果为 True,关于权重矩阵的梯度将是一个稀疏张量。
示例
Embedding 模块的使用非常简单。首先,你需要创建一个 Embedding 对象,指定你想要的嵌入字典的大小和每个嵌入向量的大小。然后,你可以使用这个对象来获取索引的嵌入。
# 创建一个包含 10 个大小为 3 的张量的 Embedding 模块
embedding = nn.Embedding(10, 3)
# 一个包含 2 个样本,每个样本有 4 个索引的批次
input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
# 获取嵌入
output = embedding(input)
以下是一些使用 Embedding 模块的示例:
# 示例1:使用 Embedding 模块
embedding = nn.Embedding(10, 3)
input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]])
output = embedding(input)
# 示例2:使用 padding_idx
embedding = nn.Embedding(10, 3, padding_idx=0)
input = torch.LongTensor([[0, 2, 0, 5]])
output = embedding(input)
# 示例3:更改 `pad` 向量
padding_idx = 0
embedding = nn.Embedding(3, 3, padding_idx=padding_idx)
with torch.no_grad():
embedding.weight[padding_idx] = torch.ones(3)
# 示例4:从预训练权重创建 Embedding
weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
embedding = nn.Embedding.from_pretrained(weight)
input = torch.LongTensor([1])
output = embedding(input)
从预训练的权重创建 Embedding
PyTorch 提供了一个非常有用的方法,允许我们从预训练的权重创建 Embedding 实例。这个方法叫做 Embedding.from_pretrained
。
这个方法需要一个 FloatTensor,该 FloatTensor 包含预训练的权重。这个 FloatTensor 的第一维度被传递给 Embedding 作为 num_embeddings
(嵌入字典的大小),第二维度作为 embedding_dim
(每个嵌入向量的大小)。
此外,Embedding.from_pretrained
方法还接受几个可选参数,包括:
freeze
(bool, optional):如果为 True,那么在学习过程中,张量不会被更新。这等效于embedding.weight.requires_grad = False
。默认为 True。padding_idx
(int, optional):如果指定,那么在padding_idx
的条目不会贡献到梯度中;因此,训练期间padding_idx
的嵌入向量不会更新,即它保持为固定的“pad”。max_norm
,norm_type
,scale_grad_by_freq
,sparse
:这些参数的含义与在 Embedding 类的构造函数中的含义相同。
以下是一个使用 Embedding.from_pretrained
方法的例子:
# FloatTensor 包含预训练权重
weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
# 从预训练权重创建 Embedding
embedding = nn.Embedding.from_pretrained(weight)
# 获取索引 1 的嵌入
input = torch.LongTensor([1])
output = embedding(input)
在这个例子中,我们首先创建了一个包含预训练权重的 FloatTensor。然后,我们使用这个 FloatTensor 创建了一个 Embedding 实例。最后,我们获取了索引 1 的嵌入。
这种从预训练权重创建 Embedding 的能力非常有用,特别是当我们想要使用预训练的词嵌入(如 GloVe 或 Word2Vec)来初始化我们的 Embedding 层时。
本文作者:Maeiee
本文链接:torch.nn.Embedding
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!