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 是一种基于随机梯度的优化算法。此运算符可以进行多个张量变量的优化。
让我们定义此运算符的行为。正如您所料,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 in (
tensor(double)
,tensor(float)
)将输入类型限制为浮点标量。
T2 in (
tensor(int64)
)将输入类型限制为 64 位整数标量。
T3 in (
tensor(double)
,tensor(float)
)将输入和输出类型限制为浮点张量。