structure DML_ADAM_OPTIMIZER_OPERATOR_DESC (directml.h)
Calcule les pondérations (paramètres) mises à jour à l’aide des dégradés fournis, en fonction de l’algorithme Adam (estimationADA ptive Moment). Cet opérateur est un optimiseur et est généralement utilisé dans l’étape de mise à jour du poids d’une boucle d’entraînement pour effectuer une descente de gradient.
Cet opérateur effectue le calcul suivant :
X = InputParametersTensor
M = InputFirstMomentTensor
V = InputSecondMomentTensor
G = GradientTensor
T = TrainingStepTensor
// Compute updated first and second moment estimates.
M = Beta1 * M + (1.0 - Beta1) * G
V = Beta2 * V + (1.0 - Beta2) * G * G
// Compute bias correction factor for first and second moment estimates.
Alpha = sqrt(1.0 - pow(Beta2, T)) / (1.0 - pow(Beta1, T))
X -= LearningRate * Alpha * M / (sqrt(V) + Epsilon)
OutputParametersTensor = X
OutputFirstMomentTensor = M
OutputSecondMomentTensor = V
Outre le calcul des paramètres de pondération mis à jour (retournés dans OutputParametersTensor), cet opérateur retourne également les estimations de premier et de deuxième moment mises à jour dans OutputFirstMomentTensor et OutputSecondMomentTensor, respectivement. En règle générale, vous devez stocker ces estimations de premier et de deuxième moment et les fournir sous forme d’entrées lors de l’étape d’entraînement suivante.
Syntaxe
struct DML_ADAM_OPTIMIZER_OPERATOR_DESC {
const DML_TENSOR_DESC *InputParametersTensor;
const DML_TENSOR_DESC *InputFirstMomentTensor;
const DML_TENSOR_DESC *InputSecondMomentTensor;
const DML_TENSOR_DESC *GradientTensor;
const DML_TENSOR_DESC *TrainingStepTensor;
const DML_TENSOR_DESC *OutputParametersTensor;
const DML_TENSOR_DESC *OutputFirstMomentTensor;
const DML_TENSOR_DESC *OutputSecondMomentTensor;
FLOAT LearningRate;
FLOAT Beta1;
FLOAT Beta2;
FLOAT Epsilon;
};
Membres
InputParametersTensor
Type : const DML_TENSOR_DESC*
Tenseur contenant les paramètres (pondérations) à appliquer à cet optimiseur. Les estimations de gradient, de premier et de deuxième moment, l’étape d’entraînement actuelle, ainsi que les hyperparamètres LearningRate, Beta1 et Beta2, sont utilisés par cet opérateur pour effectuer une descente de gradient sur les valeurs de pondération fournies dans ce tenseur.
InputFirstMomentTensor
Type : const DML_TENSOR_DESC*
Tenseur contenant l’estimation du premier moment du dégradé pour chaque valeur de pondération. Ces valeurs sont généralement obtenues à la suite d’une exécution précédente de cet opérateur, via le OutputFirstMomentTensor.
Lors de l’application de cet optimiseur à un ensemble de pondérations pour la première fois (par exemple, lors de l’étape d’entraînement initiale), les valeurs de ce tenseur doivent généralement être initialisées à zéro. Les exécutions suivantes doivent utiliser les valeurs retournées dans OutputFirstMomentTensor.
Les Tailles et DataType de ce tenseur doivent correspondre exactement à ceux du InputParametersTensor.
InputSecondMomentTensor
Type : const DML_TENSOR_DESC*
Tenseur contenant l’estimation du deuxième moment du dégradé pour chaque valeur de pondération. Ces valeurs sont généralement obtenues à la suite d’une exécution précédente de cet opérateur, via le OutputSecondMomentTensor.
Lors de l’application de cet optimiseur à un ensemble de pondérations pour la première fois (par exemple, lors de l’étape d’entraînement initiale), les valeurs de ce tenseur doivent généralement être initialisées à zéro. Les exécutions suivantes doivent utiliser les valeurs retournées dans OutputSecondMomentTensor.
Les Tailles et DataType de ce tenseur doivent correspondre exactement à ceux du InputParametersTensor.
GradientTensor
Type : const DML_TENSOR_DESC*
Dégradés à appliquer aux paramètres d’entrée (pondérations) pour la descente de dégradé. Les dégradés sont généralement obtenus dans une passe de rétropropagation pendant l’entraînement.
Les Tailles et DataType de ce tenseur doivent correspondre exactement à ceux du InputParametersTensor.
TrainingStepTensor
Type : const DML_TENSOR_DESC*
Tenseur scalaire contenant une valeur entière unique représentant le nombre d’étapes d’entraînement actuel. Cette valeur, ainsi que Beta1 et Beta2 , est utilisée pour calculer la désintégration exponentielle des tenseurs d’estimation des premier et deuxième moments.
En règle générale, la valeur de l’étape d’entraînement commence à 0 au début de l’entraînement et est incrémentée de 1 à chaque étape d’entraînement successive. Cet opérateur ne met pas à jour la valeur de l’étape d’entraînement ; vous devez le faire manuellement, par exemple en utilisant DML_OPERATOR_ELEMENT_WISE_ADD.
Ce tenseur doit être scalaire (c’est-à-dire toutes les tailles égales à 1) et avoir un type de données DML_TENSOR_DATA_TYPE_UINT32.
OutputParametersTensor
Type : const DML_TENSOR_DESC*
Tenseur de sortie qui contient les valeurs de paramètre (pondération) mises à jour après l’application de la descente de dégradé.
Pendant la liaison, ce tenseur est autorisé à alias un tenseur d’entrée éligible, qui peut être utilisé pour effectuer une mise à jour sur place de ce tenseur. Pour plus d’informations, consultez la section Remarques .
Les Tailles et DataType de ce tenseur doivent correspondre exactement à ceux du InputParametersTensor.
OutputFirstMomentTensor
Type : const DML_TENSOR_DESC*
Tenseur de sortie contenant des estimations de premier moment mises à jour. Vous devez stocker les valeurs de ce tenseur et les fournir dans InputFirstMomentTensor lors de l’étape d’entraînement suivante.
Pendant la liaison, ce tenseur est autorisé à alias un tenseur d’entrée éligible, qui peut être utilisé pour effectuer une mise à jour sur place de ce tenseur. Pour plus d’informations, consultez la section Remarques .
Les Tailles et DataType de ce tenseur doivent correspondre exactement à ceux du InputParametersTensor.
OutputSecondMomentTensor
Type : const DML_TENSOR_DESC*
Tenseur de sortie contenant des estimations de deuxième moment mises à jour. Vous devez stocker les valeurs de ce tenseur et les fournir dans InputSecondMomentTensor lors de l’étape d’entraînement suivante.
Pendant la liaison, ce tenseur est autorisé à alias un tenseur d’entrée éligible, qui peut être utilisé pour effectuer une mise à jour sur place de ce tenseur. Pour plus d’informations, consultez la section Remarques .
Les Tailles et DataType de ce tenseur doivent correspondre exactement à ceux du InputParametersTensor.
LearningRate
Type : float
Taux d’apprentissage, également appelé taille d’étape. Le taux d’apprentissage est un hyperparamètre qui détermine l’ampleur de la mise à jour de poids le long du vecteur de gradient à chaque étape d’entraînement.
Beta1
Type : float
Hyperparamètre représentant le taux de désintégration exponentielle de l’estimation du premier moment du gradient. Cette valeur doit être comprise entre 0,0 et 1,0. Une valeur de 0,9f est typique.
Beta2
Type : float
Hyperparamètre représentant le taux de désintégration exponentielle de l’estimation du deuxième moment du gradient. Cette valeur doit être comprise entre 0,0 et 1,0. Une valeur de 0,999f est typique.
Epsilon
Type : float
Petite valeur utilisée pour faciliter la stabilité numérique en empêchant la division par zéro. Pour les entrées à virgule flottante 32 bits, les valeurs typiques incluent 1e-8 ou FLT_EPSILON
.
Notes
Cet opérateur prend en charge l’exécution sur place, ce qui signifie que chaque tenseur de sortie est autorisé à aliaser un tenseur d’entrée éligible pendant la liaison. Par exemple, il est possible de lier la même ressource pour inputParametersTensor et OutputParametersTensor afin d’obtenir efficacement une mise à jour sur place des paramètres d’entrée. Tous les tenseurs d’entrée de cet opérateur, à l’exception de TrainingStepTensor, peuvent être alias de cette façon.
Disponibilité
Cet opérateur a été introduit dans DML_FEATURE_LEVEL_3_0
.
Contraintes tensoriels
GradientTensor, InputFirstMomentTensor, InputParametersTensor, InputSecondMomentTensor, OutputFirstMomentTensor, OutputParametersTensor et OutputSecondMomentTensor doivent avoir les mêmes DataType, DimensionCount et Sizes.
Prise en charge de Tensor
Tenseur | Type | Dimensions | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|---|
InputParametersTensor | Entrée | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
InputFirstMomentTensor | Entrée | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
InputSecondMomentTensor | Entrée | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
GradientTensor | Entrée | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
TrainingStepTensor | Entrée | { 1, 1, 1, 1 } | 4 | FLOAT32, FLOAT16 |
OutputParametersTensor | Output | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
OutputFirstMomentTensor | Output | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
OutputSecondMomentTensor | Output | { D0, D1, D2, D3 } | 4 | FLOAT32, FLOAT16 |
Spécifications
Client minimal pris en charge | Windows 10 Build 20348 |
Serveur minimal pris en charge | Windows 10 Build 20348 |
En-tête | directml.h |