Как Spark Word2Ve c объединяет результаты каждого раздела? - PullRequest
1 голос
/ 06 апреля 2020

Увеличение numPartitions для Word2Ve в Spark c делает его более быстрым, но менее точным, поскольку оно подгоняет каждый раздел отдельно, сокращая контекст, доступный для каждого слова, перед объединением результатов.

Как именно оно объединяет результаты из нескольких разделов? Это просто среднее из векторов? Глядя, чтобы лучше понять, как это влияет на точность.

Глядя на исходный код , я думаю, что здесь происходит слияние:

val synAgg = partial.reduceByKey { case (v1, v2) =>
          blas.saxpy(vectorSize, 1.0f, v2, 1, v1, 1)
          v1
      }.collect()

, которое выглядит как векторная сумма (фактически средняя). частичное происходит от:

val sentences: RDD[Array[Int]] = dataset.mapPartitions { sentenceIter =>
      // Each sentence will map to 0 or more Array[Int]
      sentenceIter.flatMap { sentence =>
        // Sentence of words, some of which map to a word index
        val wordIndexes = sentence.flatMap(bcVocabHash.value.get)
        // break wordIndexes into trunks of maxSentenceLength when has more
        wordIndexes.grouped(maxSentenceLength).map(_.toArray)
      }
    }
val newSentences = sentences.repartition(numPartitions).cache()
val partial = newSentences.mapPartitionsWithIndex { case (idx, iter) =>
// ... long calculation (skip-gram training, etc.)
}

Но я не эксперт по Word2Vec / Spark ML / Scala, поэтому надеюсь, что кто-то более знающий сможет это проверить.

...