DML_ADAM_OPTIMIZER_OPERATOR_DESC 结构 (directml.h)

根据 Adam (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) 中返回 (更新的权重参数外,此运算符还分别在 OutputFirstMomentTensorOutputSecondMomentTensor 中返回更新的第一个和第二个时刻估计值。 通常,应存储这些第一个和第二个时刻估计值,并在后续训练步骤中将它们作为输入提供。

语法

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*

包含参数的张量 (权重) 应用此优化器。 此运算符使用梯度、第一次和第二时刻估计值、当前训练步骤以及超参数 LearningRateBeta1Beta2 来对此张量中提供的权重值执行梯度下降。

InputFirstMomentTensor

类型: const DML_TENSOR_DESC*

一个张量,其中包含每个权重值梯度的第一个时刻估计值。 这些值通常是通过 OutputFirstMomentTensor 作为上一个执行此运算符的结果获取的。

例如,首次将此优化器应用于一组权重 (时,在初始训练步骤) 通常应将此张量的值初始化为零。 后续执行应使用 OutputFirstMomentTensor 中返回的值。

此张量的大小和数据类型必须与 InputParametersTensor 的大小和数据类型完全匹配。

InputSecondMomentTensor

类型: const DML_TENSOR_DESC*

包含每个权重值梯度的第二个时刻估计值的张量。 这些值通常是通过 OutputSecondMomentTensor 作为此运算符的先前执行的结果获取的。

例如,首次将此优化器应用于一组权重 (时,在初始训练步骤) 通常应将此张量的值初始化为零。 后续执行应使用 OutputSecondMomentTensor 中返回的值。

此张量的大小和数据类型必须与 InputParametersTensor 的大小和数据类型完全匹配。

GradientTensor

类型: const DML_TENSOR_DESC*

应用于输入参数的渐变 (梯度下降) 权重。 渐变通常在训练期间在反向传播传递中获取。

此张量的大小和数据类型必须与 InputParametersTensor 的大小和数据类型完全匹配。

TrainingStepTensor

类型: const DML_TENSOR_DESC*

包含表示当前训练步骤计数的单个整数值的标量张量。 此值与 Beta1Beta2 一起用于计算第一个和第二个时刻估计张量的指数衰减。

通常,训练步骤值在训练开始时从 0 开始,并在每个连续训练步骤上递增 1。 此运算符不会更新训练步骤值;应手动执行此操作,例如使用 DML_OPERATOR_ELEMENT_WISE_ADD

此张量必须是标量 (即,所有 大小 都等于 1) ,并且数据类型 DML_TENSOR_DATA_TYPE_UINT32

OutputParametersTensor

类型: const DML_TENSOR_DESC*

一个输出张量,用于在应用梯度下降后保存更新的参数 (权重) 值。

在绑定期间,允许此张量为符合条件的输入张量别名,该张量可用于执行此张量就地更新。 有关更多详细信息,请参阅 备注 部分。

此张量的大小和数据类型必须与 InputParametersTensor 的大小和数据类型完全匹配。

OutputFirstMomentTensor

类型: const DML_TENSOR_DESC*

包含更新的第一时刻估计值的输出张量。 应存储此张量的值,并在后续训练步骤期间在 InputFirstMomentTensor 中提供它们。

在绑定期间,允许此张量为符合条件的输入张量别名,该张量可用于执行此张量就地更新。 有关更多详细信息,请参阅 备注 部分。

此张量的大小和数据类型必须与 InputParametersTensor 的大小和数据类型完全匹配。

OutputSecondMomentTensor

类型: const DML_TENSOR_DESC*

包含更新的第二时刻估计值的输出张量。 应存储此张量的值,并在后续训练步骤期间在 InputSecondMomentTensor 中提供它们。

在绑定期间,允许此张量为符合条件的输入张量别名,该张量可用于执行此张量就地更新。 有关更多详细信息,请参阅 备注 部分。

此张量的大小和数据类型必须与 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

备注

此运算符支持就地执行,这意味着允许每个输出张量在绑定期间为符合条件的输入张量添加别名。 例如,可以同时为 InputParametersTensorOutputParametersTensor 绑定相同的资源,以便有效地实现输入参数的就地更新。 除 TrainingStepTensor 外,此运算符的所有输入张量都有资格以这种方式进行别名。

可用性

此运算符是在 中引入的 DML_FEATURE_LEVEL_3_0

张量约束

GradientTensorInputFirstMomentTensorInputParametersTensorInputSecondMomentTensorOutputFirstMomentTensorOutputParametersTensorOutputSecondMomentTensor 必须具有相同 的 DataTypeDimensionCountSize

Tensor 支持

种类 维度 支持的维度计数 支持的数据类型
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