【问题标题】: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 论坛后立即能够回答我的问题!
  • 你的回答并没有真正回答你的问题,即为什么嵌入被实现为稀疏层。
  • 好点。我会看看我是否能弄清楚并更新我的答案。

标签: neural-network deep-learning 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 的回答中进行了解释。

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 2019-04-11
    • 2019-08-20
    • 2018-11-12
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多