Использование CUDA для решения системы уравнений нелинейным методом наименьших квадратов

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

Матрица Якоби в моей задаче разреженная и нижнетреугольная. Доступна ли библиотека для CUDA с этими методами, или мне придется самому программировать эти методы из буклета?

Доступен ли решатель нелинейного метода наименьших квадратов Гаусса-Ньютона, решатель метода Левенберга-Марквардта или Пауэлла в библиотеке CUDA (бесплатной или платной)?


person Nicholas Kinar    schedule 07.11.2012    source источник
comment
developer.nvidia.com/cublas может помочь с линейной алгеброй   -  person adray    schedule 08.11.2012
comment
@adray: Спасибо! Доступны ли также какие-либо процедуры оптимизации, возможно, в другой библиотеке?   -  person Nicholas Kinar    schedule 08.11.2012


Ответы (4)


Прежде чем указать на возможную простую реализацию процедуры квазиньютоновской оптимизации в CUDA, несколько слов о том, как работает квазиньютоновский оптимизатор.

Рассмотрим функцию f от N вещественных переменных x и произведем разложение второго порядка вокруг определенной точки xi:

введите здесь описание изображения

где A — матрица Гессе.

Чтобы найти минимум, начиная с точки xi, метод Ньютона состоит в том, чтобы заставить

введите здесь описание изображения

что влечет за собой

введите здесь описание изображения

и что, в свою очередь, подразумевает знание обратного гессиана. Кроме того, чтобы обеспечить снижение функции, направление обновления

введите здесь описание изображения

должно быть таким, чтобы

введите здесь описание изображения

что подразумевает, что

введите здесь описание изображения

Согласно приведенному выше неравенству матрица Гессе должна быть определенно положительной. К сожалению, матрица Гессе не обязательно определенно положительна, особенно далеко от минимума f, поэтому использование обратной матрицы Гессе, кроме вычислительной нагрузки, может быть также вредным, продвигая процедуру еще дальше от минимум в сторону областей с возрастающими значениями f. Вообще говоря, удобнее использовать квазиньютоновский метод, т. е. аппроксимацию обратного гессиана, который сохраняет определенное положительное значение и обновляет итерацию после итераций, сходящихся к обратному самому гессиану. Грубое обоснование квазиньютоновского метода состоит в следующем. Рассмотреть возможность

введите здесь описание изображения

а также

введите здесь описание изображения

Вычитая два уравнения, мы получаем правило обновления для процедуры Ньютона

введите здесь описание изображения

Правило обновления для квазиньютоновской процедуры следующее:

введите здесь описание изображения

где Hi+1 — упомянутая матрица, аппроксимирующая обратную матрицу Гессе и обновляемая шаг за шагом.

Существует несколько правил обновления Hi+1, и я не буду вдаваться в подробности этого пункта. Очень распространенный алгоритм предоставляется Бройден-Флетчер-Гольдфарб-Шанно, но во многих случаях Полак-Рибьер схема достаточно эффективна.

Реализация CUDA может следовать тем же шагам, что и классический подход Числовые рецепты, но принимая во внимание следующее:

1) Векторные и матричные операции можно эффективно выполнять с помощью CUDA Thrust или cuBLAS; 2) Логика управления может выполняться ЦП; 3) Минимизация линий, включая брекетинг корней и поиск корней, может выполняться на ЦП, ускоряя только оценку функционала стоимости и градиента графического процессора.

По приведенной выше схеме неизвестные, градиенты и гессианы могут храниться на устройстве без необходимости перемещать их туда и обратно с хоста на устройство.

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

Ю. Фей, Г. Ронг, Б. Ван, В. Ван, "Параллельный алгоритм L-BFGS-B на графическом процессоре", Computers & Graphics, vol. 40, 2014, стр. 1-9.

На этой странице github доступна полная реализация CUDA, обобщающая подход числовых рецептов, использующий linmin, mkbrak и dbrent для случая параллельного GPU. Этот подход реализует схему Полака-Рибьера, но его можно легко обобщить на другие квазиньютоновские задачи оптимизации.

person Vitality    schedule 31.01.2015
comment
Ты прав; любая реализация начинается с математики, и приятно видеть, что доступна эталонная версия кода. - person Nicholas Kinar; 01.02.2015
comment
@NicholasKinar Следует отметить, что подход, указанный на странице github, реализует схему Полака-Рибьера, но его можно легко обобщить на другие квазиньютоновские задачи оптимизации. Я прямо заявил об этом в редактировании моего ответа. - person Vitality; 01.02.2015

Взгляните также на это: libflame содержит реализации многих операций которые предоставляются библиотеками BLAS и LAPACK

person dreamcrash    schedule 08.11.2012
comment
Спасибо, мечта; libflame интересно. - person Nicholas Kinar; 08.11.2012

В настоящее время ни в одной библиотеке нет доступных процедур, реализующих решение системы уравнений с помощью нелинейного решателя наименьших квадратов с использованием платформы CUDA. Эти алгоритмы должны быть написаны с нуля с помощью некоторых других библиотек, реализующих линейную алгебру с разреженными матрицами. Также, как упоминалось в комментарии выше, с линейной алгеброй поможет библиотека cuBLAS.

https://developer.nvidia.com/cusparse

http://code.google.com/p/cusp-library/

person Nicholas Kinar    schedule 07.11.2012

Для тех, кто все еще ищет ответ, это для разреженной матрицы: OpenOF, «Структура для разреженной нелинейной оптимизации методом наименьших квадратов на графическом процессоре».

Для GPU это то же, что g2o для CPU.

person Alejandro Silvestri    schedule 13.10.2015