嵌入¶
- class torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False, _weight=None, _freeze=False, device=None, dtype=None)[源代码]¶
一个简单的查找表,用于存储固定字典和尺寸的嵌入。
此模块通常用于存储词嵌入并通过索引检索它们。输入到模块的是一个索引列表,输出是对应的词嵌入。
- Parameters
num_embeddings (int) – 嵌入字典的大小
embedding_dim (int) – 每个嵌入向量的大小
padding_idx (int, 可选) – 如果指定,位于
padding_idx的条目不会对梯度做出贡献; 因此,在训练期间,位于padding_idx的嵌入向量不会被更新, 即它保持为一个固定的“填充”。对于新构造的嵌入层, 位于padding_idx的嵌入向量将默认为全零, 但可以更新为另一个值以用作填充向量。max_norm (浮点数, 可选) – 如果给出,每个范数大于
max_norm的嵌入向量将被重新归一化,使其范数为max_norm。norm_type (float, 可选) – 用于
max_norm选项的 p-范数的 p 值。默认值为2。scale_grad_by_freq (布尔值, 可选) – 如果给定,这将按小批量中单词的频率的倒数来缩放梯度。默认值为
False。稀疏 (布尔值, 可选) – 如果
True,关于权重矩阵的梯度将是一个稀疏张量。 有关稀疏梯度的更多详细信息,请参阅注释。
- Variables
权重 (张量) – 模块的可学习权重,形状为 (num_embeddings, embedding_dim) 从 初始化
- Shape:
输入: , 包含要提取索引的任意形状的 IntTensor 或 LongTensor
输出: , 其中 * 是输入形状,
注意
请记住,只有有限数量的优化器支持稀疏梯度:目前是
optim.SGD(CUDA 和 CPU),optim.SparseAdam(CUDA 和 CPU)和optim.Adagrad(CPU)注意
当
max_norm不是None时,Embedding的前向方法将会就地修改weight张量。由于用于梯度计算的张量不能就地修改,因此在调用Embedding的前向方法之前对Embedding.weight执行可微操作时,需要在max_norm不是None时克隆Embedding.weight。例如:n, d, m = 3, 5, 7 embedding = nn.Embedding(n, d, max_norm=True) W = torch.randn((m, d), requires_grad=True) idx = torch.tensor([1, 2]) a = embedding.weight.clone() @ W.t() # 权重必须被克隆以确保可微分 b = embedding(idx) @ W.t() # 就地修改权重 out = (a.unsqueeze(0) + b.unsqueeze(1)) loss = out.sigmoid().prod() loss.backward()
示例:
>>> # 包含10个大小为3的张量的嵌入模块 >>> embedding = nn.Embedding(10, 3) >>> # 每批2个样本,每个样本有4个索引 >>> input = torch.LongTensor([[1, 2, 4, 5], [4, 3, 2, 9]]) >>> embedding(input) tensor([[[-0.0251, -1.6902, 0.7172], [-0.6431, 0.0748, 0.6969], [ 1.4970, 1.3448, -0.9685], [-0.3677, -2.7265, -0.1685]], [[ 1.4970, 1.3448, -0.9685], [ 0.4362, -0.4004, 0.9400], [-0.6431, 0.0748, 0.6969], [ 0.9124, -2.3616, 1.1151]]]) >>> # 带有padding_idx的示例 >>> embedding = nn.Embedding(10, 3, padding_idx=0) >>> input = torch.LongTensor([[0, 2, 0, 5]]) >>> embedding(input) tensor([[[ 0.0000, 0.0000, 0.0000], [ 0.1535, -2.0309, 0.9315], [ 0.0000, 0.0000, 0.0000], [-0.1655, 0.9897, 0.0635]]]) >>> # 更改`pad`向量的示例 >>> padding_idx = 0 >>> embedding = nn.Embedding(3, 3, padding_idx=padding_idx) >>> embedding.weight Parameter containing: tensor([[ 0.0000, 0.0000, 0.0000], [-0.7895, -0.7089, -0.0364], [ 0.6778, 0.5803, 0.2678]], requires_grad=True) >>> with torch.no_grad(): ... embedding.weight[padding_idx] = torch.ones(3) >>> embedding.weight Parameter containing: tensor([[ 1.0000, 1.0000, 1.0000], [-0.7895, -0.7089, -0.0364], [ 0.6778, 0.5803, 0.2678]], requires_grad=True)
- classmethod from_pretrained(embeddings, freeze=True, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)[源代码]¶
从给定的二维 FloatTensor 创建嵌入实例。
- Parameters
embeddings (Tensor) – 包含嵌入权重的FloatTensor。 第一个维度作为
num_embeddings传递给嵌入,第二个维度作为embedding_dim传递。冻结 (布尔值, 可选) – 如果
True,张量在学习过程中不会更新。 等同于embedding.weight.requires_grad = False。默认值:Truepadding_idx (int, 可选) – 如果指定,
padding_idx处的条目不会对梯度做出贡献; 因此,在训练期间,padding_idx处的嵌入向量不会更新, 即它保持为一个固定的“填充”。max_norm (浮点数, 可选) – 请参阅模块初始化文档。
norm_type (float, 可选) – 请参阅模块初始化文档。默认值为
2。scale_grad_by_freq (布尔值, 可选) – 请参阅模块初始化文档。默认值为
False。稀疏 (布尔值, 可选) – 参见模块初始化文档。
示例:
>>> # 包含预训练权重的FloatTensor >>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]]) >>> embedding = nn.Embedding.from_pretrained(weight) >>> # 获取索引1的嵌入 >>> input = torch.LongTensor([1]) >>> embedding(input) tensor([[ 4.0000, 5.1000, 6.3000]])