Почему в Spark mllib так медленно сообщается о проблемах с журналом модели LDA?

Я подгоняю модель LDA в Spark mllib, используя OnlineLDAOptimizer. Требуется всего ~ 200 секунд, чтобы разместить 10 тем в 9 миллионах документов (твитов).

val numTopics=10
val lda = new LDA()
  .setOptimizer(new OnlineLDAOptimizer().setMiniBatchFraction(math.min(1.0, mbf)))
  .setK(numTopics)
  .setMaxIterations(2)
  .setDocConcentration(-1) // use default symmetric document-topic prior
  .setTopicConcentration(-1) // use default symmetric topic-word prior
val startTime = System.nanoTime()
val ldaModel = lda.run(countVectors)

/**
 * Print results
 */
// Print training time
println(s"Finished training LDA model.  Summary:")
println(s"Training time (sec)\t$elapsed")
println(s"==========")

numTopics: Int = 10
lda: org.apache.spark.mllib.clustering.LDA = org.apache.spark.mllib.clustering.LDA@72678a91
startTime: Long = 11889875112618
ldaModel: org.apache.spark.mllib.clustering.LDAModel = org.apache.spark.mllib.clustering.LocalLDAModel@351e2b4c
Finished training LDA model.  Summary:
Training time (sec) 202.640775542

Однако, когда я запрашиваю журнал недоумения этой модели (похоже, мне нужно сначала привести его обратно к LocalLDAModel), для оценки требуется очень много времени. Почему? (Я пытаюсь избавиться от недоумения в журнале, чтобы оптимизировать k, количество тем).

ldaModel.asInstanceOf[LocalLDAModel].logPerplexity(countVectors)
res95: Double = 7.006006572908673
Took 1212 seconds.

person Scott Nelson    schedule 08.12.2015    source источник


Ответы (1)


LDAModels, полученные с помощью онлайн-оптимизатора, в любом случае имеют тип LocalLDAModel, поэтому преобразование не происходит. Я рассчитывал недоумение как на локальном, так и на распределенном: они занимают довольно много времени. Я имею в виду, глядя на код, у них есть вложенные вызовы карты для всего набора данных.

Вызов:

docBound += count * LDAUtils.logSumExp(Elogthetad + localElogbeta(idx, ::).t)

для (9M * ненулевых записей BOW) раз может занять довольно много времени. Код взят из: https://github.com/apache/spark/blob/v1.6.1/mllib/src/main/scala/org/apache/spark/mllib/clustering/LDAModel.scala строка 312

Обучение LDA в вашем случае происходит быстро, потому что вы тренируетесь всего за 2 итерации с вызовами обновления 9m/mbf.

Кстати. значением по умолчанию для docConcentration является Vectors.dense(-1), а не просто Int.

Кстати. номер 2: Спасибо за этот вопрос, у меня были проблемы с моим алгоритмом, запускающим его в кластере, просто потому, что у меня был этот глупый расчет недоумения, и я не знал, что он вызывает столько проблем.

person Timomo    schedule 02.06.2016