nn.Embedding 的理解
Embedding是将输入向量化,参数包括:
nn.Embedding(vocab_size, emb_size)
vocab_size:词典大小(不是每个batch size的长度,而是数据集词库的大小)
emb_size:每个词需要嵌入多少维来表示(也就是输入维度)
构造一个(假装)vocab size=10,每个vocab用3-d向量表示的table
>>> embedding = nn.Embedding(10, 3) >>> embedding.weight Parameter containing: tensor([[ 1.2402, -1.0914, -0.5382], [-1.1031, -1.2430, -0.2571], [ 1.6682, -0.8926, 1.4263], [ 0.8971, 1.4592, 0.6712], [-1.1625, -0.1598, 0.4034], [-0.2902, -0.0323, -2.2259], [ 0.8332, -0.2452, -1.1508], [ 0.3786, 1.7752, -0.0591], [-1.8527, -2.5141, -0.4990], [-0.6188, 0.5902, -0.0860]], requires_grad=True)
根据定义的table对输入两个句子每个句子由四个词进行嵌入:
input = torch.LongTensor([[1,2,4,5],[4,3,2,9]]) >>> a = embedding(input) >>> a tensor([[[-1.1031, -1.2430, -0.2571], [ 1.6682, -0.8926, 1.4263], [-1.1625, -0.1598, 0.4034], [-0.2902, -0.0323, -2.2259]], [[-1.1625, -0.1598, 0.4034], [ 0.8971, 1.4592, 0.6712], [ 1.6682, -0.8926, 1.4263], [-0.6188, 0.5902, -0.0860]]], grad_fn=<EmbeddingBackward>)
可以观察到每一行是一个词的向量表示,且输入input是indices,即词对应的标签(比如:“我”--“1”,“音”--“2”,“识”--“3”,别--“4”)
在通过nn.Embedding 初始化他的权重时已经为每一个输入标签构建好了对应的词向量,比如a = embedding(input)中的第一行对应的标签是“1”,所以在生成的embedding.weight取出下标为1的向量表示该标签。