torch.nn.Embedding 可以实现 word embedding,在自然语言处理中比较常用;
将源数据映射到另外一个空间中,一对一映射。
假设将 A 空间中的单词 a1 和 a2 对应 B 空间中的映射是多维变量 b1 和 b2,那么若 a1 < a2 ,则 b1 < b2。
通过 word embedding,就可以将自然语言所表示的单词或短语转换为计算机能够理解的由实数构成的向量或矩阵形式(比如,one-hot 就是一种简单的 word embedding 的方法);
这样得到一个向量以后,就可以通过计算向量之间的相似度来得出语义的相关性;
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2,scale_grad_by_freq=False, sparse=False)
输入:含有待提取 indices 的任意 shape 的 Long Tensor;
输出:输出 shape =(*,H),其中 * 为输入的 shape,H = embedding_dim(若输入 shape 为 N*M,则输出 shape 为 N*M*H);
torch.nn.Embedding 的权重为 num_embeddings * embedding_dim 的矩阵,例如输入10个词,每个词用3为向量表示,则权重为的矩阵;
官方代码:
>>> # an Embedding module containing 10 tensors of size 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]]]) # output的shape为(2*4*3)
对于 padding_idx 的理解,自己写了一个比较清楚的:
import torch
from torch import nn
input = torch.LongTensor([[1, 2, 6, 4], [5, 6, 7, 8]])
em = nn.Embedding(10, 3, padding_idx=6)
output = em(input)
print("output:",output)
print("output.shape:",output.shape)
print("em.weight.shape:",em.weight.shape)
运行结果如下:
可以看出 “6” 所对应映射的向量被填充了0。