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 - FLOAT(默认值为
'0.0'
)一次更新后学习率的衰减因子。有效学习率的计算方式为 r = R / (1 + T * decay_factor)。默认值为 0,因此增加更新计数不会降低学习率。
epsilon - FLOAT(默认值为
'0.0'
)避免除以零的小标量。
norm_coefficient - FLOAT(默认值为
'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)
) 中将输入和输出类型限制为浮点张量。