ai.onnx.preview.training - Adam

Adam - 1 (ai.onnx.preview.training)

版本

  • 名称: Adam (GitHub)

  • 领域: ai.onnx.preview.training

  • since_version: 1

  • 函数: False

  • support_level: SupportType.COMMON

  • 形状推断: True

此版本的运算符自ai.onnx.preview.training 域的第1版起可用。

摘要

计算Adam的一次迭代,这是一种基于随机梯度的优化算法。该算子可以对多个张量变量进行优化。

让我们定义这个操作符的行为。首先,Adam需要一些参数:

  • 学习率“R”。

  • 更新计数“T”。即,进行的训练迭代次数。

  • 一个L2范数正则化系数“norm_coefficient”。

  • 一个小的常数“epsilon”,用于避免除以零。

  • 两个系数,“alpha”和“beta”。

在每次Adam迭代中,优化的张量会沿着一个基于其指数平均历史梯度和指数平均历史平方梯度计算出的方向移动。假设只有一个张量“X”正在被优化。其余所需的信息是

  • “X”的值,

  • “X”的梯度(用“G”表示),

  • “X”的指数平均历史梯度(用“V”表示),以及

  • “X”的指数平均历史平方梯度(用“H”表示)。

其中一些参数作为输入张量传递给此运算符,而其他参数则存储为此运算符的属性。具体来说,此运算符的输入张量列表是 [“R”, “T”, “X”, “G”, “V”, “H”]。也就是说,“R”是第一个输入,“T”是第二个输入,依此类推。其他参数作为属性给出,因为它们是常量。此外,相应的输出张量是

  • “X”的新值(称为“X_new”),

  • 新的指数平均历史梯度(表示为“V_new”),以及

  • 新的指数平均历史平方梯度(用“H_new”表示)。

这些输出是按照下面的伪代码计算的。

让“+”、“-”、“*”和“/”都是支持numpy风格广播的逐元素算术运算。计算这些输出的伪代码如下:

// 添加梯度 0.5 * norm_coefficient * ||X||_2^2,其中 ||X||_2 是 2-范数。 G_regularized = norm_coefficient * X + G

// 更新指数平均的历史梯度。 V_new = alpha * V + (1 - alpha) * G_regularized

// 更新指数平均的历史平方梯度。 H_new = beta * H + (1 - beta) * G_regularized * G_regularized

// 计算H_new的逐元素平方根。V_new将逐元素除以H_sqrt以获得更好的更新方向。 H_sqrt = Sqrt(H_new) + epsilon

// 计算学习率。注意“alphaT”/”betaT”是alpha/beta的T次方。 R_adjusted = T > 0 ? R * Sqrt(1 - betaT) / (1 - alphaT) : R

// 计算“X”的新值。 X_new = X - R_adjusted * V_new / H_sqrt

// 更新后的正则化。 X_final = (1 - norm_coefficient_post) * X_new

如果有多个输入需要优化,伪代码将独立应用于每个输入。

属性

  • alpha - FLOAT (默认值为 '0.9'):

    运行平均值中先前累积梯度的系数。默认为0.9。

  • beta - FLOAT (默认值为 '0.999'):

    运行平均值中先前累积的平方梯度的系数。默认为0.999。

  • epsilon - FLOAT (默认为 '0.0'):

    避免除以零的小标量。

  • norm_coefficient - FLOAT (默认值为 '0.0'):

    正则化系数为0.5 * norm_coefficient * ||X||_2^2。默认为0,表示没有正则化。

  • norm_coefficient_post - 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”的累积梯度, “X_1”的累积平方梯度, “X_2”的累积平方梯度]。

输出

输出在1到2147483647之间。

  • 输出 (可变参数) - T3:

    优化张量的新值,随后是它们各自的新累积梯度,再随后是它们各自的新累积平方梯度。例如,如果优化了两个张量“X_1”和“X_2”,输出列表将是[“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) ) 中:

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