Pyrtorch中的Embedding图层列在“稀疏图层”下,但有以下限制:
请记住,只有有限数量的优化器支持稀疏渐变:目前它是optim.SGD(cuda和cpu)和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) - 如果为True,则为渐变w.r.t.权重矩阵将是一个稀疏张量。有关稀疏渐变的更多详细信息,请参阅注释。
并且提到的“注释”是我在问题中引用的,关于稀疏梯度支持的有限数量的优化器。
更新:
理论上可行但在技术上难以在稀疏梯度上实现一些优化方法。 PyTorch仓库中有一个open issue,可以为所有优化器添加支持。
关于原始问题,我认为嵌入可以被视为稀疏,因为可以直接对输入索引进行操作,而不是将它们转换为单热编码以输入到密集层。 @Maxim's回答我的related question解释了这一点。