ai.onnx.preview.training - 动量

动量 - 1 (ai.onnx.preview.training)

版本

  • 名称: Momentum (GitHub)

  • 领域: ai.onnx.preview.training

  • since_version: 1

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自ai.onnx.preview.training 域的第1版起可用。

摘要

使用动量计算一次随机梯度更新的迭代。 此操作符可以优化多个张量变量。

让我们定义这个操作符的行为。正如你所想象的,带有动量的SG需要几个参数:

  • 学习率“R”。

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

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

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

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

  • 一个属性,用于选择应使用标准动量或Nesterov动量“模式”。

为了简化起见,假设只有一个张量(称为“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之间。

  • 输出 (可变参数) - 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) ) 中:

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