我正在研究推荐算法:使用随机梯度作为优化器的矩阵分解。
我想并行化我的算法。我发现这篇文章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 年龄性别..)和(ItemID 颜色大小..),以完成计算。
我在想也许可以让 HDFS 的复制数量等于机器的数量,这样所有数据都将在每个节点上。但我不知道什么时候我会在 spark 上这样做:
val textFile = sc.textFile("README.md")
- 会发生什么?
- rdd 会在每个数据节点的内存上创建吗?
- 是否所有任务只能由每个数据节点在本地处理?