Embedding PyTorch 中的层列在“稀疏层”下,但有以下限制:
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.
提到的“注释”是我在关于支持稀疏梯度的有限数量的优化器的问题中引用的内容。
更新:
在稀疏梯度上实现一些优化方法在理论上是可行的,但技术上很难。有一个open issue在 PyTorch 存储库中添加对所有优化器的支持。
关于原始问题,我相信 Embeddings 可以被视为稀疏,因为可以直接对输入索引进行操作,而不是将它们转换为单热编码以输入到密集层。这在 @Maxim's 中有解释回复我的 related question .
关于neural-network - 为什么 PyTorch 中的嵌入实现为稀疏层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47868341/