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