Dois-je prendre des éléments aléatoires pour une descente en gradient en mini-batch?

9

Lors de la mise en œuvre de la descente de gradient en mini-batch pour les réseaux de neurones, est-il important de prendre des éléments aléatoires dans chaque mini-batch? Ou est-ce suffisant de mélanger les éléments au début de la formation une fois?

(Je suis également intéressé par des sources qui disent définitivement ce qu'elles font.)

Martin Thoma
la source

Réponses:

7

Il devrait suffire de mélanger les éléments au début de la formation puis de les lire séquentiellement. Cela atteint vraiment le même objectif que de prendre des éléments aléatoires à chaque fois, ce qui est de briser toute sorte de structure prédéfinie qui peut exister dans votre jeu de données d'origine (par exemple, tous les positifs au début, les images séquentielles, etc.).

Bien qu'il soit possible de récupérer des éléments aléatoires à chaque fois, cette opération n'est généralement pas optimale en termes de performances. Les jeux de données sont généralement volumineux et ne sont pas enregistrés dans votre mémoire avec un accès aléatoire rapide, mais plutôt dans votre disque dur lent. Cela signifie que les lectures séquentielles sont à peu près la seule option que vous avez pour de bonnes performances.

Caffe, par exemple, utilise LevelDB, qui ne prend pas en charge la recherche aléatoire efficace. Voir https://github.com/BVLC/caffe/issues/1087 , qui confirme que l'ensemble de données est formé avec des images toujours dans le même ordre.

Choc
la source
4
Je voudrais ajouter qu'il peut être bénéfique de remélanger les données après chaque itération complète de l'ensemble de données pour générer de nouveaux min-lots sur d'autres itérations.
CatsLoveJazz