Эта статья была вдохновлена ​​моим профессором Рэйчел Томас, и большая часть материала заимствована из ее курса по вычислительной линейной алгебре. Все ее уроки доступны на YouTube.

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

Почему именно СВД?

Разложение по сингулярным числам (SVD) - чрезвычайно полезный инструмент линейной алгебры, имеющий широкий спектр приложений.

Математика, лежащая в основе SVD:

Для полного обзора линейной алгебры, лежащей в основе SVD, используйте главу книги Криса Мэннинга о матричной факторизации и LSI.

Почему рандомизированный SVD?

Короткий ответ - скорость. Хотя SVD дает нам чрезвычайно точные результаты по рассматриваемой проблеме, это требует больших вычислительных ресурсов. Для данной матрицы размерности M на N алгоритм SVD имеет следующую сложность:

При выборе или разработке алгоритма матричных вычислений следует учитывать четыре вещи:

  • Использование памяти
  • Скорость
  • Точность
  • Масштабируемость / распараллеливание

Если мы допустим некоторое снижение точности, то мы часто можем увеличить скорость на порядки (и / или уменьшить использование памяти), используя приблизительные алгоритмы. Эти алгоритмы обычно дают правильный ответ с некоторой вероятностью. Повторно запуская алгоритм несколько раз, вы, как правило, можете увеличить эту вероятность мультипликативно.

Нам редко требуется выполнять высокоточные вычисления матриц в большом масштабе. Фактически, мы часто используем машинное обучение, и менее точные подходы могут предотвратить переобучение.

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

Пример сценария использования SVD: задан видеопоток изображений. Мы можем использовать SVD для выделения фона и переднего плана.

Нам нужно хранить только 15,3% данных, и мы можем сохранить точность до 1e-5! Замечательно!

Это моя первая попытка улучшить скорость нашего рандомизированного SVD.

Это было проверено на scikitlearn, fbpca, декомпозиция .randomsvd

Результаты:

Decomposition.randomsvd

Результаты не такие, как ожидалось, но есть луч света. Хотя похоже, что графический процессор не улучшает алгоритм быстрее, чем facebooks fbpca. Похоже, мы на правильном пути в отношении наших алгоритмов, поскольку randomized_svd (no cuda) очень хорошо идет в ногу со всеми другими, особенно с fbpca. Стабильность, конечно, является большой проблемой, которую мы должны рассмотреть, поэтому в следующем обновлении я буду делать сравнения стабильности, а также пытаюсь выяснить, почему графический процессор не увеличивает скорость нашего алгоритма.

Код можно найти здесь:

Https://github.com/smortezavi/Randomized_SVD_GPU/blob/master/pytorch_randomized_svd.ipynb

До следующего раза,

источники:

Https://nlp.stanford.edu/IR-book/pdf/18lsi.pdf

Https://arxiv.org/abs/1706.07191

Https://research.fb.com/fast-randomized-svd/

Https://en.wikipedia.org/wiki/Singular-value_decomposition

Https://math.stackexchange.com/questions/3869/what-is-the-intuitive-relationship-between-svd-and-pca