pytorch nn.Embedding的用法和理解

本文详细解析PyTorch中的nn.Embedding模块,包括其作为lookup table的性质和如何通过indices获取word embeddings。通过示例解释了nn.Embedding.from_pretrained()的用法,说明了输入为indices时如何从weight矩阵中取出对应的词向量,形成二维句子的三维词向量张量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(2021.05.26补充)nn.Embedding.from_pretrained()的使用:
在这里插入图片描述

>>> # FloatTensor containing pretrained weights
>>> weight = torch.FloatTensor([[1, 2.3, 3], [4, 5.1, 6.3]])
>>> embedding = nn.Embedding.from_pretrained(weight)
>>> # Get embeddings for index 1
>>> input = torch.LongTensor([1])
>>> embedding(input)
tensor([[ 4.0000,  5.1000,  6.3000]])

首先来看official docs对nn.Embedding的定义:
是一个lookup table,存储了固定大小的dictionary(的word embeddings)。输入是indices,来获取指定indices的word embedding向量。
在这里插入图片描述

<think>好的,我现在需要帮助用户理解PyTorch中的nn.Embedding层的参数使用方法。首先,我得回忆一下nn.Embedding的基本概念,它是用来将离散的索引映射到连续的嵌入向量的。接下来,用户需要参数详解代码示例,所以我得先整理参数部分。 根据提供的引用,参数包括num_embeddings、embedding_dim,还有一些可选参数如padding_idx、max_norm、norm_type、scale_grad_by_freqsparse。我需要逐个解释这些参数的含义,最好结合引用中的例子来说明。比如,引用[1][2]都提到了num_embeddingsembedding_dim是必需的参数,而其他参数是可选的。特别是引用[3]指出nn.Embedding的参数会参与梯度下降,这也是一个重要的点,需要强调这些参数在训练过程中会被优化。 接下来是代码示例部分。引用[2][3]提供了不同的例子,我需要选择或整合这些示例,展示如何初始化使用Embedding层。比如,创建一个嵌入层,处理输入张量,并展示输出。同时,可能还需要展示训练过程中参数是如何更新的,如引用[3]中的训练循环,说明嵌入层参数如何随着优化步骤改变。 用户可能还会关心实际应用中的注意事项,比如如何处理padding的情况,这时候padding_idx参数就派上用场了。需要解释当设置padding_idx时,对应索引的嵌入向量会被固定为零,并且在训练中不会更新,这可能有助于处理变长序列。 另外,关于max_normnorm_type,引用[1]提到这些参数用于对嵌入向量进行归一化,可能需要解释它们的作用,比如防止梯度爆炸或控制向量的大小。 还需要注意代码的正确性,确保语法正确,比如在PyTorch中如何定义嵌入层,输入张量的类型应该是LongTensor,这点在示例中要明确。 最后,生成相关问题时要考虑用户可能的进一步疑问,比如参数初始化方法、如何处理预训练嵌入、性能优化等。这些问题可以引导用户更深入地了解Embedding层的应用调整。 总结一下,回答的结构应该是先解释参数,再给出代码示例,最后列出相关问题。需要确保每个参数都有清晰的解释,代码示例能够覆盖基本使用训练过程,同时引用提供的资料来支持说明。</think>### PyTorch nn.Embedding 参数详解及使用示例 #### 一、核心参数解析 1. **`num_embeddings`** 表示词汇表大小,即所有可能索引的数量(从$0$到$num\_embeddings-1$)。例如,若处理10个不同单词,则设为$10$[^1][^2]。 2. **`embedding_dim`** 定义每个索引对应嵌入向量的维度。例如,若需将单词映射为三维向量,则设为$3$[^1][^2]。 3. **`padding_idx`**(可选) 指定填充索引(如处理变长序列时),对应位置的嵌入向量固定为零且不参与训练。例如设为$0$时,索引$0$的嵌入始终为零向量[^1][^3]。 4. **`max_norm` / `norm_type`**(可选) 控制嵌入向量的归一化: - `max_norm`:向量L2范数的最大值 - `norm_type`:范数类型(默认为$2$,即L2范数)[^1]。 5. **`scale_grad_by_freq`**(可选) 若为`True`,梯度会根据索引出现频率反向缩放,适用于高频词需更稳定更新的场景[^1]。 6. **`sparse`**(可选) 设为`True`时使用稀疏梯度更新,可优化内存但仅支持部分优化器(如`SparseAdam`)[^1]。 --- #### 二、代码示例 ##### 基础用法 ```python import torch import torch.nn as nn # 创建嵌入层:词汇表大小=10,嵌入维度=3 embedding = nn.Embedding(num_embeddings=10, embedding_dim=3) # 输入张量(索引列表) input_tensor = torch.tensor([1, 2, 3, 4]) # 获取嵌入向量 output = embedding(input_tensor) print("嵌入结果:\n", output) ``` ##### 包含训练过程的完整示例 ```python # 创建嵌入层(参数参与梯度下降) embedding = nn.Embedding(10, 4) # 引用[3] optimizer = torch.optim.SGD(embedding.parameters(), lr=0.01) # 训练循环(简化版) for _ in range(100): outputs = embedding(torch.LongTensor([1, 2, 3, 4])) loss = torch.nn.functional.mse_loss(outputs, torch.ones(4, 4)) loss.backward() optimizer.step() optimizer.zero_grad() print("训练后的嵌入权重:\n", embedding.weight) ``` ##### 处理填充索引(padding_idx) ```python # 指定索引0为填充位 embedding = nn.Embedding(10, 3, padding_idx=0) input_tensor = torch.tensor([0, 1, 0, 2]) print("带填充的嵌入结果:\n", embedding(input_tensor)) ``` --- #### 三、关键特性说明 1. **参数可训练性** 嵌入层的权重矩阵(`embedding.weight`)默认参与梯度下降,是模型参数的一部分。 2. **输入要求** 输入必须是`LongTensor`类型的索引值,范围需在$[0, num\_embeddings-1]$之间[^2][^3]。 3. **权重初始化** 默认使用均匀分布初始化(范围$\sqrt{1/embedding\_dim}$),可通过手动赋值修改[^2]。 ---
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值