API:
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)
- num_embeddings (python:int) – 词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999)
- embedding_dim (python:int) – 嵌入向量的维度,即用多少维来表示一个词。
- padding_idx (python:int, optional) – 填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)
- max_norm (python:float, optional) – 最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。
- norm_type (python:float, optional) – 指定利用什么范数计算,并用于对比max_norm,默认为2范数。
- scale_grad_by_freq (boolean, optional) – 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.
- sparse (bool, optional) – 若为True,则与权重矩阵相关的梯度转变为稀疏张量。
提到embedding_dim,就不得先从one_hot向量说起。
最初的时候,人们将word转换位vector是利用one_hot向量来实现的。简单来讲,现在词典里一共5个字,[‘我’,‘是’,‘中’,‘国’,‘人’],即num_embedding=5,而现在有一句话‘我是人’,one_hot则利用一个长度为5的01 one_hot向量来代表这句话中的每个字【有多少个字,就有多少个one-hot编码,每个字都对应一个长度为字典长度的one-hot编码】,有:
- 我:[1 0 0 0 0 ]
- 是:[0 1 0 0 0 ]
- 人:[0 0 0 0 1 ]
显然,这种方法简单快捷,但是当词典的字很多,比如50000个字的时候,这种方法会造成极大的稀疏性,不便于计算。因此,为了改进这些缺点,embedding算是它的一个升级版(没有说谁好和谁不好的意思,现在one hot向量也依旧在很多地方运用,选择特征时要选择自己合适的才行。)
embedding翻译word是这样操作的,首先,先准备一本词典,这个词典将原来句子中的每个字映射到更低的维度上去。比如,字典中有50000个字,那按照One-hot方法,我们要为每个字建立一个50000长度的vector,对于embedding来说,我们只需要指定一个embedding_dim,这个embedding_dim<50000即可:
见下图,原来one-hot处理一句话(这句话有length个字),那我们需要一个(length,50000)的矩阵代表这句话,现在只需要(length,embedding_dim)的矩阵就可以代表这句话(见上图)。
上面这张图是计算示意图,为了计算方便,我们将句子的最大长度设置为max_length,也就是说,输入模型的所有语句不可能超过这个长度。原来用one_hot向量表示的话,如果浓缩起来就是上面的那个长条,如果展开则是下方的那个矩阵。也就是说,当整个输入数据X只有一句话时,经过字典的映射,这句话变成(1,max_length,embedding_dim)
当输入数据X有多句话时,即Batch_size不等于1,则经过翻译之后,输入数据X变成(batch_size,max_length,embedding_dim)
因此,nn.embedding(num_embeddings,embedding_dim)的作用就是将输入数据(每个单词)降维到embedding_dim的表示层上,将多句话变成(batch_size,max_length,embedding_dim)维度的vector,得到了输入数据的另一种表现形式。
示例:
将两句话,每句话3个单词,通过 nn.Embedding 到(batch_size,max_length,embedding_dim)维度上:
import torch
from torch import nn# 定义一个词典:{'!':0,'how':1, 'are':2, 'you':3, 'ok':4}
# 假定字典中有5个词,词向量维度为4
embedding = nn.Embedding(5, 4)# 第一句话: how are you
# 第二句话:are you ok
# 将word用词典中的索引表示:
sentence = [[1, 2, 3],[2, 3, 4]]
# (2*3):相当于2个句子,每个句子有3个词
sentence = torch.LongTensor(sentence)# 将这些句子中的每个词embedding,得到(2*3*4)维度,相当于每个词被embedding到4维,共6个词被embedding
embed = embedding(sentence)
print(embed.size())
https://www.jianshu.com/p/63e7acc5e890
关于nn.Embedding的解释,以及它是如何将一句话变成vector的-CSDN博客