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


13

Я працюю над дуже великою лінійною проблемою регресії, розмір даних настільки великий, що їх потрібно зберігати на кластері машин. Це буде занадто великим, щоб об'єднати всі зразки в одну пам'ять однієї машини (навіть диск)

Щоб зробити регресію цих даних, я думаю про паралельний підхід, тобто запустити регресію в кожному окремому вікні, а потім обчислити бета-версію, грунтуючись на статистиці кожної окремої бета-версії (можливо, середньої чи середньої)

це має сенс? якщо так, то як я можу отримати загальний очікуваний від кожного окремого ?R2R2

Відповіді:


10

Коротка відповідь:

Так, паралельно проводилася лінійна регресія. Наприклад, Xiangrui Meng та ін. (2016) для машинного навчання в Apache Spark. Це працює за допомогою стохастичного градієнтного спуску (SGD). У розділі 3, основні особливості, автор згадав:

Узагальнені лінійні моделі вивчаються за допомогою алгоритмів оптимізації, які паралелізують градієнтне обчислення, використовуючи швидкі бібліотеки лінійних алгебр на основі C ++ для обчислень робітників.

Приклад того, як працює SGD, можна знайти в моїй відповіді тут: Як стохастичний градієнтний спуск дозволить заощадити час порівняно зі стандартним схилом градієнта?


Довга відповідь:

Зауважте, позначення не узгоджується з наданим мною посиланням, я вважаю, що матричне позначення краще в цьому питанні.

Щоб зробити лінійну регресію, яку ми намагаємося зробити

minimize Xβy2

Похідна є

2XT(Xβy)

У невеликих налаштуваннях даних ми можемо встановити похідну на та вирішити її безпосередньо. (наприклад, розкладання QR в Р.) У великих параметрах даних матриця даних занадто велика, щоб зберігатися в пам'яті, і може бути важко вирішити безпосередньо. (Мені не знайоме, як зробити розкладання QR або розкладання Чолеського для величезних матриць).X0X

Одним із способів паралелізації цього є намагання використовувати ітеративний метод: стохастичний градієнтний спуск, де ми можемо наблизити градієнт за допомогою підмножини даних. (Якщо ми використовуємо , для представлення підмножини даних, градієнт можна наблизити до , і ми можемо оновити з наближеним градієнтом).y s 2 X T s ( X s β - y s ) βXsys2XsT(Xsβys)β

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

Інтуїція про те, як це працює (парадигма зменшення карти):

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

Що ми можемо зробити, це просто взяти підмножину, скажімо, 1 мільярд елементів, і обчислити середнє значення. Отримане таким чином наближення не повинно бути далеко від істини (тобто, використовуючи цілі дані).

Для паралельного використання ми можемо використовувати 100 комп’ютерів, причому кожен з них приймає різний підмножина з 1 мільярда точок даних і обчислює середнє значення. (Зазвичай називається кроком MAP). Нарешті, запустіть ще одне середнє значення на цих 100 числах (він же крок ЗНИЖЕННЯ).

Зверніть увагу, що "парадигма перерахунку на карту" буде добре працювати в деяких випадках, але в інших не так. Наприклад, згадана раніше "середня" операція дуже проста, оскільки ми знаємо , ( якщо припустити, що довжина і однакова). Для деяких ітераційних методів, тобто поточна ітерація залежить від попередніх результатів ітерації, їх важко паралелізувати. Стохастичний градієнтний спуск вирішує цю проблему шляхом наближення градієнта за допомогою підмножини даних. А деталі можна знайти у відповіді @ user20160.х уmean(<x,y>)=mean(x)+mean(y)xy

Список літератури:

Xiangrui Meng та ін. (2016) . MLlib: Машинне навчання в Apache Spark


8

Як зазначалося @ hxd1011, один із підходів полягає у формуванні лінійної регресії як оптимізаційної задачі, а потім її вирішенні за допомогою ітераційного алгоритму (наприклад, стохастичний градієнтний спуск). Цей підхід можна паралелізувати, але є кілька важливих питань: 1) Як слід розбити проблему на підпроблеми? 2) З огляду на те, що алгоритми оптимізації, такі як SGD, по суті є послідовними, як слід поєднувати рішення субпроблем для отримання глобального рішення?

Зінкевич та ін. (2010) описують деякі попередні підходи до паралелізації на кількох машинах:

  • 1) Паралелізуйте SGD так: Розбийте дані на декілька машин. На кожному кроці кожна локальна машина оцінює градієнт, використовуючи підмножину даних. Усі оцінки градієнта передаються центральній машині, яка агрегує їх для здійснення глобального оновлення параметрів. Мінусом такого підходу є те, що він вимагає важкої мережевої комунікації, що знижує ефективність.

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

Вони пропонують новий підхід:

  • 3) Дозволити кожній локальній машині випадковим чином малювати точки даних. Запустіть SGD на кожній машині. Нарешті, порівнюйте параметри серед машин для отримання глобального рішення. Як і (2), цей метод вимагає мало мережевого зв'язку. Але оцінки параметрів є кращими, оскільки кожній машині дозволяється отримати більшу частину даних.

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

Іншою альтернативою було б використання алгоритмів розкладання паралельної / розподіленої матриці або лінійних розв'язків. Лінійна регресія найменших квадратів має особливу структуру, що дозволяє вирішити її методами матричного розкладання. Ось як зазвичай ви вирішуєте це у випадку меншого набору даних, який вписується в пам'ять. Це можна паралельно розподілити, розподіливши блоки матриці на декілька машин, потім вирішивши задачу за допомогою паралельних / розподілених матричних обчислень. Враховуючи, що цей підхід більш спеціалізований для вирішення лінійних систем, було б цікаво побачити, як його ефективність порівнюється з більш загальним підходом до оптимізації. Якщо хтось може надати більше інформації про це, я би радий почути.

Список літератури:

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


+1 чудова відповідь, щоб вирішити проблему, про яку я детально не обговорював, а саме після приблизного градієнта, що робити.
Хайтао Ду

@ hxd1011 +1 також вам приємний опис SGD та як підключити його до проблеми ОП
user20160

2

Довго, довго, перш ніж зменшити карту, я вирішив це. Нижче наведено посилання на стару шахтну книгу в Journal of Econometrics 1980. Це була для паралельної нелінійної максимальної ймовірності і могла б працювати для М-оцінки.

Метод точний для регресій. Розбийте дані на k підмножини на k процесорах / одиницях (це можна зробити також послідовно.) Чи регресії k зберігають коефіцієнти регресії та матрицю X'X для кожного. Викличте ці b1, ..., bk і W1, ..., Wk відповідно, тоді загальні коефіцієнти регресії задаються b = оберненими (W1 + .. + Wk) * (W1 * b1 + ... + Wk * bk) потрібен ще один прохід через дані, щоб обчислити залишки, використовуючи b для параметрів, щоб отримати sigma ^ 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.