2015-12-08 20 views
0

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

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 = [email protected] 
startTime: Long = 11889875112618 
ldaModel: org.apache.spark.mllib.clustering.LDAModel = [email protected] 
Finished training LDA model. Summary: 
Training time (sec) 202.640775542 

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

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

ответ

1

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

Призвание:

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^