为什么PyTorch中的嵌入实现为稀疏层?

时间:2017-12-18 12:17:32

标签: neural-network deep-learning pytorch

Embedding PyTorch中的图层列在"稀疏图层"有限制:

  

请记住,只有有限数量的优化器支持稀疏渐变:目前它是optim.SGD(cuda和cpu),以及optim.Adagrad(cpu)

这是什么原因?例如在Keras中,我可以使用任何优化器训练具有嵌入层的架构。

1 个答案:

答案 0 :(得分:2)

仔细检查嵌入时的稀疏渐变是可选的,可以使用sparse参数打开或关闭:

  

class torch.nn.Embedding(num_embeddings,embedding_dim,padding_idx = None,max_norm = None,norm_type = 2,scale_grad_by_freq = False, sparse = False

其中:

  

sparse(boolean,optional) - 如果为True,则为渐变w.r.t.重量矩阵   将是一个稀疏的张量。有关稀疏的更多详细信息,请参阅注释   梯度。

所提到的“注释”是我在问题中引用的,关于稀疏梯度支持的有限数量的优化器。

<强>更新

理论上可行但在技术上难以在稀疏梯度上实现一些优化方法。 PyTorch仓库中有一个open issue来添加对所有优化器的支持。

关于原始问题,我认为嵌入可以被视为稀疏,因为可以直接对输入索引进行操作,而不是将它们转换为单热编码以输入到密集层。 @Maxim'srelated question的答案解释了这一点。