我正在theano中实现Probabilistic Matrix Factorization模型,​​并想使用Adam gradient descent规则。

我的目标是要使代码尽可能整洁,这意味着我不想明确跟踪亚当算法中的“m”和“v”量。

似乎这是可能的,尤其是在seeing how Lasagne's Adam is implemented之后:它在theano.function的更新规则中隐藏了'm'和'v'数量。

当负对数似然与每个处理不同数量的项形成时,此方法将起作用。但是在概率矩阵分解中,每个项都包含一个潜在用户向量和一个潜在项目向量的点积。这样,如果我在每个术语上创建一个千层面的亚当的实例,则对于相同的潜矢量,我将有多个'm'和'v'量,而这并不是亚当应该如何工作的。

我也是posted on Lasagne's group,实际上是twice,那里有一些更多的细节和一些示例。

我考虑了两种可能的实现:

  • 每个现有评级(这意味着全局NLL目标函数中的每个现有术语)都有自己的Adam,可以通过对theano.function的专用调用对其进行更新。不幸的是,这会导致对Adam的使用不正确,因为相同的潜矢量将与Adam算法使用的不同“m”和“v”量相关联,而这并不是Adam的工作方式。
  • 在整个目标NLL上调用Adam,这将使更新机制像简单的Gradient Descent(而不是SGD)一样具有已知的所有缺点(计算时间长,保持局部最小值等)。

  • 我的问题是:
  • 也许我对Lasagne的Adam的工作方式有一些不正确的理解?
  • 在潜在向量的每次更新都会对使用该更新向量的另一个更新(在同一Adam调用中)产生影响的意义上,选项号2实际上是否像SGD?
  • 您对如何实现它还有其他建议吗?

  • 关于如何解决此问题并避免手动保留“v”和“m”数量的重复矢量和矩阵的任何想法吗?

    最佳答案

    似乎在论文中他们建议您使用梯度下降一次优化整个功能:



    因此,我想说您的选择2是实现他们所做的正确方法。

    除了乙状结肠之外,那里没有太多的复杂性或非线性,因此您不太可能遇到与神经网络相关的典型优化问题,而这些问题需要像亚当这样的东西。因此,只要所有这些都适合内存,我想这种方法就会奏效。

    如果它不适合内存,也许您可​​以通过某种方式设计损失的小批量版本以进行优化。还会有兴趣了解您是否可以添加一个或多个神经网络来替换其中一些条件概率。但这有点题外话了...

    关于machine-learning - 使用Lasagne的Adam实现进行概率矩阵分解是否有希望?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39415090/

    10-11 07:40