基于hadoop的并行机器学习(推荐)算法

33qvvth1  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(384)

我正在研究一个推荐算法:使用随机梯度作为优化器的矩阵分解。
我想把我的算法并行化。我发现这篇文章平行于随机下降梯度。他们给出了一个算法(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负责数据的分发;如何限制我的程序只处理当前数据节点上的数据?
有没有合适的方法可以用spark+hadoop集群来实现它?
欢迎任何线索
我忘了提什么。我在spark上看到了sgd的例子。
但数据集只是一个

UserID | ItemID | ratings

在我的例子中,为了加强算法,我们添加了一些用户信息和项目信息。因此,为了完成计算,我在每个数据节点上还需要两个文件(userid age sex..)和(itemid color size..)。
我在想,也许把hdf的复制数量等于机器的数量,这样所有的数据都会在每个节点上。但我不知道什么时候我会这么做:

val textFile = sc.textFile("README.md")

会发生什么?
rdd会在每个数据节点的内存中创建吗?
所有任务是否只能由每个数据节点在本地处理?

dly7yett

dly7yett1#

spark在其logistic回归示例中使用的算法相同:
http://spark.apache.org/examples.html
是的,所有方法都依赖于将数据分块,这是hdfs本机所做的。在mapreduce设置中,每个Map器都将执行最内部的for循环,并且reducer将聚合来自所有计算机的结果。为了收敛,您将需要多次运行它—从而安排许多mapreduce作业。
作为一个实际的旁注,随机步骤之前的洗牌通常被忽略。它需要在每次迭代时重写数据或完全内存Map+洗牌-这两者都是相当昂贵的。

相关问题