这个问题可能与正规矩阵分解任务有很大不同,后者在推荐系统中得到了广泛的应用。
我的问题描述如下:
给出稠密矩阵M
(约55000*200,可能含有许多负面元素,0.1< abs(Mi) <1 )
我必须找到两个矩阵A(55000*1400)和B(1400*200),这样:
AB=M
但是,我们有一些关于A的知识,我们有另一个矩阵C,如果Ci = 0,则Ai 必须是零,否则它可以是任意值(Ci= 1)。
在我的实践中,我使用机器学习来解决这个问题,我的损失函数是:
(A*C)(元素乘积)x B-M区(2)(L2范数)
我尝试过adagrad、动量、adadelta和其他一些优化方法,但是火车的误差很大,而且减小得很慢(learning_rate = 0.1)。
UP1:嗯,实际上我有一台32 got内存的机器,每一次只需要2分钟。当C中的对应元素被解析为1时,才在M中分解一个元素。实际上,我只在Ci =1时分解Mi,在分解Mi之后,求解Mi的梯度以更新Ai :和B:J。所以,我使用的批处理太小了--只包含一个元素。另外,我必须指出,C是一个非常稀疏的矩阵。对于C中的每一行,只有2-3个元素以1的形式出现。
发布于 2017-09-20 16:03:17
经过近半个月的努力,我终于得到了答案:我应该更快地更新矩阵A,比如说,以更小的步骤更新参数。我最初每次只更新A中的每个元素一次,远远少于B。然而,在我更改代码使A以与B相同的速度更新之后,意外发生了:它运行得很好!
也许更小的步骤会帮助SGD更好地工作?我不太相信数学上的。
https://stackoverflow.com/questions/46080123
复制相似问题