Neural network 如何在PyTorch中准确地工作

Neural network 如何在PyTorch中准确地工作,neural-network,pytorch,torch,embedding,python-embedding,Neural Network,Pytorch,Torch,Embedding,Python Embedding,在PyTorch中,torch.nn.functional.embedding_包似乎是负责执行嵌入查找的真正工作的主要功能。在PyTorch的文档中,已经提到嵌入包在没有实例化中间嵌入的情况下完成其工作>。那到底是什么意思?这是否意味着,例如,当模式为“求和”时,它进行就地求和?或者,这仅仅意味着在调用embedding_bag时不会产生额外的张量,但从系统的角度来看,所有中间行向量都已被提取到处理器中,用于计算最终张量?在最简单的情况下,torch.nn.functional.embeddi

在PyTorch中,torch.nn.functional.embedding_包似乎是负责执行嵌入查找的真正工作的主要功能。在PyTorch的文档中,已经提到嵌入包在没有实例化中间嵌入的情况下完成其工作>。那到底是什么意思?这是否意味着,例如,当模式为“求和”时,它进行就地求和?或者,这仅仅意味着在调用embedding_bag时不会产生额外的张量,但从系统的角度来看,所有中间行向量都已被提取到处理器中,用于计算最终张量?

在最简单的情况下,
torch.nn.functional.embedding\u bag
在概念上是一个两步过程。第一步是创建嵌入,第二步是减少(sum/mean/max,根据“mode”参数)跨维度0的嵌入输出。因此,通过调用
torch.nn.functional.embedding
,然后调用
torch.sum/mean/max
,您可以得到与Embedded_bag相同的结果。在下面的示例中,
embedding\u bag\u res
embedding\u mean\u res
是相等的

>>> weight = torch.randn(3, 4)
>>> weight
tensor([[ 0.3987,  1.6173,  0.4912,  1.5001],
        [ 0.2418,  1.5810, -1.3191,  0.0081],
        [ 0.0931,  0.4102,  0.3003,  0.2288]])
>>> indices = torch.tensor([2, 1])
>>> embedding_res = torch.nn.functional.embedding(indices, weight)
>>> embedding_res
tensor([[ 0.0931,  0.4102,  0.3003,  0.2288],
        [ 0.2418,  1.5810, -1.3191,  0.0081]])
>>> embedding_mean_res = embedding_res.mean(dim=0, keepdim=True)
>>> embedding_mean_res
tensor([[ 0.1674,  0.9956, -0.5094,  0.1185]])
>>> embedding_bag_res = torch.nn.functional.embedding_bag(indices, weight, torch.tensor([0]), mode='mean')
>>> embedding_bag_res
tensor([[ 0.1674,  0.9956, -0.5094,  0.1185]])
然而,概念上的两步流程并没有反映出它实际上是如何实现的。由于
embedding\u bag
不需要返回中间结果,因此它实际上不会为嵌入生成张量对象。它直接计算缩减,根据
input
参数中的索引,从
weight
参数中提取适当的数据。避免创建嵌入张量可以获得更好的性能

那么你问题的答案(如果我理解正确的话)

这仅仅意味着在调用embedding_bag时不会产生额外的张量,但从系统的角度来看,所有中间行向量都已被提取到处理器中,用于计算最终张量

是的