nn.embedding简单理解

参考 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))

nn.embedding简单理解_第1张图片

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

如下,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

你可能感兴趣的:(机器学习,深度学习,人工智能)