Je suis sur le point de former un grand réseau LSTM avec 2 à 3 millions d'articles et je suis aux prises avec des erreurs de mémoire (j'utilise AWS EC2 g2x2large).
J'ai découvert qu'une solution consiste à réduire le batch_size
. Cependant, je ne sais pas si ce paramètre est uniquement lié à des problèmes d'efficacité de la mémoire ou s'il affectera mes résultats. En fait, j’ai aussi remarqué que, batch_size
dans les exemples, c’est généralement une puissance de deux, que je ne comprends pas non plus.
Cela ne me dérange pas que mon réseau prenne plus de temps à s’entraîner, mais je voudrais savoir si le fait de réduire le batch_size
diminuera la qualité de mes prévisions.
Merci.
deep-learning
keras
hipoglucido
la source
la source
Réponses:
Après un an et demi, je reviens à ma réponse car ma réponse précédente était fausse.
La taille des lots a un impact significatif sur l'apprentissage. Qu'est-ce qui se passe lorsque vous passez un lot sur votre réseau, c'est que vous faites la moyenne des gradients. Le concept est que si la taille de votre lot est suffisamment grande, cela fournira une estimation suffisamment stable de ce que serait le gradient de l'ensemble de données. En prenant des échantillons de votre jeu de données, vous estimez le gradient tout en réduisant considérablement les coûts de calcul. Plus votre estimation est basse, moins votre estimation sera précise. Toutefois, dans certains cas, ces gradients bruyants peuvent réellement aider à échapper aux minima locaux. Lorsque le niveau est trop bas, les pondérations de votre réseau peuvent simplement basculer si vos données sont bruyantes et risquent d’être incapables d’apprendre ou si elles convergent très lentement, ce qui a un impact négatif sur le temps de calcul total.
Un autre avantage du traitement par lots réside dans le calcul GPU. Les GPU sont très aptes à paralléliser les calculs effectués dans les réseaux de neurones si une partie du calcul est identique (par exemple, multiplication de matrice répétée sur la même matrice de pondération de votre réseau). Cela signifie qu’une taille de lot de 16 nécessitera moins de deux fois la quantité d’un lot de 8.
Si vous avez besoin de tailles de lot plus importantes mais que votre GPU ne tient pas, vous pouvez alimenter un petit lot, enregistrer les estimations de gradient et alimenter un ou plusieurs lots, puis effectuer une mise à jour du poids. De cette façon, vous obtenez un dégradé plus stable car vous avez augmenté la taille de votre lot virtuel.
FAUX, VIEILLE RÉPONSE: [[[Non, la taille de lot n'influence en moyenne que la vitesse de votre apprentissage, pas la qualité de l'apprentissage. Les batch_sizes n'ont pas non plus besoin d'être d'une puissance de 2, bien que certains paquets n'autorisent que des puissances de 2. Vous devriez essayer d'obtenir votre batch_size au maximum qui corresponde néanmoins à la mémoire de votre GPU pour obtenir la vitesse maximale possible .]]]]
la source
Je pense que la réponse acceptée est peut-être fausse. Il existe des variantes dans les algorithmes de descente de gradient .
Descente du gradient de vanille : Ici, le gradient est calculé sur tous les points de données en un seul coup et la moyenne est prise. Par conséquent, nous avons une version plus douce du gradient qui prend plus de temps à apprendre.
Descente de gradient stochastique : Ici, un point de données à la fois, de sorte que le gradient est agressif (gradients bruyants) et qu’il va donc y avoir beaucoup d’oscillations (nous utilisons les paramètres Momentum - par exemple, Nesterov pour le contrôler). Il est donc possible que vos oscillations fassent en sorte que l'algorithme n'atteigne pas un minimum local (divergence).
Descente du gradient en mini-lot : qui prend les avantages des deux gradients moyens précédents d'un petit lot. Donc, pas trop agressif comme SGD et permet l'apprentissage en ligne, ce que Vanilla GD n'a jamais permis.
Plus le Mini-lot est petit, meilleure est la performance de votre modèle (pas toujours) et bien sûr, cela a à voir avec votre époque d'apprentissage trop rapide. Si vous vous entraînez sur de grands ensembles de données, vous souhaitez une convergence plus rapide avec de bonnes performances. Par conséquent, nous sélectionnons Batch-GD.
SGD avait un paramètre d'apprentissage fixe, c'est pourquoi nous démarrons d'autres optimiseurs d'adaptation, tels que Adam, AdaDelta, RMS Prop, etc., qui modifient le paramètre d'apprentissage en fonction de l'historique des gradients.
la source
Curieusement, j'ai trouvé que la taille des lots plus importants avec keras nécessite plus d'époques pour converger.
Par exemple, le résultat de ce script basé sur le test d’intégration de keras est
en relation
BatchNormalization
, ce qui a affecté les résultats.Edit: la plupart du temps,
batch_size
on souhaite augmenter le calcul pour accélérer le calcul, mais il existe d'autres moyens plus simples de le faire, comme utiliser des types de données d'une empreinte plus petite via l'dtype
argument, que ce soit en keras ou en tensorflow , par exemple à lafloat32
place defloat64
la source