在Apache Spark Word2Vec中,迭代次数和分区数有什么关系?

15
根据 mllib.feature.Word2Vec - spark 1.3.1文档[1],可以得知:
def setNumIterations(numIterations: Int): Word2Vec.this.type

设置迭代次数(默认值为1),应该小于或等于分区数。
def setNumPartitions(numPartitions: Int): Word2Vec.this.type

设置分区数(默认值为1)。为了获得更高的准确性,请使用较小的数字。
但在这个拉取请求[2]中:
为了使我们的实现更具可扩展性,我们单独训练每个分区,并在每次迭代后合并每个分区的模型。为了使模型更准确,可能需要进行多次迭代。
问题:
- numIterations和numPartitions参数如何影响算法的内部工作? - 在考虑以下规则时,设置分区数和迭代次数之间是否存在权衡?
- 更高的准确性->根据[2]进行更多的迭代 - 更多的迭代->更多的分区根据[1] - 更多的分区->更少的准确性
1个回答

3

增加分区的数量会减少每个分区上训练的数据量,从而使每个训练步骤(词向量调整)更加“嘈杂”和不确定。Spark的实现通过在增加分区数时降低学习率来应对这一点,因为有更多的进程更新向量权重。


@renner2 我仍然不明白为什么numIterations<=numPartitions。它们之间有什么关系? - Arshiyan Alam
1
查看Word2Vec代码(https://github.com/apache/spark/blob/v2.2.1/mllib/src/main/scala/org/apache/spark/mllib/feature/Word2Vec.scala),我找不到一个好的答案。这并不意味着numIter <= numPart没有理论上的原因,只是我没找到。在实践中,当我使用numIter > numPart运行word2vec时,有时单词向量值会非常大,表明存在梯度爆炸问题。如果您查看代码,会发现有一条关于可能按迭代折扣学习率的注释,因此也许在将来的版本中,这个问题会得到解决(我正在使用spark 2.2.1)。 - rennerj2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接