Come eseguire la regressione lineare in modo parallelo / distribuito per l'impostazione dei big data?


13

Sto lavorando a un problema di regressione lineare molto grande, con dimensioni dei dati così grandi che devono essere archiviate su un cluster di macchine. Sarà troppo grande per aggregare tutti i campioni nella memoria di una singola macchina (anche disco)

Per regredire questi dati, sto pensando a un approccio parallelo, ovvero eseguendo la regressione su ogni singola casella e quindi calcolando la beta in base alle statistiche di ogni singola beta (probabilmente una media o una mediana)

ha senso? in tal caso, come devo ottenere il totale previsto da ogni singolo ?R 2R2R2

Risposte:


10

Risposta breve:

Sì, è stata eseguita la regressione lineare in parallelo. Ad esempio, Xiangrui Meng et al. (2016) per Machine Learning in Apache Spark. Il modo in cui funziona è l'utilizzo della discesa gradiente stocastica (SGD). Nella sezione 3, caratteristiche principali, l'autore ha menzionato:

I modelli lineari generalizzati vengono appresi tramite algoritmi di ottimizzazione che parallelizzano il calcolo del gradiente, utilizzando veloci librerie di algebra lineare basate su C ++ per i calcoli dei lavoratori.

Un esempio di come funziona SGD può essere trovato nella mia risposta qui: in che modo la discesa gradiente stocastica può risparmiare tempo rispetto alla discesa gradiente standard?


Risposta lunga:

Nota, la notazione non è coerente con il link che ho fornito, penso che la notazione a matrice sia migliore in questa domanda.

Per fare una regressione lineare che stiamo cercando di fare

minimize Xβy2

Il derivato è

2XT(Xβy)

In piccole impostazioni di dati, possiamo impostare la derivata su e risolverla direttamente. (ad es. decomposizione QR in R.) Nelle impostazioni di big data, la matrice di dati è troppo grande per essere memorizzata e potrebbe essere difficile da risolvere direttamente. (Non ho familiarità con come eseguire la decomposizione QR o la scomposizione di Cholesky per enormi matrici).0X

Un modo per parallelizzare questo è tentando di usare un metodo iterativo: discesa gradiente stocastica, in cui possiamo approssimare il gradiente usando un sottoinsieme dei dati. (Se utilizziamo , per rappresentare un sottoinsieme dei dati, il gradiente può essere approssimato di e possiamo aggiornare con il gradiente approssimativo).Xsys2XsT(Xsβys)β

Inoltre, per la statistica , possiamo calcolare per tutti i dati in parallelo o approssimarlo usando un sottoinsieme dei dati.R2R2

Intuizione su come funziona (paradigma di mapreduce):

Continuo a dire approssimazione usando un sottoinsieme; l'intuizione del perché questo funziona può essere descritta nell'esempio seguente: supponiamo che io abbia 100 miliardi di punti dati e vogliamo calcolare la media di tutti i punti dati. Supponiamo che l'esecuzione di tale operazione richieda molto tempo e inoltre che i dati completi non possano essere archiviati in memoria.

Quello che possiamo fare è semplicemente prendere un sottoinsieme, dire 1 miliardo di articoli e calcolare la media di questi. L'approssimazione così prodotta non dovrebbe essere lontana dalla verità (cioè, usando tutti i dati).

Per parallelizzare, possiamo usare 100 computer, ognuno dei quali prende un sottoinsieme diverso da 1 miliardo di punti dati e calcola la media di questi. (Comunemente indicato come passaggio MAP). Infine, esegui un'altra media su questi 100 numeri (ovvero il passaggio REDUCE).

Si noti che il "paradigma mapreduce" funzionerebbe bene in alcuni casi, ma non in altri. Ad esempio, l'operazione "media" menzionata in precedenza è molto semplice, poiché conosciamo , ( assumendo la lunghezza di ed sono uguali). Per alcuni metodi iterativi, ovvero l'attuale iterazione dipende dai risultati dell'iterazione precedente, è difficile parallelizzare. La discesa stocastica del gradiente risolve questo problema approssimando il gradiente usando un sottoinsieme di dati. E i dettagli possono essere trovati nella risposta di @ user20160.mean(<x,y>)=mean(x)+mean(y)xy

Riferimenti:

Xiangrui Meng et al. (2016) . MLlib: Apprendimento automatico in Apache Spark


8

Come menzionato da @ hxd1011, un approccio consiste nel formulare la regressione lineare come un problema di ottimizzazione, quindi risolverlo utilizzando un algoritmo iterativo (ad es. Discesa gradiente stocastica). Questo approccio può essere parallelizzato ma ci sono un paio di domande importanti: 1) Come dovrebbe essere suddiviso il problema in sottoproblemi? 2) Dato che algoritmi di ottimizzazione come SGD sono intrinsecamente sequenziali, come dovrebbero essere combinate soluzioni ai sottoproblemi per ottenere una soluzione globale?

Zinkevich et al. (2010) descrivono alcuni approcci precedenti alla parallelizzazione tra più macchine:

  • 1) Parallelizza SGD come segue: Dividi i dati su più macchine. Ad ogni passaggio, ogni macchina locale stima il gradiente utilizzando un sottoinsieme dei dati. Tutte le stime del gradiente vengono passate a una macchina centrale, che le aggrega per eseguire un aggiornamento globale dei parametri. L'aspetto negativo di questo approccio è che richiede una comunicazione di rete pesante, che riduce l'efficienza.

  • 2) Suddividere i dati in modo uniforme tra i computer locali. Ogni macchina risolve il problema esattamente per il proprio sottoinsieme dei dati, usando un risolutore batch. Le stime dei parametri finali dalle macchine locali sono calcolate in media per produrre una soluzione globale. Il vantaggio di questo approccio è che richiede una comunicazione di rete molto ridotta, ma il rovescio della medaglia è che le stime dei parametri possono essere non ottimali.

Propongono un nuovo approccio:

  • 3) Consentire a ogni macchina locale di disegnare casualmente punti dati. Esegui SGD su ogni macchina. Infine, calcola la media dei parametri tra le macchine per ottenere una soluzione globale. Come (2), questo metodo richiede poche comunicazioni di rete. Tuttavia, le stime dei parametri sono migliori perché ogni macchina è autorizzata ad accedere a una frazione maggiore dei dati.

L'approccio di ottimizzazione parallelizzato è molto generale e si applica a molti algoritmi di apprendimento automatico (non solo alla regressione lineare).

Un'altra alternativa sarebbe quella di utilizzare algoritmi di decomposizione a matrice parallela / distribuita o solutori lineari. La regressione lineare dei minimi quadrati ha una struttura speciale che consente di risolverlo utilizzando metodi di decomposizione della matrice. Ecco come lo risolveresti in genere nel caso di un set di dati più piccolo che si adatta alla memoria. Ciò può essere parallelizzato distribuendo blocchi della matrice su più macchine, quindi risolvendo il problema utilizzando calcoli di matrice parallela / distribuita. Dato che questo approccio è più specializzato nella risoluzione di sistemi lineari, sarebbe interessante vedere come le sue prestazioni si confrontano con l'approccio di ottimizzazione distribuita più generale. Se qualcuno può fornire ulteriori informazioni al riguardo, sarei lieto di ascoltarlo.

Riferimenti:

Zinkevich et al. (2010) . Discesa gradiente stocastica parallela.


+1 ottima risposta per affrontare il problema che non ho discusso in dettaglio, che è, dopo aver approssimato il gradiente cosa fare.
Haitao Du,

@hxd1011 +1 anche a te per una bella descrizione di SGD e come collegarlo al problema di OP
user20160

2

Molto, molto, prima che la riduzione della mappa l'ho risolto. Di seguito è riportato un mio vecchio documento nel Journal of Econometrics 1980. Era per la massima verosimiglianza non lineare parallela e avrebbe funzionato per la stima M.

Il metodo è esatto per le regressioni. Dividi i dati in k sottogruppi su k processori / unità (potrebbe essere fatto anche in sequenza.) Le regressioni k mantengono i coefficienti di regressione e una matrice X'X per ciascuno. Chiamare questi b1, ..., bk e W1, ..., Wk, quindi i coefficienti di regressione complessivi sono dati da b = inverso (W1 + .. + Wk) * (W1 * b1 + ... + Wk * bk) uno è necessario un altro passaggio attraverso i dati per calcolare i residui usando b per i parametri per ottenere sigma ^ 2 la varianza di errore stimata, R ^ 2 F generale e simili. Quindi la matrice di covarianza di b è data esattamente da sigma ^ 2 (inverso (W1 + .. + Wk)). Sopra * indica la moltiplicazione della matrice.

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


Vorrei sapere il tuo lavoro quando ho fatto il mio! academic.oup.com/imaiai/article-abstract/5/4/379/…
JohnRos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.