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

Posted

技术标签:

【中文标题】为啥 PyTorch 中的嵌入实现为稀疏层?【英文标题】:Why are Embeddings in PyTorch implemented as Sparse Layers?为什么 PyTorch 中的嵌入实现为稀疏层? 【发布时间】:2018-05-31 18:55:47 【问题描述】:

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

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

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

【问题讨论】:

最好在PyTorch forum问这样的问题。 好主意!太好了,以至于我在搜索 PyTorch 论坛后立即能够回答我的问题! 你的回答并没有真正回答你的问题,即为什么嵌入被实现为稀疏层。 好点。我会看看我是否能弄清楚并更新我的答案。 【参考方案1】:

仔细检查后,嵌入上的稀疏渐变是可选的,可以使用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) – 如果为真,梯度 w.r.t.权重矩阵 将是一个稀疏张量。有关稀疏的更多详细信息,请参见注释 渐变。

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

更新:

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

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

【讨论】:

以上是关于为啥 PyTorch 中的嵌入实现为稀疏层?的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch之 torch.nn.Embedding 词嵌入层的理解

pytorch中,嵌入层torch.nn.embedding的计算方式

在 pytorch 的嵌入层中“究竟”发生了啥?

Pytorch:嵌入层后,无法获得 <class 'torch.Tensor'> 的 repr

在 pytorch 模型中保存嵌入层

使用稀疏张量为 TensorFlow 中的 softmax 层提供占位符