此问题可能与推荐系统中广泛使用的普通矩阵分解任务有很大不同。
我的问题描述如下:
给出密集矩阵M
(大约55000 * 200,可能包含很多负面元素,0.1< abs(M [i] [j])< 1)
我必须找到两个矩阵A(55000 * 1400)和B(1400 * 200),这样:
AB = M
但是,我们对A有一些了解。我们有另一个矩阵C,如果C [i] [j] = 0,那么A [i] [j] 必须为零,否则它可以是任何值(C [i] [j] = 1)。
在我的练习中,我使用机器学习来解决问题,我的损失功能是:
||(A * C)(元素乘积)x B - M ||(2)(L2范数)
我尝试过 adagrad,动量,adadelta 以及其他一些优化方法,但火车错误非常多,并且缓慢减少(learning_rate = 0.1)
UP1 : 好吧,实际上我有一台32GB内存的机器,每个时代我只需要2分钟。只有当C中的相应元素被分配为1时,才会分解M中的元素。实际上,当C [i] [j] = 1时,我只分解M [i] [j],并且在我分解M [i]之后j],我解决M [i] [j]的梯度,一次更新A [i:]和B [:j] 。所以,我使用的批次太小 - 只包含一个元素。另外,我不得不提到C是一个相当稀疏的矩阵。对于C中的每一行,只有2-3个元素被分配为1。
答案 0 :(得分:0)
经过近半个月的努力,我终于得到了答案:我应该更快地更新矩阵A,比如说,以更小的步骤更新参数。我最初每个时期只更新一次A中的每个元素,远远低于B.然而,在我更改代码以让A以与B相同的速度更新后,然后出现意外:它工作得很好!
也许较小的步骤可以帮助SGD更好地工作?我不是真的在数学上相信它。