Partager via


MinibatchSize BrainScript dans CNTK

Remarque : Pour les utilisateurs BrainScript, le paramètre pour la taille minibatch est minibatchSize, pour les utilisateurs Python, il s’agit minibatch_size_in_samples. Pour les utilisateurs Python, consultez cette page.

CNTK a une définition très spécifique du minibatchSize paramètre : il indique le nombre d’exemples entre les mises à jour de modèle. Un exemple ici est défini comme un vecteur ou un tenseur qui transite par le système. Par exemple, dans une tâche de reconnaissance d’image, une image est un exemple.

Taille de minibatch pour chaque époque, donnée dans les échantillons (tenseurs le long d’un axe dynamique). La valeur par défaut est 256. Vous pouvez utiliser différentes valeurs pour différentes époques, par exemple 128*2:1024 (dans BrainScript) ou 128*2 + 1024 (en Python) signifie utiliser une taille minibatch de 128 pour les deux premières époques, puis 1024 pour le reste. Notez que « Taille de minibatch » dans CNTK signifie que le nombre d’échantillons traités entre les mises à jour du modèle. Cette définition contient également lors de la parallélisation entre les travailleurs (par exemple, pour K les travailleurs, le nombre d’échantillons que chaque worker traiterait est minibatchSize/K). En cas d’entrées de longueur variable, minibatchSize fait référence au nombre d’éléments de ces séquences, et non au nombre de séquences. SGD essaiera d’ajuster jusqu’à autant de séquences que possible dans le minibatch qui ne dépasse minibatchSize pas le nombre total d’échantillons. Si plusieurs entrées sont fournies, les tenseurs sont ajoutés au minibatch actuel jusqu’à ce que l’une des entrées dépasse le minibatchSize.

Important, pour les données séquentielles, un exemple est un élément individuel d’une séquence. Par conséquent, CNTK ne minibatchSize fait pas référence au nombre de séquences dans le minibatch, mais au nombre agrégé d’éléments/jetons de séquence dans les séquences qui constituent le minibatch. CNTK prend en charge nativement les séquences de longueur variable, c’est-à-dire qu’elle peut prendre en charge des séquences de longueurs très variables au sein du même minibatch, sans avoir besoin de solutions de contournement telles que le compartimentage. Avec la notion de CNTK de spécifier le taux d’apprentissage par échantillon (au lieu d’une moyenne minibatch), chaque élément de séquences de toute longueur contribue à la même chose au dégradé, ce qui entraîne une convergence cohérente. (De nombreuses autres boîtes à outils définissent la taille de minibatch pour les données séquentielles comme nombre de séquences dans le minibatch. Cela pose problème, en particulier si les dégradés sont également définis comme des moyennes minibatch plutôt que des sommes de minibatch de CNTK, car la contribution au dégradé à partir de chaque jeton ou étape d’une séquence serait inversement proportionnelle à la longueur de séquence. l’approche de CNTK évite cela.)

Lorsque plusieurs Input{}s sont utilisés, il est possible que toutes les entrées n’aient pas la même longueur de séquence. Par exemple, dans la classification de séquence, l’étiquette de chaque séquence est un jeton unique. Dans ce cas, l’entrée avec le plus grand nombre d’échantillons contrôle la taille de minibatch. (Vous pouvez modifier ce comportement en spécifiant definesMbSize=True pour une entrée, la taille de minibatch est comptée en fonction des séquences de cette entrée particulière. Lorsque plusieurs entrées sont spécifiées, une seule peut avoir definesMbSize la valeur True.)

Malgré notre définition claire d’être minibatchSize le nombre d’échantillons entre les mises à jour de modèle, il existe deux occasions où nous devons assouplir la définition :

  • données séquentielles : les séquences de longueur variable ne correspondent généralement pas exactement à la taille de minibatch demandée. Dans ce cas, autant de séquences que possible sont emballées dans un minibatch sans dépasser la taille de minibatch demandée (à une exception près : si la séquence suivante dans le corpus aléatoire dépasse la longueur de la taille de minibatch, la taille de minibatch se compose de cette séquence).
  • parallélisme des données : ici, la taille de minibatch est approximative, car notre algorithme de randomisation basé sur des blocs ne peut pas garantir que chaque worker reçoit précisément le même nombre d’échantillons.

Toutes les considérations ci-dessus s’appliquent également à epochSize, mais epochSize a quelques différences, voir ici.