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

Imr*_*ran 5 neural-network deep-learning pytorch

PyTorch 中的嵌入层列在“稀疏层”下,但有以下限制:

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

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

Imr*_*ran 7

仔细检查嵌入上的稀疏梯度是可选的,可以使用以下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,梯度 wrt 权重矩阵将是一个稀疏张量。有关稀疏梯度的更多详细信息,请参阅注释。

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

更新:

在稀疏梯度上实现一些优化方法在理论上是可行的,但技术上很难。PyTorch 存储库中有一个未解决的问题,用于添加对所有优化器的支持。

关于最初的问题,我相信 Embeddings 可以被视为稀疏,因为可以直接对输入索引进行操作,而不是将它们转换为单热编码以输入到密集层。@Maxim's answer to my related question对此进行了解释。