Comment exécuter une régression linéaire de manière parallèle / distribuée pour le paramétrage du Big Data?


13

Je travaille sur un très gros problème de régression linéaire, avec une taille de données si grande qu'elles doivent être stockées sur un cluster de machines. Il sera beaucoup trop volumineux pour regrouper tous les échantillons dans la mémoire d'une seule machine (même le disque)

Pour effectuer la régression de ces données, je pense à une approche parallèle, c'est-à-dire exécuter une régression sur chaque case individuelle, puis calculer le bêta en fonction des statistiques de chaque bêta individuel (probablement une moyenne ou une médiane)

cela a-t-il un sens? si oui, comment puis-je obtenir le total attendu de chaque individuel ?R2R2

Réponses:


10

Réponse courte:

Oui, une régression linéaire parallèle a été effectuée. Par exemple, Xiangrui Meng et al. (2016) pour Machine Learning dans Apache Spark. La façon dont cela fonctionne utilise la descente de gradient stochastique (SGD). Dans la section 3, principales fonctionnalités, l'auteur a mentionné:

Les modèles linéaires généralisés sont appris via des algorithmes d'optimisation qui parallélisent le calcul du gradient, en utilisant des bibliothèques d'algèbre linéaire rapide basées sur C ++ pour les calculs des travailleurs.

Un exemple sur la façon dont SGD fonctionne peut être trouvé dans ma réponse ici: Comment la descente de gradient stochastique pourrait-elle gagner du temps par rapport à la descente de gradient standard?


Longue réponse:

Remarque, la notation n'est pas cohérente avec le lien que j'ai fourni, je pense que la notation matricielle est meilleure dans cette question.

Pour faire une régression linéaire, nous essayons de faire

minimiser Xβ-y2

Le dérivé est

2XT(Xβ-y)

Dans les petits paramètres de données, nous pouvons définir la dérivée sur et la résoudre directement. (par exemple, décomposition QR en R.) Dans les paramètres de Big Data, la matrice de données est trop volumineuse pour être stockée en mémoire et peut être difficile à résoudre directement. (Je ne sais pas comment faire la décomposition QR ou la décomposition Cholesky pour les matrices énormes).0X

Une façon de paralléliser cela est d'essayer d'utiliser une méthode itérative: la descente du gradient stochastique, où nous pouvons approximer le gradient en utilisant un sous-ensemble des données. (Si nous utilisons , pour représenter un sous-ensemble des données, le gradient peut être approximé par , et nous pouvons mettre à jour avec le gradient approximatif).Xsys2XsT(Xsβ-ys)β

De plus, pour la statistique , nous pouvons calculer pour toutes les données en parallèle ou l'approximer en utilisant un sous-ensemble des données.R2R2

Intuition sur son fonctionnement (paradigme mapreduce):

Je continue à dire approximation en utilisant un sous-ensemble; l'intuition pour laquelle cela fonctionne peut être décrite dans l'exemple suivant: supposons que j'ai 100 milliards de points de données et que nous voulons calculer la moyenne de tous les points de données. Supposons que la réalisation d'une telle opération prenne beaucoup de temps et, en outre, que l'ensemble des données ne puisse pas être stocké en mémoire.

Ce que nous pouvons faire, c'est simplement prendre un sous-ensemble, disons 1 milliard d'articles, et calculer la moyenne de ceux-ci. L'approximation ainsi produite ne doit pas être éloignée de la vérité (c'est-à-dire en utilisant l'ensemble des données).

Pour paralléliser, nous pouvons utiliser 100 ordinateurs, chacun d'eux prenant un sous-ensemble différent du milliard de points de données et calculant la moyenne de ceux-ci. (Communément appelé étape MAP). Enfin, exécutez une autre moyenne sur ces 100 nombres (alias l'étape REDUCE).

Notez que le «paradigme mapreduce» fonctionnerait bien dans certains cas, mais pas bien dans d'autres. Pour l'exemple, l'opération "moyenne" mentionnée plus haut est très simple, car nous savons , ( en supposant que la longueur de et est la même). Pour certaines méthodes itératives, c'est-à-dire que l'itération actuelle dépend des résultats de l'itération précédente, il est difficile de paralléliser. La descente de gradient stochastique résout ce problème en approximant le gradient à l'aide d'un sous-ensemble de données. Et les détails peuvent être trouvés dans la réponse de @ user20160.signifier(<X,y>)=signifier(X)+moyenne (y)Xy

Les références:

Xiangrui Meng et al. (2016) . MLlib: Apprentissage automatique dans Apache Spark


8

Comme @ hxd1011 l'a mentionné, une approche consiste à formuler la régression linéaire comme un problème d'optimisation, puis à le résoudre en utilisant un algorithme itératif (par exemple la descente de gradient stochastique). Cette approche peut être mise en parallèle mais il y a quelques questions importantes: 1) Comment le problème devrait-il être divisé en sous-problèmes? 2) Étant donné que les algorithmes d'optimisation comme SGD sont intrinsèquement séquentiels, comment les solutions aux sous-problèmes devraient-elles être combinées pour obtenir une solution globale?

Zinkevich et al. (2010) décrivent certaines approches antérieures de la parallélisation sur plusieurs machines:

  • 1) Parallélisez SGD comme suit: Répartissez les données sur plusieurs machines. À chaque étape, chaque machine locale estime le gradient à l'aide d'un sous-ensemble des données. Toutes les estimations de gradient sont transmises à une machine centrale, qui les agrège pour effectuer une mise à jour globale des paramètres. L'inconvénient de cette approche est qu'elle nécessite une communication réseau lourde, ce qui réduit l'efficacité.

  • 2) Répartissez les données uniformément sur les machines locales. Chaque machine résout le problème exactement pour son propre sous-ensemble de données, à l'aide d'un solveur par lots. Les estimations finales des paramètres des machines locales sont moyennées pour produire une solution globale. L'avantage de cette approche est qu'elle nécessite très peu de communication réseau, mais l'inconvénient est que les estimations des paramètres peuvent être sous-optimales.

Ils proposent une nouvelle approche:

  • 3) Autorisez chaque machine locale à dessiner au hasard des points de données. Exécutez SGD sur chaque machine. Enfin, faites la moyenne des paramètres sur les machines pour obtenir une solution globale. Comme (2), cette méthode nécessite peu de communication réseau. Mais, les estimations des paramètres sont meilleures car chaque machine est autorisée à accéder à une plus grande fraction des données.

L'approche d'optimisation parallélisée est très générale et s'applique à de nombreux algorithmes d'apprentissage automatique (et pas seulement à la régression linéaire).

Une autre alternative serait d'utiliser des algorithmes de décomposition matricielle parallèle / distribuée ou des solveurs linéaires. La régression linéaire des moindres carrés a une structure spéciale qui permet de la résoudre en utilisant des méthodes de décomposition matricielle. Voici comment vous le résolvez généralement dans le cas d'un ensemble de données plus petit qui tient en mémoire. Cela peut être parallélisé en distribuant des blocs de la matrice sur plusieurs machines, puis en résolvant le problème à l'aide de calculs matriciels parallèles / distribués. Étant donné que cette approche est plus spécialisée dans la résolution de systèmes linéaires, il serait intéressant de voir comment ses performances se comparent à l'approche d'optimisation distribuée plus générale. Si quelqu'un peut fournir plus d'informations à ce sujet, je serais heureux de l'entendre.

Les références:

Zinkevich et al. (2010) . Descente de gradient stochastique parallélisé.


+1 excellente réponse pour résoudre le problème que je n'ai pas abordé en détail, c'est-à-dire, après avoir approximé le gradient quoi faire.
Haitao Du

@ hxd1011 +1 également pour une bonne description de SGD et comment le connecter au problème d'OP
user20160

2

Long, long, avant que la carte ne se réduise, j'ai résolu cela. Ci-dessous se réfère à un ancien article à moi dans Journal of Econometrics 1980. C'était pour la vraisemblance maximale non linéaire parallèle et fonctionnerait pour M-estimation.

La méthode est exacte pour les régressions. Fractionner les données en k sous-ensembles sur k processeurs / unités (pourrait également être fait de manière séquentielle.) Est-ce que k régressions conservent les coefficients de régression et la matrice X'X pour chacun. Appelons ces b1, ..., bk et W1, ..., Wk respectivement alors les coefficients de régression globaux sont donnés par b = inverse (W1 + .. + Wk) * (W1 * b1 + ... + Wk * bk) un a besoin d'un autre passage à travers les données pour calculer les résidus en utilisant b pour les paramètres pour obtenir sigma ^ 2 la variance d'erreur estimée, R ^ 2 F globale et similaires. Alors la matrice de covariance de b est donnée exactement par sigma ^ 2 (inverse (W1 + .. + Wk)). Ci-dessus * indique une multiplication matricielle.

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


J'aurais aimé connaître ton travail quand j'ai fait le mien! academic.oup.com/imaiai/article-abstract/5/4/379/…
JohnRos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.