ai.onnx.preview.training - Adam

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

版本

  • 名称: Adam (GitHub)

  • : ai.onnx.preview.training

  • 起始版本: 1

  • 函数: False

  • 支持级别: 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

// 计算学习率。注意 “alpha**T”/”beta**T” 是 alpha/beta 的 T 次方。R_adjusted = T > 0 ? R * Sqrt(1 - beta**T) / (1 - alpha**T) : 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” 的更新计数。应为标量。

  • 输入 (可变参数) - 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) )

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