ai.onnx.preview.training - Adagrad¶
Adagrad - 1 (ai.onnx.preview.training)¶
版本¶
名称: Adagrad (GitHub)
域:
ai.onnx.preview.training
自版本:
1
函数:
False
支持级别:
SupportType.COMMON
形状推断:
True
该版本的算子自领域 ai.onnx.preview.training 的版本 1 起可用。
摘要¶
计算 ADAGRAD 随机梯度优化算法的一个迭代。该算子可以对多个张量变量进行优化。
让我们定义该算子的行为。正如你所想,ADAGRAD 需要一些参数:
初始学习率 “R”。
更新计数 “T”。即已进行的训练迭代次数。
L2 范数正则化系数 “norm_coefficient”。
学习率衰减因子 “decay_factor”。
用于避免除以零的小常数 “epsilon”。
在每次 ADAGRAD 迭代中,被优化的张量沿根据其估计梯度和累积平方梯度计算出的方向移动。假设该算子只更新一个张量 “X”。我们需要 “X” 的值、它的梯度 “G” 以及它的累积平方梯度 “H”。因此,该算子的输入列表中变量的顺序是 “R”、“T”、“X”、“G” 和 “H”。其他参数作为属性给出,因为它们通常是常数。此外,相应的输出张量是 “X” 的新值(称为 “X_new”)以及新的累积平方梯度(称为 “H_new”)。这些输出根据下面的伪代码从给定的输入计算得出。
设 “+”、“-”、“*” 和 “/” 都是支持 numpy 风格广播的按元素算术运算。计算这些输出的伪代码如下:
// 计算标量学习率因子。在第一次更新 X 时,T 通常为 // 0(基于 0 的更新索引)或 1(基于 1 的更新索引)。 r = R / (1 + T * decay_factor);
// 添加 0.5 * norm_coefficient * ||X||_2^2 的梯度,其中 ||X||_2 是 2-范数。 G_regularized = norm_coefficient * X + G;
// 计算新的累积平方梯度。 H_new = H + G_regularized * G_regularized;
// 计算逐坐标学习率的自适应部分。注意 Sqrt(…) // 计算按元素平方根。 H_adaptive = Sqrt(H_new) + epsilon
// 计算 “X” 的新值。 X_new = X - r * G_regularized / H_adaptive;
如果将该算子用于优化多个输入,例如 “X_1” 和 “X_2”,则可以将相同的伪代码扩展到联合处理所有张量。更具体地说,我们可以将 “X” 视为 “X_1” 和 “X_2” 的串联(当然,它们的梯度和累积梯度也应该串联),然后直接重用整个伪代码。
注意,ADAGRAD 最初是在 http://jmlr.org/papers/volume12/duchi11a/duchi11a.pdf 中提出的。在该参考论文中,该算子是图 1 复合镜像下降更新的一个特例。
属性¶
decay_factor - 浮点数 (默认值为
'0.0'
)一次更新后学习率的衰减因子。有效学习率由 r = R / (1 + T * decay_factor) 计算。默认值为 0,这样增加更新计数不会降低学习率。
epsilon - 浮点数 (默认值为
'0.0'
)用于避免除以零的小标量。
norm_coefficient - 浮点数 (默认值为
'0.0'
)0.5 * norm_coefficient * ||X||_2^2 中的正则化系数。默认值为 0,表示没有正则化。
输入¶
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)
) 中将输入和输出类型限制为浮点张量。