我正在研究一种推荐算法:使用随机梯度作为优化器的矩阵分解。
我想并行化我的算法。我发现了这篇文章Parallelized Stochastic Descent Gradient。 他们给出了算法(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 ..),我需要在每个数据节点上完成计算。
我想也许可以将HDFS的复制数量等于机器数量,这样所有数据都将在每个节点上。但我不知道的事情就是我什么时候会做火花:
val textFile = sc.textFile("README.md")
答案 0 :(得分:2)
这与Spark在逻辑回归下的示例中使用的算法相同:
http://spark.apache.org/examples.html
是的,所有方法都依赖于在块中拆分数据,这正是HDFS本身所做的。 在MapReduce设置中,每个映射器都会执行最内层的for循环,而reducer会聚合来自所有计算机的结果。要收敛,您需要多次运行 - 从而安排许多MapReduce作业。
作为一个实际的注释,随机步骤之前的改组通常被忽略了。它需要重写数据或完全内存映射+在每次迭代时将其混洗 - 两者都非常昂贵。