ai.onnx.preview.training - Momentum

Momentum - 1 (ai.onnx.preview.training)

版本

  • 名称: Momentum (GitHub)

  • : ai.onnx.preview.training

  • 起始版本: 1

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: True

此版本的运算符已在ai.onnx.preview.training 域的版本 1 开始可用

摘要

使用动量计算随机梯度更新的一个迭代。此运算符可以对多个张量变量进行优化。

让我们定义这个运算符的行为。正如你所想象的,带有动量的随机梯度(SG)需要几个参数

  • 学习率“R”。

  • 更新计数“T”。即已进行的训练迭代次数。在第一次训练迭代中应为零。

  • L2 范数正则化系数“norm_coefficient”。

  • 先前累积梯度(即动量)的衰减系数“alpha”。

  • 当前梯度的缩放系数“beta”。

  • 一个属性,用于选择使用标准动量还是Nesterov动量“mode”。

为了简单起见,假设只有一个张量(称为“X”)需要优化。其他必要的输入是“X”的梯度(称为“G”)和“X”的动量(称为“V”)。这个动量运算符将所有这些输入映射到“X”的新值(称为“X_new”)及其新动量(称为“V_new”)。

此运算符支持两种不同的动量算法。如果需要Nesterov动量,将属性“mode”设置为“nesterov”。否则,将属性“model”设置为“standard”以使用标准动量。计算细节随后描述。

令“+”、“-”、“*”和“/”均为具有numpy风格广播的逐元素操作。

带标准动量的SG伪代码

// 添加 0.5 * norm_coefficient * ||X||^2 的梯度,其中 ||X|| 是 X 中所有元素的平方和。G_regularized = norm_coefficient * X + G

// 在第一次训练迭代中,beta 应该始终为 1。beta_adjusted = T > 0 ? beta : 1

// 根据先前的动量和当前梯度计算当前动量。V_new = alpha * V + beta_adjusted * G_regularized

// 更新 X。X_new = X - R * V_new

带Nesterov动量的SG伪代码

// 添加 0.5 * norm_coefficient * ||X||^2 的梯度,其中 ||X|| 是 X 中所有元素的平方和。G_regularized = norm_coefficient * X + G;

// 在第一次训练迭代中,beta 应该始终为 1。beta_adjusted = T > 0 ? beta : 1

// 根据先前的动量和当前梯度计算当前动量。V_new = alpha * V + beta_adjusted * G_regularized;

// 计算最终更新方向,然后更新 X。X_new = X - R * (G_regularized + alpha * V_new)

如果将此运算符分配给优化多个输入,例如,“X_1”和“X_2”。同样的伪代码将扩展到共同处理所有张量。更具体地说,我们可以将“X”视为“X_1”和“X_2”的连接(当然,它们的梯度和累积梯度也应连接),然后我们的伪代码就变得适用。

属性

  • alpha - FLOAT (必需)

    动量的衰减因子。它应该是一个标量。

  • beta - FLOAT (必需)

    计算新动量时梯度的系数。它应该是一个标量。

  • mode - STRING (必需)

    其值应为“nesterov”或“standard”。值“nesterov”导致使用Nesterov动量,而“standard”调用使用标准动量的随机梯度方法。

  • norm_coefficient - FLOAT (必需)

    0.5 * norm_coefficient * ||X||^2 的系数。

输入

3 到 2147483647 个输入之间。

  • R(异构)- T1

    学习率。

  • T(异构)- T2

    “X”的更新计数。它应该是一个标量。

  • inputs(可变参数)- T3

    它依次包含优化张量的当前值,然后是它们的梯度张量,最后是它们的动量张量。例如,如果优化了两个张量“X_1”和“X_2”,则预期的输入列表将是[“X_1”,“X_2”,“X_1”的梯度,“X_2”的梯度,“X_1”的动量,“X_2”的动量]。

输出

1 到 2147483647 个输出之间。

  • outputs(可变参数)- T3

    它依次包含优化张量的新值,然后是它们动量张量的新值。例如,如果优化了两个张量“X_1”和“X_2”,则输出列表将是[“X_1”的新值,“X_2”的新值,“X_1”的新动量,“X_2”的新动量]。

类型约束

  • T1 包含 ( tensor(double), tensor(float) )

    将输入类型限制为浮点标量。

  • T2 包含 ( tensor(int64) )

    将输入类型限制为 64 位整数标量。

  • T3 在 ( tensor(double), tensor(float) ) 中

    将输入类型限制为浮点张量。