Искра СВД не воспроизводится - PullRequest
0 голосов
/ 25 ноября 2018

Я использую метод computeSVD из класса Spark IndexedRowMatrix (в Scala).Я заметил, что у него нет setSeed() метода.Я получаю немного разные результаты для нескольких прогонов на одной входной матрице, возможно, из-за внутреннего алгоритма, используемого Spark.Хотя он также реализует приближенный масштабируемый алгоритм SVD, я бы сказал из исходного кода, что computeSVD() из IndexedRowMatrix применяет не приблизительную, а точную версию.

Поскольку я делаю рекомендации с результатами SVDи матрицы латентных факторов пользователя и элемента различны, на самом деле я получаю разные списки рекомендаций: в некоторых случаях примерно одинаковые элементы отображаются в разном порядке, иногда в список попадают несколько новых элементов, а некоторые отсутствуют, поскольку прогнозируемые рейтингичасто почти привязанный после вменения отсутствующей матрицы входных рейтингов, которая передается в computeSVD().

Кто-нибудь еще имел эту проблему?Есть ли способ сделать это полностью детерминированным, или я что-то упускаю?

Спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Всякий раз, когда вы работаете с числовыми вычислениями в Apache Spark, вы должны учитывать две вещи:

  • Арифметика FP не ассоциативна.

    scala> (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)
    res0: Boolean = false
    
  • Каждый обмен в Spark является потенциальным источником недетерминизма.Для достижения оптимальной производительности Spark может объединять частичные результаты вышестоящих задач в произвольном порядке.

    Эту проблему можно решить с помощью некоторого защитного программирования, но накладные расходы времени выполнения обычно слишком высоки, чтобы быть полезными на практике.

Из-за этого окончательные результаты могут колебаться, даже если процедура не зависит от генератора случайных чисел (например, computeSVD), или если задано начальное число генератора.

На практике вы ничего не можете с этим поделать, если не считать переписывания внутренних элементов.Если вы подозреваете, что проблема каким-то образом плохо обусловлена ​​, вы можете попробовать построить несколько моделей с некоторым случайным шумом, чтобы увидеть, насколько чувствительны окончательные прогнозы, и с учетом этого при создании прогноза.

...