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β−y∥2
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).Xsys2XTs(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