我正在研究一种推荐算法:使用随机梯度作为优化器的矩阵分解。
我想并行化我的算法。我找到了这篇文章并行化随机下降梯度。他们给出了一个算法(p3):
Algorithm 3 SimuParallelSGD(Examples {c1, . . . cm}, Learning Rate η, Machines k)
Define T = ⌊m/k⌋
Randomly partition the examples, giving T examples to each machine.
for all i ∈ {1, . . . k} parallel do
Randomly shuffle the data on machine i.
Initialize w(i,0) = 0.
for all t ∈ {1, . . . T }: do
Get the tth example on the ith machine (this machine), c(i,t)
w(i,t) ← w(i,t−1) − η∂(w) ci*(wi,t−1)
end for
end for
Aggregate from all computers v = 1/k SUM(W(i,t) and return v.
他们评论道:
“该算法在结束前不需要机器之间的通信。这非常适合于MapReduce设置。”
我看不出他们是怎么实现的。他们是否“手动”分发了每台机器上的数据?或使用HDFS
当HDFS负责数据的分发时,我如何才能限制我的程序只在当前的数据节点上处理数据呢?
是否有合适的方法来实现它与火花+ hadoop集群?
欢迎任何线索
我忘了提些事。我看到了回归logistic和SGD在spark上的例子。
但是数据集只是一个
UserID | ItemID | ratings
在我的例子中,为了加强该算法,我们添加了一些用户信息和项目信息。所以我还有两个文件(UserID,年龄,性别…)和(ItemID颜色大小..)我需要在每个数据节点上完成计算。
我在想,也许应该把HDFS的复制数量与机器的数量相等,这样,所有的数据都会出现在每个节点上。但我不知道的是我什么时候会这么做:
val textFile = sc.textFile("README.md")
发布于 2014-04-02 15:45:46
这是星火在逻辑回归下的例子中使用的相同的算法:
http://spark.apache.org/examples.html
是的,所有方法都依赖于将数据分割成块,这正是HDFS本机所做的。在MapReduce设置中,每个映射器都会执行内部最需要循环的操作,而还原程序将聚合所有计算机的结果。为了收敛,您将需要多次运行此操作,从而调度许多MapReduce作业。
作为一个实用的副词,随机步骤之前的洗牌通常被忽略.它要么需要重写数据,要么需要完整的内存--映射+每次迭代时对其进行洗牌--两者都是相当昂贵的。
https://stackoverflow.com/questions/22816363
复制相似问题