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

问题描述 投票:2回答:1

Pyrtorch中的Embedding图层列在“稀疏图层”下,但有以下限制:

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

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

neural-network deep-learning pytorch
1个回答
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's回答我的related question解释了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.