Comment définir la taille du mini-lot dans SGD en keras


10

Je suis nouveau à Keras et j'ai besoin de votre aide.

J'entraîne un réseau neuronal à Keras et ma fonction de perte est la sortie et la valeur cible de la différence nette au noir et blanc.

Je veux optimiser cela en utilisant Gradient Descent. Après avoir parcouru quelques liens sur le net, j'ai appris qu'il existe 3 types de descentes dégradées généralement utilisées:

  1. Descente de gradient à échantillon unique : Ici, le gradient est calculé à partir d'un seul échantillon à chaque itération -> Le gradient peut être bruyant.
  2. Descente de gradient par lots : Ici, le gradient est la moyenne des gradients calculés à partir de TOUS les échantillons du jeu de données -> Le gradient est plus général, mais intraitable pour les jeux de données énormes.
  3. Descente de gradient en mini-lot : similaire au lot GD. Au lieu d'utiliser l'ensemble de données entier, seuls quelques échantillons (déterminés par batch_size) sont utilisés pour calculer le gradient à chaque itération -> Pas très bruyant et traitable par calcul -> Le meilleur des deux mondes.

Des questions:

  1. Je voudrais effectuer une descente de gradient en mini-lot à Keras. Comment puis-je faire ceci? Dois-je utiliser l'optimiseur SGD?
  2. Si SGD doit être utilisé, comment définir la taille du lot? Il ne semble pas y avoir de paramètre à la fonction SGD pour définir batch_size.

    optimizer = keras.optimizers.SGD(lr=0.01, decay=0.1, momentum=0.1, nesterov=False)
  3. Il existe un paramètre batch_size dans model.fit () dans Keras.

    history = model.fit(x, y, nb_epoch=num_epochs, batch_size=20, verbose=0, validation_split=0.1)

    Est-ce la même que la taille du lot dans Mini-batch Gradient Descent? Sinon, qu'est-ce que cela signifie exactement de s'entraîner sur un lot d'entrées? Cela signifie-t-il que «batch_size» non. de threads s'exécutent en parallèle et mettent à jour les pondérations du modèle en parallèle?

Si cela peut vous aider, voici l'extrait de code python que j'ai écrit jusqu'à présent .

Réponses:


8

Oui, tu as raison. En Keras se batch_sizeréfère à la taille du lot dans Mini-batch Gradient Descent. Si vous souhaitez exécuter une descente de gradient par lots, vous devez définir le batch_sizesur le nombre d'échantillons d'apprentissage. Votre code semble parfait, sauf que je ne comprends pas pourquoi vous stockez la model.fitfonction dans un historique d'objet.


3
Il stocke dans un objet historique car dans les keras, la fonction "fit" renvoie non seulement le modèle formé, mais un objet History qui stocke le modèle formé, l'historique de formation et bien d'autres choses. Il y a des exemples dans des exemples de keras comme ça.
Ygor de Mello Canalli

1

Si l'on met de côté les considérations théoriques, étant donné l'ensemble de données réelles et la taille d'un réseau neuronal moderne typique, il faudrait généralement un temps excessivement long pour s'entraîner sur des lots de taille un, et vous n'aurez pas assez de mémoire RAM et / ou GPU pour vous entraîner sur l'ensemble de données immediatement. Ce n'est donc généralement pas la question «si» le mini-lot doit être utilisé, mais «quelle taille» de lots devez-vous utiliser. L' batch_sizeargument est le nombre d'observations sur lesquelles s'entraîner en une seule étape, les tailles généralement plus petites fonctionnent mieux car elles ont un effet de régularisation. De plus, les gens utilisent souvent des optimiseurs plus compliqués (par exemple Adam, RMSprop) et d'autres astuces de régularisation, ce qui rend la relation entre les performances du modèle, la taille du lot, le taux d'apprentissage et le temps de calcul plus compliquée.


Merci d'avoir clarifié cela. Mais comment pourrais-je procéder à la normalisation des données de cette manière. Je sais que je pourrais normaliser toutes les données d'entraînement et de test dans leur ensemble, mais cela ne normalisera plus les mini-lots introduits dans le processus d'optimisation.
Mr.Robot

@ Mr.Robot pourquoi supposeriez-vous que chaque lot doit être normalisé indépendamment?
Tim

J'ai déjà lu un article disant que les données de formation et de test devraient être traitées séparément (c.-à-d. Faire d'abord la division train-test, puis les traiter individuellement). Je pensais que cela s'appliquerait également lors de l'optimisation à l'aide de mini-lots. Je soupçonne que cela pourrait être bon pour la convergence?
Mr.Robot

@ Mr.Robot reductio ad absurdum : avec des mini-lots de taille 1, passeriez -vous comme vos données uniquement des 0? Vous pouvez le poser comme question séparée si vous le souhaitez.
Tim

Merci de l'avoir signalé! Maintenant, je maintenant les problèmes avec mon raisonnement.
Mr.Robot
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.