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

Why are Embeddings in PyTorch implemented as Sparse Layers?

Embedding PyTorch 中的层列在 "Sparse Layers" 下,限制为:

Keep in mind that only a limited number of optimizers support sparse gradients: currently it’s optim.SGD (cuda and cpu), and optim.Adagrad (cpu)

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

经过仔细检查,嵌入上的稀疏梯度是可选的,可以使用 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) – if True, gradient w.r.t. weight matrix will be a sparse tensor. See Notes for more details regarding sparse gradients.

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

更新:

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

关于原始问题,我认为嵌入可以被视为稀疏的,因为可以直接对输入索引进行操作,而不是将它们转换为单热编码以输入到密集层。 @Maxim's answer to my .

中对此进行了解释