Pytorch中的Embedding

有两个Embedding函数,通常是用前面这一个

ref https://pytorch.org/docs/stable/generated/torch.nn.Embedding.html

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, device=None, dtype=None)

  • num_embeddings: size of the directionary of embedding,也就是词汇表的大小=不同单词的个数
  • embedding_dim: the size of each embedding vector,也就是embedding向量的维度

一个简单的lookup table(查找表),用例存储固定了dictionary 和 size 的embeddings

它将所有的embedding(词向量)都存起来了,可以通过词的索引检索它们

输入是一个索引列表,输出是词向量列表

>>> # an Embedding module containing 10 tensors of size 3
>>> # 有10种不同的单词,每个单词表示为一个3维的向量
>>> embedding = nn.Embedding(10, 3)
>>> # a batch of 2 samples of 4 indices each
>>> 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]]])

 embedding = nn.Embedding(10, 3),这里embedding是一个表,input是在表中的索引 

 

另一个函数是

ref https://pytorch.org/docs/stable/generated/torch.nn.functional.embedding.html

torch.nn.functional.embedding(input, weight, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)

  • input: Tensor containing indices into the embedding matrix,即在词向量矩阵中的索引列表
  • weight: embedding matrix,即词向量矩阵,行数为最大可能的索引数+1,列数为词向量的维度
>>> # a batch of 2 samples of 4 indices each
>>> input = torch.tensor([[1,2,4,5],[4,3,2,9]])
>>> # an embedding matrix containing 10 tensors of size 3
>>> embedding_matrix = torch.rand(10, 3)
>>> F.embedding(input, embedding_matrix)
tensor([[[ 0.8490,  0.9625,  0.6753],
         [ 0.9666,  0.7761,  0.6108],
         [ 0.6246,  0.9751,  0.3618],
         [ 0.4161,  0.2419,  0.7383]],

        [[ 0.6246,  0.9751,  0.3618],
         [ 0.0237,  0.7794,  0.0528],
         [ 0.9666,  0.7761,  0.6108],
         [ 0.3385,  0.8612,  0.1867]]])

这个embedding_matrix不用训练的吗?直接用随机数??

 

而事实上,在nn.Embedding的内部实现中,也是调用的F.embedding

 

 

可见embedding matrix也是随机数,因为torch.Tensor(a, b)是正态分布的随机数

posted @ 2021-07-27 15:12  Rogn  阅读(722)  评论(0编辑  收藏  举报