Normalisation par lot
BatchNormalization(input, scale, bias, runMean, runVariance, spatial,
normalizationTimeConstant = 0,
blendTimeConstant = 0, epsilon = 0.00001, useCntkEngine = true)
Paramètres
input
est l’entrée du nœud de normalisation de lotscale
est un ParameterTensor{} qui contient les facteurs de mise à l’échelle des composants appris (gamma
terme dans l’équation ci-dessous).bias
est un ParameterTensor{} qui contient le biais appris (beta
terme).scale
etbias
doit avoir les mêmes dimensions qui doivent être égales aux dimensions dans leinput
cas ou le nombre despatial = false
cartes de caractéristiques de convolution de sortie en cas despatial = true
.runMean
est la moyenne en cours d’exécution qui est utilisée pendant la phase d’évaluation et peut également être utilisée pendant l’entraînement. Vous devez passer un ParameterTensor{} avec les mêmes dimensions quescale
etbias
, valeur initiale 0, etlearningRateMultiplier=0
définir.runVariance
est la variance en cours d’exécution. Elle est représentée de la même façon querunMean
.spatial
est un indicateur qui spécifie s’il faut calculer la moyenne/var pour chaque fonctionnalité d’un minibatch indépendamment ou, en cas de couches convolutionnelles, par mappage de caractéristiques.normalizationTimeConstant
(valeur par défaut 0) : constante de temps pour le calcul de la moyenne et de la variance sous la forme d’une version filtrée à faible passe des statistiques par lots. Remarque : La valeur par défaut n’est généralement pas ce que vous voulez.blendTimeConstant
(valeur par défaut 0) : permet d’effectuer des estimations par lots lisses avec les statistiques en cours d’exécutionepsilon
est une constante de conditionneur ajoutée à la variance lors de l’calcul de l’écart type inverse.useCntkEngine
(valeur par défaut : true) : définissez-le pourfalse
sélectionner l’implémentation cuDNN gpu uniquement
Valeur retournée
Le lot normalisé input
.
Description
BatchNormalization
implémente la technique décrite dans la normalisation par lots de papier : accélération de la formation en réseau profond en réduisant le décalage de covarié interne (Sergey Ioffe, Christian Szegedy).
En bref, il normalise les sorties de couche pour chaque minibatch pour chaque sortie (fonctionnalité) indépendamment et applique la transformation affine pour conserver la représentation de la couche. Autrement dit, pour la couche input
:
m = mean (input)
var = variance (input)
inputNorm = (input - mean)/sqrt (epsilon + var)
output = gamma * inputNorm + beta
où gamma
et beta
sont des paramètres pouvant être entraînés.
mean
et variance
sont estimés à partir des données d’apprentissage. Dans le cas le plus simple, il s’agit de la moyenne et de la variance du minibatch actuel pendant l’entraînement. En inférence, une estimation à long terme est utilisée à la place.
Les estimations à long terme sont une version à faible pass filtrée des statistiques minibatch, avec la constante de temps (dans les échantillons) donnée par le normalizationTimeConstant
paramètre.
Une valeur de signifie qu’il 0
n’y aura pas de lissage exponentiel et la moyenne/variance en cours d’exécution sera toujours égale à celles du dernier minibatch vu.
C’est souvent indésirable.
Au lieu de cela, il est recommandé d’utiliser une valeur de quelques milliers ici.
Le BatchNormalizationLayer{}
wrapper a une valeur par défaut de 5 000.
Pour plus d’informations sur les constantes temporelles et le lissage exponentiel : https://en.wikipedia.org/wiki/Exponential_smoothing#Time_Constant
Étant donné que les statistiques de minibatch peuvent être bruyantes, CNTK permet également d’utiliser une estimation MAP (maximum-a-modifiable) pendant l’entraînement, où l’estimation à long terme en cours d’exécution est prise comme précédemment.
Le poids du précédent est contrôlé par le blendTimeConstant
paramètre.
Toutefois, cela n’a pas été trouvé utile jusqu’à présent dans nos expériences.
Notez qu’au cours de l’inférence, CNTK définit automatiquement les deux constantes temporelles de sorte que seule l’utilisation de la moyenne en cours d’exécution existante soit utilisée et qu’elle n’est pas mise à jour. Il n’existe aucune action explicite nécessaire par l’utilisateur.
Implémentation cuDNN
Par défaut, cette fonction utilise une implémentation CNTK qui fonctionne avec des GPU et des processeurs. Vous pouvez choisir d’utiliser l’implémentation cuDNN, qui est plus performante. Notez toutefois que l’implémentation de cuDNN ne prend pas en charge toutes les options et que l’entraînement nécessite un GPU (CNTK fournit toutefois une émulation du processeur pour l’inférence même si vous sélectionnez l’implémentation cuDNN).