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) ) 中

    将输入和输出类型限制为浮点张量。