La formation aux réseaux de neurones est-elle effectuée une par une? [dupliquer]

9

J'essaie d'apprendre les réseaux de neurones en regardant cette série de vidéos et en implémentant un simple réseau de neurones en Python.

Voici l'une des choses que je me demande: j'entraîne le réseau neuronal sur des échantillons de données, et j'ai 1000 échantillons. La formation consiste à modifier progressivement les poids et les biais pour que la fonction de coût se traduise par un coût moindre.

Ma question: devrais-je changer les poids / biais de chaque échantillon avant de passer à l'échantillon suivant, ou devrais-je d'abord calculer les changements souhaités pour l'ensemble du lot de 1000 échantillons, puis commencer à les appliquer au réseau?

Ram Rachum
la source

Réponses:

9

Dois-je changer les poids / biais de chaque échantillon avant de passer à l'échantillon suivant,

Vous pouvez le faire, cela s'appelle descente de gradient stochastique (SGD) et généralement vous mélangerez l'ensemble de données avant de le parcourir à chaque fois.

ou dois-je d'abord calculer les changements souhaités pour l'ensemble du lot de 1 000 échantillons, puis commencer à les appliquer au réseau?

Vous pouvez le faire, il est appelé descente de gradient par lots , ou dans certains cas (en particulier dans les ressources plus anciennes) simplement supposé comme l'approche normale et appelé descente de gradient.

Chaque approche présente des avantages et des inconvénients. En général:

  • SGD effectue chaque mise à jour plus tôt en termes de quantité de données qui ont été traitées. Il vous faudra donc peut-être moins d'époques avant de converger vers des valeurs raisonnables.

  • SGD effectue plus de traitement par échantillon (car il est mis à jour plus fréquemment), il est donc également plus lent dans le sens où le traitement de chaque échantillon prendra plus de temps.

  • SGD peut profiter moins de la parallélisation, car les étapes de mise à jour signifient que vous devez exécuter chaque élément de données en série (car les pondérations ont changé et les résultats d'erreur / de gradient sont calculés pour un ensemble spécifique de pondérations).

  • Les étapes individuelles SGD ne font généralement que des suppositions très approximatives aux bons gradients pour changer les pondérations. C'est à la fois un inconvénient (les performances du NN par rapport à l'objectif sur l'ensemble d'entraînement peuvent diminuer et augmenter) et un avantage (il y a moins de probabilité de se coincer dans un point stationnaire local en raison de la "gigue" causée par ces différences aléatoires).

En pratique, la plupart des logiciels vous permettent de faire un compromis entre le traitement par lots et le traitement d'un seul échantillon, pour essayer d'obtenir les meilleures performances et les meilleures caractéristiques de mise à jour. C'est ce qu'on appelle le traitement par mini-lots, qui implique:

  • Mélange de l'ensemble de données au début de chaque époque.

  • En parcourant les données mélangées, N éléments par temps, où N peut varier de 10 à 1 000, selon le problème et les contraintes matérielles. Une décision courante consiste à traiter la plus grande taille de lot que l'accélération GPU permet d'exécuter en parallèle.

  • Calculez la mise à jour requise pour chaque petit lot, puis appliquez-la.

C'est aujourd'hui la méthode de mise à jour la plus courante que la plupart des bibliothèques de réseaux neuronaux supposent, et elles acceptent presque universellement un paramètre de taille de lot dans l'API de formation. La plupart des bibliothèques appellent toujours de simples optimiseurs qui font cela SGD; techniquement c'est vrai, les gradients calculés sont encore quelque peu aléatoires en raison de ne pas utiliser le lot complet, mais vous pouvez trouver cette descente de gradient appelée mini-lot dans certains papiers plus anciens.

Neil Slater
la source
«Une décision courante consiste à traiter la plus grande taille de lot que l'accélération GPU permet d'exécuter en parallèle.» Comment déterminez-vous cela? Je n'ai vu aucune ressource où il peut être commenté lorsque la taille du lot est juste suffisante pour la parallélisation maximale
DuttaA
Une question similaire a déjà été posée sur ce site. Je pense même que c'est un doublon (même si d'un autre point de vue légèrement). Voir: ai.stackexchange.com/q/11667/2444 .
nbro
"Une décision courante consiste à traiter la plus grande taille de lot que l'accélération GPU permet d'exécuter en parallèle." - Tu l'as à l'envers! La première heuristique consiste à traiter la plus petite taille de mini-lot qui se traduit par des performances acceptables. Cependant, avec de nombreux modèles, vous atteignez les limites de la mémoire avant de saturer l'efficacité matérielle, vous finissez donc par exécuter le plus grand modèle qui s'adaptera à la RAM. En règle générale, cependant, les lots plus petits trouvent de meilleurs minima car ils présentent plus de stochasticité. Une mise en garde est que la norme de lot rompt avec de très petites tailles de lot.
Aleksandr Dubinsky
@AleksandrDubinsky RAM est du matériel.
DuttaA
0

Idéalement, vous devez mettre à jour les poids en parcourant tous les échantillons du jeu de données. C'est ce qu'on appelle la descente de gradient par lots . Mais, comme le non. d'exemples de formation augmente, le calcul devient énorme et la formation sera très lente. Avec l'avènement de l'apprentissage en profondeur, la taille de la formation est en millions et le calcul utilisant tous les exemples de formation est très peu pratique et très lent.

C'est là que deux techniques d'optimisation sont devenues importantes.

  1. Descente de gradient en mini-lot
  2. Descente de gradient stochastique (SGD)

Dans la descente de gradient en mini-lot, vous utilisez une taille de lot qui est considérablement inférieure au nombre total. d'exemples de formation et mettez à jour vos poids après avoir parcouru ces exemples.

En descente de gradient stochastique, vous mettez à jour les poids après avoir passé par chaque exemple d'entraînement.

En ce qui concerne les avantages et les inconvénients des trois méthodes dont nous avons discuté.

  • La descente en gradient de lots converge progressivement vers le minimum global mais elle est lente et nécessite une puissance de calcul énorme.

  • La descente du gradient stochastique converge rapidement mais pas vers le minimum global, elle converge quelque part près du minimum global et plane autour de ce point, mais ne converge jamais vers le minimum global. Mais, le point convergent dans la descente du gradient stochastique est assez bon pour toutes les fins pratiques.

  • Le gradient Mini-Batch est un compromis entre les deux méthodes ci-dessus. Mais, si vous avez une implémentation vectorisée de la mise à jour des poids et que vous vous
    entraînez avec une configuration multicœur ou soumettez la formation à
    plusieurs machines, c'est la meilleure méthode à la fois en termes de temps de formation et de convergence vers le minimum global.

Vous pouvez tracer la fonction de coût, par rapport au non. d'itérations pour comprendre la différence entre la convergence dans les 3 types de descente de gradient.

  • Le tracé de descente en gradient de lots tombe doucement et lentement et se stabilise et atteint le minimum global.

  • Le tracé de descente du gradient stochastique aura des oscillations, tombera rapidement mais oscille autour du minimum global.

Ce sont des blogs où il y a une explication détaillée des avantages, des inconvénients de chaque méthode et aussi des graphiques de la façon dont la fonction de coût change pour les trois méthodes avec des itérations.

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

Kartik Podugu
la source