Как запустить линейную регрессию в параллельном / распределенном режиме для настройки больших данных?


13

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

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

Есть ли в этом смысл ? если так, как я должен получить общее ожидаемое R2 от каждого отдельного R2 ?

Ответы:


10

Краткий ответ:

Да, параллельная регрессия запущена. Например, Xiangrui Meng et al. (2016) для машинного обучения в Apache Spark. Как это работает, использует стохастический градиентный спуск (SGD). В разделе 3, основные функции, автор упомянул:

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

Пример того, как работает SGD, можно найти в моем ответе здесь: Как стохастический градиентный спуск может сэкономить время по сравнению со стандартным градиентным спуском?


Длинный ответ:

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

Чтобы сделать линейную регрессию, мы пытаемся сделать

свести к минимуму | |Иксβ-Y| |2

Производная

2ИксT(Иксβ-Y)

В небольших настройках данных мы можем установить производную на и решить ее напрямую. (например, QR-разложение в R.) При больших настройках данных матрица данных слишком велика, чтобы ее можно было сохранить в памяти, и ее может быть сложно решить напрямую. (Я не знаю, как сделать QR-разложение или разложение Холецкого для огромных матриц).0Икс

Одним из способов распараллеливания этого является попытка использовать итерационный метод: стохастический градиентный спуск, где мы можем аппроксимировать градиент, используя подмножество данных. (Если мы используем , для представления подмножества данных, градиент может быть аппроксимирован , и мы можем обновить с помощью аппроксимированного градиента).ИксsYs2ИксsT(Иксsβ-Ys)β

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

Интуиция о том, как это работает (парадигма mapreduce):

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

Что мы можем сделать, так это просто взять подмножество, скажем, 1 миллиард предметов, и вычислить среднее из них. Полученное приближение не должно быть далеко от истины (т. Е. Использование целых данных).

Для распараллеливания мы можем использовать 100 компьютеров, каждый из которых берет различное подмножество из 1 миллиарда точек данных и вычисляет среднее из них. (Обычно упоминается как шаг MAP). Наконец, запустите другое среднее значение для этих 100 чисел (или шаг REDUCE).

Обратите внимание, что «парадигма mapreduce» будет работать хорошо в некоторых случаях, но не очень хорошо в других. Например, упомянутая ранее «средняя» операция очень проста, потому что мы знаем, что , ( при условии, что длина и одинаковы). Для некоторых итерационных методов, т. Е. Текущая итерация зависит от результатов предыдущей итерации, ее трудно распараллелить. Стохастический градиентный спуск решает эту проблему путем аппроксимации градиента с использованием подмножества данных. А подробности можно найти в ответе @ user20160.жадный(<Икс,Y>)знак равножадный(Икс)+средний (у)ИксY

Рекомендации:

Xiangrui Meng et al. (2016) . MLlib: Машинное обучение в Apache Spark


8

Как упоминалось @ hxd1011, один из подходов состоит в том, чтобы сформулировать линейную регрессию в качестве задачи оптимизации, а затем решить ее с помощью итерационного алгоритма (например, стохастического градиентного спуска). Этот подход можно распараллелить, но есть пара важных вопросов: 1) Как проблема должна быть разбита на подзадачи? 2) Учитывая, что алгоритмы оптимизации, такие как SGD, по своей сути последовательны, как следует объединять решения подзадач для получения глобального решения?

Зинкевич и соавт. (2010) описывают некоторые предыдущие подходы к распараллеливанию на нескольких машинах:

  • 1) Распараллелить SGD следующим образом: разделить данные на несколько машин. На каждом этапе каждый локальный компьютер оценивает градиент, используя подмножество данных. Все оценки градиента передаются на центральный компьютер, который объединяет их для выполнения глобального обновления параметров. Недостатком этого подхода является то, что он требует интенсивного сетевого взаимодействия, что снижает эффективность.

  • 2) Распределите данные равномерно между локальными машинами. Каждая машина решает проблему именно для своего подмножества данных, используя пакетный решатель. Окончательные оценки параметров с локальных машин усредняются для получения глобального решения. Преимущество этого подхода состоит в том, что он требует очень мало сетевого взаимодействия, но недостатком является то, что оценки параметров могут быть неоптимальными.

Они предлагают новый подход:

  • 3) Разрешить каждому локальному компьютеру случайным образом рисовать точки данных. Запустите SGD на каждой машине. Наконец, усредните параметры по машинам, чтобы получить глобальное решение. Как и (2), этот метод требует небольшого сетевого взаимодействия. Но оценки параметров лучше, потому что каждой машине разрешен доступ к большей части данных.

Подход параллельной оптимизации является очень общим и применяется ко многим алгоритмам машинного обучения (не только к линейной регрессии).

Другой альтернативой может быть использование алгоритмов разложения параллельных / распределенных матриц или линейных решателей. Линейная регрессия по методу наименьших квадратов имеет специальную структуру, которая позволяет решить ее с помощью методов матричной декомпозиции. Вот как вы обычно решаете это в случае меньшего набора данных, который помещается в память. Это можно распараллелить, распределяя блоки матрицы по нескольким машинам, а затем решая проблему с помощью параллельных / распределенных вычислений матрицы. Учитывая, что этот подход более специализирован для решения линейных систем, было бы интересно увидеть, как его производительность сравнивается с более общим подходом распределенной оптимизации. Если кто-нибудь может предоставить больше информации об этом, я был бы рад услышать.

Рекомендации:

Зинкевич и соавт. (2010) . Параллельный стохастический градиентный спуск.


+1 отличный ответ для решения проблемы, которую я подробно не обсуждал, а именно, после приблизительного градиента, что делать.
Haitao Du

@ hxd1011 +1 вам также за хорошее описание SGD и как подключить его к проблеме ОП
user20160

2

Долго, долго, пока карта не уменьшилась, я решил это. Ниже приведена ссылка на мою старую статью в Journal of Econometrics 1980. Она была для параллельной нелинейной максимальной вероятности и работала бы для M-оценки.

Метод точен для регрессий. Разбейте данные на k подмножеств на k процессорах / блоках (это также можно сделать последовательно). Сохраняют ли k регрессии коэффициенты регрессии и матрицу X'X для каждого. Назовите эти b1, ..., bk и W1, ..., Wk соответственно, тогда общие коэффициенты регрессии будут определены как b = обратный (W1 + .. + Wk) * (W1 * b1 + ... + Wk * bk) требуется еще один проход через данные для вычисления невязок с использованием b для параметров, чтобы получить сигма ^ 2 оценочной дисперсии ошибки, R ^ 2 общего F и т.п. Тогда ковариационная матрица b задается именно сигма ^ 2 (обратная (W1 + .. + Wk)). Выше * указывает умножение матрицы.

https://www.sciencedirect.com/science/article/pii/0304407680900950


Жаль, что я не знал вашу работу, когда я сделал свою собственную! academic.oup.com/imaiai/article-abstract/5/4/379/...
JohnRos
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.