Respuesta corta:
Sí, se realizó una regresión lineal en paralelo. Por ejemplo, Xiangrui Meng et al. (2016) para Machine Learning en Apache Spark. La forma en que funciona es usando el descenso de gradiente estocástico (SGD). En la sección 3, características principales, el autor mencionó:
Los modelos lineales generalizados se aprenden a través de algoritmos de optimización que paralelizan el cálculo de gradiente, utilizando bibliotecas de álgebra lineal basadas en C ++ rápidas para los cálculos de los trabajadores.
Puede encontrar un ejemplo de cómo funciona SGD en mi respuesta aquí: ¿Cómo podría el descenso de gradiente estocástico ahorrar tiempo en comparación con el descenso de gradiente estándar?
Respuesta larga:
Tenga en cuenta que la notación no es consistente con el enlace que proporcioné, creo que la notación matricial es mejor en esta pregunta.
Para hacer una regresión lineal estamos tratando de hacer
minimize ∥Xβ−y∥2
La derivada es
2XT(Xβ−y)
En configuraciones de datos pequeños, podemos establecer la derivada en y resolverla directamente. (p. ej., descomposición QR en R.) En configuraciones de datos grandes, la matriz de datos es demasiado grande para ser almacenada en la memoria y puede ser difícil de resolver directamente. (No estoy familiarizado con cómo hacer la descomposición QR o la descomposición de Cholesky para matrices enormes).0X
Una forma de paralelizar esto es intentar usar un método iterativo: el descenso de gradiente estocástico, donde podemos aproximar el gradiente utilizando un subconjunto de datos. (Si usamos , para representar un subconjunto de los datos, el gradiente puede aproximarse en , y podemos actualizar con el gradiente aproximado).Xsys2XTs(Xsβ−ys)β
Además, para la estadística , podemos calcular para todos los datos en paralelo o aproximarlos usando un subconjunto de datos.R2R2
Intuición sobre cómo funciona (paradigma mapreduce):
Sigo diciendo aproximación usando un subconjunto; La intuición de por qué esto funciona puede describirse en el siguiente ejemplo: supongamos que tengo 100 mil millones de puntos de datos y queremos calcular el promedio de todos los puntos de datos. Supongamos que llevar a cabo una operación de este tipo lleva mucho tiempo y además que no se pueden almacenar todos los datos en la memoria.
Lo que podemos hacer es tomar un subconjunto, decir mil millones de elementos y calcular el promedio de estos. La aproximación así producida no debe estar muy lejos de la verdad (es decir, utilizando todos los datos).
Para paralelizar, podemos usar 100 computadoras, y cada una de ellas toma un subconjunto diferente de los mil millones de puntos de datos y calcula el promedio de estos. (Comúnmente conocido como el paso MAP). Finalmente, ejecute otro promedio en estos 100 números (también conocido como el paso REDUCIR).
Tenga en cuenta que el "paradigma de reducción de mapas" funcionaría bien en algunos casos, pero no en otros. Por ejemplo, la operación "promedio" mencionada anteriormente es muy fácil, porque sabemos , ( asumiendo que la longitud de e son iguales). Para algunos métodos iterativos, es decir, la iteración actual depende de los resultados de la iteración anterior, es difícil paralelizar. El descenso de gradiente estocástico resuelve este problema al aproximar el gradiente utilizando un subconjunto de datos. Y los detalles se pueden encontrar en la respuesta de @ user20160.mean(<x,y>)=mean(x)+mean(y)xy
Referencias
Xiangrui Meng y col. (2016) . MLlib: Aprendizaje automático en Apache Spark