ai.onnx.preview.training - Momentum¶
Momentum - 1 (ai.onnx.preview.training)¶
版本¶
域:
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”)。此 Momentum 运算符将所有这些输入映射到“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”的更新计数。它应该是一个标量。
输入 (可变) - 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)
) 中将输入类型限制为浮点张量。