Batch_size dans Keras a-t-il des effets sur la qualité des résultats?

38

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_sizedans 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_sizediminuera la qualité de mes prévisions.

Merci.

hipoglucido
la source
Cette question n'est pas spécifique à keras. Je pense que le consensus général est que les échantillons plus petits convergent plus lentement mais sont moins enclins à rester coincés dans les minima locaux
Alex
J'ai vu des cas où une taille de lot trop grande peut empêcher la convergence, même avec le même nombre d'époques de formation.
Curtis White

Réponses:

43

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 .]]]]

Jan van der Vegt
la source
Je n'ai pas les moyens d'acheter 32 mais je peux en avoir 16. Cependant, j'ai remarqué que c'était trop lent. Pensez-vous que je devrais essayer des valeurs entre 16-32 ou rester avec 16?
hipoglucido
Je voudrais essayer de chronométrer certaines valeurs. Chaque époque devrait être à peu près au même moment pour que cela ne prenne pas trop de temps. Essayez d’abord d’essayer de voir si c’est plus rapide ou plus lent parce que cela m’intéresse, étant donné que cette puissance de 2 dépend du GPU et / ou du backend de Keras. Mais je pense que le mieux est de le remplir à ras bord
Jan van der Vegt
9
Etes-vous sûr que la taille du lot n'influence pas la qualité de l'apprentissage? Je me souviens avoir lu des blogs / articles (?) Dans lesquels ils disaient que des lots plus petits produisaient des gradients plus bruyants que des lots plus importants, mais le bruit peut être utile pour sortir des minimas locaux. Pas sûr si / comment cela s'applique aux LSTMs cependant.
Stmax
Pas entièrement convaincu, je n'ai pas assez d'expérience moi-même, mais c'est ce que j'ai lu. Je peux voir que les gradients sont moins stables, donc je suis peut-être en dehors.
Jan van der Vegt
2
Un an et demi plus tard et beaucoup plus compétent maintenant et je suis d'accord. Je vais changer ma réponse
Jan van der Vegt
11

Je pense que la réponse acceptée est peut-être fausse. Il existe des variantes dans les algorithmes de descente de gradient .

  1. 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.

  2. 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).

  3. 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.

Jil Jung Juk
la source
3) est appelé habituellement minibatch
Alex
@ Alex: a ajouté le changement.
Jil Jung Juk
1
Je conviens qu'il n'y a pas de règle concernant le paramètre batch-size. Mais cette affirmation - "Plus le Mini-Lot est petit, meilleures seront les performances de votre modèle" - est contraire à la règle générale. Vous voulez généralement maximiser la taille du lot
MonsieurBeilto
4

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

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

en relation

L'utilisation d'une taille de lot trop importante peut avoir un effet négatif sur la précision de votre réseau pendant l'entraînement, car elle réduit la stochasticité de la descente de gradient.

Edit: la plupart du temps, batch_sizeon 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' dtypeargument, que ce soit en keras ou en tensorflow , par exemple à la float32place defloat64

Shadi
la source
Avec de plus grands lots (et donc moins par époque), vous aurez moins de mises à jour de dégradés par époque. "epoch" n’est que le jargon ML qui signifie "un passage dans vos données pendant l’entraînement". Si vous essayez d'accélérer votre entraînement, mesurez le temps passé sur le mur et ignorez les époques.
Andrew Wagner