nn.embedding简单理解

本文详细介绍了PyTorch中nn.Embedding模块的参数和用法。nn.Embedding主要用于将离散符号(如词汇表中的单词)映射到连续的向量空间。参数包括词典大小、嵌入维度、填充ID、最大范数等。通过实例展示了如何初始化和使用Embedding层,并讲解了如何导入预训练词向量并保持其在训练过程中的不变性。

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

参考 Torch.nn.Embedding的用法 - 知乎关于nn.embedding的理解_蚌埠先森的博客-CSDN博客_nn.embedding weight

import torch.nn as nn
nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2, scale_grad_by_freq=False, sparse=False)

参数解释

  • num_embeddings (int) :词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999)
  • embedding_dim (int) :嵌入向量的维度,即用多少维来表示一个符号。
  • padding_idx (int, optional) :填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)
  • max_norm (float, optional) :最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。
  • norm_type (float, optional) : 指定利用什么范数计算,并用于对比max_norm,默认为2范数。
  • scale_grad_by_freq (boolean, optional) : 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.
  • sparse (bool, optional) : 若为True,则与权重矩阵相关的梯度转变为稀疏张量

使用方法

我们只需要初始化 torch.nn.Embedding(n,m),n是单词数,m就是词向量的维度。一开始embedding是随机的,在训练的时候会自动更新。

举个简单的例子:

word1和word2是两个长度为3的句子,保存的是单词所对应的词向量的索引号。随机生成(4,5)维度大小的embedding,可以通过embedding.weight查看embedding的内容。输入word1时,embedding会输出第0,1,2行词向量的内容,同理输入word2时,embedding会输出第3,1,2行词向量的内容。

word1 = torch.LongTensor([0, 1, 2])
word2 = torch.LongTensor([3, 1, 2])
embedding = torch.nn.Embedding(4, 5)
print(embedding.weight)
print('word1:')
print(embedding(word1))
print('word2:')
print(embedding(word2))

除此之外,我们也可以导入已经训练好的词向量,但是需要设置训练过程中不更新。

如下,emb是已经训练得到的词向量,先初始化等同大小的embedding,然后将emb的数据复制过来,最后一定要设置weight.requires_grad为False。

self.embedding = torch.nn.Embedding(emb.size(0), emb.size(1))
self.embedding.weight = torch.nn.Parameter(emb)
# 固定embedding
self.embedding.weight.requires_grad = False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值