Поделиться через


структура DML_ADAM_OPTIMIZER_OPERATOR_DESC (directml.h)

Вычисляет обновленные весовые коэффициенты (параметры), используя предоставленные градиенты на основе алгоритма Адама (оценка ADAptive Moment). Этот оператор является оптимизатором и обычно используется на этапе обновления веса цикла обучения для выполнения градиентного спуска.

Этот оператор выполняет следующие вычисления:

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

Помимо вычисления обновленных весовых параметров (возвращаемых в OutputParametersTensor), этот оператор также возвращает обновленные оценки первого и второго моментов в OutputFirstMomentTensor и OutputSecondMomentTensor соответственно. Как правило, эти оценки первого и второго моментов следует хранить и предоставлять в качестве входных данных на следующем шаге обучения.

Синтаксис

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;
};

Члены

InputParametersTensor

Тип: const DML_TENSOR_DESC*

Тензор, содержащий параметры (весовые коэффициенты), к которые применяется этот оптимизатор. Этот оператор использует градиент, оценки первого и второго моментов, текущий этап обучения, а также гиперпараметров LearningRate, Beta1 и Beta2 для выполнения градиентного спуска по значениям веса, указанным в этом тензоре.

InputFirstMomentTensor

Тип: const DML_TENSOR_DESC*

Тензор, содержащий оценку первого момента градиента для каждого весового значения. Эти значения обычно получаются в результате предыдущего выполнения этого оператора через OutputFirstMomentTensor.

При первом применении этого оптимизатора к набору весовых коэффициентов (например, на начальном этапе обучения) значения этого тензора обычно следует инициализировать нулевым значением. Последующие выполнения должны использовать значения, возвращаемые в OutputFirstMomentTensor.

Значения Sizes и DataType этого тензора должны точно соответствовать значениям inputParametersTensor.

InputSecondMomentTensor

Тип: const DML_TENSOR_DESC*

Тензор, содержащий второй момент оценки градиента для каждого весового значения. Эти значения обычно получаются в результате предыдущего выполнения этого оператора через OutputSecondMomentTensor.

При первом применении этого оптимизатора к набору весовых коэффициентов (например, на начальном этапе обучения) значения этого тензора обычно следует инициализировать нулевым значением. Последующие выполнения должны использовать значения, возвращаемые в OutputSecondMomentTensor.

Значения Sizes и DataType этого тензора должны точно соответствовать значениям inputParametersTensor.

GradientTensor

Тип: const DML_TENSOR_DESC*

Градиенты, применяемые к входным параметрам (весам) для градиентного спуска. Градиенты обычно получаются в проходе обратного распространения во время обучения.

Значения Sizes и DataType этого тензора должны точно соответствовать значениям inputParametersTensor.

TrainingStepTensor

Тип: const DML_TENSOR_DESC*

Скалярный тензор, содержащий одно целое значение, представляющее текущее число шагов обучения. Это значение вместе с Beta1 и Beta2 используется для вычисления экспоненциального распада тензоров оценки первого и второго моментов.

Обычно значение шага обучения начинается с 0 в начале обучения и увеличивается на 1 на каждом последующем шаге обучения. Этот оператор не обновляет значение шага обучения; Это следует сделать вручную, например с помощью DML_OPERATOR_ELEMENT_WISE_ADD.

Этот тензор должен быть скалярным (то есть все размеры равным 1) и иметь тип данных DML_TENSOR_DATA_TYPE_UINT32.

OutputParametersTensor

Тип: const DML_TENSOR_DESC*

Выходной тензор, содержащий обновленные значения параметра (веса) после применения градиентного спуска.

Во время привязки этому тензору разрешено использовать псевдоним допустимого входного тензора, который можно использовать для выполнения обновления этого тензора на месте. Дополнительные сведения см. в разделе Примечания .

Значения Sizes и DataType этого тензора должны точно соответствовать значениям inputParametersTensor.

OutputFirstMomentTensor

Тип: const DML_TENSOR_DESC*

Выходной тензор, содержащий обновленные оценки первого момента. Следует сохранить значения этого тензора и указать их в InputFirstMomentTensor на следующем шаге обучения.

Во время привязки этому тензору разрешено использовать псевдоним допустимого входного тензора, который можно использовать для выполнения обновления этого тензора на месте. Дополнительные сведения см. в разделе Примечания .

Значения Sizes и DataType этого тензора должны точно соответствовать значениям inputParametersTensor.

OutputSecondMomentTensor

Тип: const DML_TENSOR_DESC*

Выходной тензор, содержащий обновленные оценки второго момента. Вы должны сохранить значения этого тензора и указать их в InputSecondMomentTensor на следующем шаге обучения.

Во время привязки этому тензору разрешено использовать псевдоним допустимого входного тензора, который можно использовать для выполнения обновления этого тензора на месте. Дополнительные сведения см. в разделе Примечания .

Значения Sizes и DataType этого тензора должны точно соответствовать значениям inputParametersTensor.

LearningRate

Тип: float

Скорость обучения, также называемая размером шага. Скорость обучения — это гиперпараметров, определяющий величину обновления веса вдоль вектора градиента на каждом шаге обучения.

Beta1

Тип: float

Гиперпараметр, представляющий скорость экспоненциального распада для оценки первого момента градиента. Это значение должно находиться в диапазоне от 0,0 до 1,0. Обычно используется значение 0,9f.

Beta2

Тип: float

Гиперпараметр, представляющий экспоненциальную скорость распада для оценки второго момента градиента. Это значение должно находиться в диапазоне от 0,0 до 1,0. Обычно используется значение 0,999f.

Epsilon

Тип: float

Небольшое значение, используемое для числовой стабильности путем предотвращения деления на ноль. Для 32-разрядных входных данных с плавающей запятой типичные значения включают 1e–8 или FLT_EPSILON.

Комментарии

Этот оператор поддерживает выполнение на месте, то есть каждый выходной тензор может быть псевдонимом допустимого входного тензора во время привязки. Например, можно привязать один и тот же ресурс для InputParametersTensor и OutputParametersTensor , чтобы обеспечить эффективное обновление входных параметров на месте. Все входные тензоры этого оператора, за исключением TrainingStepTensor, могут быть псевдонимами таким образом.

Доступность

Этот оператор появился в DML_FEATURE_LEVEL_3_0.

Ограничения тензоров

GradientTensor, InputFirstMomentTensor, InputParametersTensor, InputSecondMomentTensor, OutputFirstMomentTensor, OutputParametersTensor и OutputSecondMomentTensor должны иметь одинаковые значения DataType, DimensionCount и Sizes.

Поддержка тензоров

Тензор Kind Измерения Поддерживаемые счетчики измерений Поддерживаемые типы данных
InputParametersTensor Входные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16
InputFirstMomentTensor Входные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16
InputSecondMomentTensor Входные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16
GradientTensor Входные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16
TrainingStepTensor Входные данные { 1, 1, 1, 1 } 4 FLOAT32, FLOAT16
OutputParametersTensor Выходные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16
OutputFirstMomentTensor Выходные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16
OutputSecondMomentTensor Выходные данные { D0, D1, D2, D3 } 4 FLOAT32, FLOAT16

Требования

   
Минимальная версия клиента Сборка Windows 10 20348
Минимальная версия сервера Сборка Windows 10 20348
Верхняя часть directml.h