ai.onnx.preview.training - 动量

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

版本

  • 名称: 动量 (GitHub)

  • : ai.onnx.preview.training

  • 自版本: 1

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: True

此版本的算子自领域 ai.onnx.preview.training 的版本 1 起可用。

摘要

计算一次带动量的随机梯度更新迭代。此算子可以对多个张量变量进行优化。

让我们定义此算子的行为。正如您所想,带动量的随机梯度需要几个参数

  • 学习率 “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 - 浮点型 (必需)

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

  • beta - 浮点型 (必需)

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

  • mode - 字符串型 (必需)

    其值应为 “nesterov” 或 “standard”。值为 “nesterov” 表示使用 Nesterov 动量,而 “standard” 则表示使用标准动量的随机梯度法。

  • norm_coefficient - 浮点型 (必需)

    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) ) 中

    将输入类型约束为浮点张量。