ai.onnx.preview.training - 动量¶
动量 - 1 (ai.onnx.preview.training)¶
版本¶
领域:
ai.onnx.preview.trainingsince_version:
1函数:
Falsesupport_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)) 中:将输入类型限制为浮点张量。