mindspore.ops.ApplyAdamWithAmsgradV2

查看源文件
class mindspore.ops.ApplyAdamWithAmsgradV2(use_locking=False)[源代码]

根据Adam算法更新变量var。

更新公式如下:

lrt:=learning_rate1β2t/(1β1t)mt:=β1mt1+(1β1)gvt:=β2vt1+(1β2)ggv^t:=max(v^t1,vt)var:=varlrtmt/(v^t+ϵ)

t 表示更新步数, m 为一阶矩, v 为二阶矩, v^t 表示 vhatlr 代表学习率, g 代表 gradβ1,β2 代表 beta1beta2β1t 代表 beta1_powerβ2t 代表 beta2_powervar 代表要更新的网络参数, ϵ 代表 epsilon

所有输入符合隐式类型转换规则,使数据类型一致。如果它们具有不同的数据类型,则低精度数据类型将转换为相对最高精度的数据类型。

参数:
  • use_locking (bool) - 如果为 Truevarmv 的更新将受到锁的保护。否则,可能出现较少的冲突。默认值为 False

输入:
  • var (Union[Parameter, Tensor]) - 待更新的网络参数或者Tensor,为任意维度。数据类型为float16、float32或float64。

  • m (Union[Parameter, Tensor]) - 一阶矩,shape与 var 相同。

  • v (Union[Parameter, Tensor]) - 二阶矩。shape与 var 相同。

  • vhat (Union[Parameter, Tensor]) - 公式中的 v^t 。shape和类型与 var 相同。

  • beta1_power (Union[float, Tensor]) - 公式中的 beta1t(β1t) ,数据类型为float16、float32或float64。

  • beta2_power (Union[float, Tensor]) - 公式中的 beta2t(β2t) ,数据类型为float16、float32或float64。

  • lr (Union[float, Tensor]) - 学习率。数据类型为float16、float32或float64的Tensor。

  • beta1 (Union[float, Tensor]) - 一阶矩的指数衰减率。数据类型为float16、float32或float64。

  • beta2 (Union[float, Tensor]) - 二阶矩的指数衰减率。数据类型为float16、float32或float64。

  • epsilon (Union[float, Tensor]) - 加在分母上的值,以确保数值稳定。数据类型为float16、float32或float64。

  • grad (Tensor) - 为梯度,shape与 var 相同。

输出:

4个Tensor组成的tuple,更新后的数据。

  • var (Tensor) - shape和数据类型与 var 相同。

  • m (Tensor) - shape和数据类型与 m 相同。

  • v (Tensor) - shape和数据类型与 v 相同。

  • vhat (Tensor) - shape和数据类型与 vhat 相同。

异常:
  • TypeError - 如果 varmvvhat 不是Parameter或者Tensor。

  • TypeError - 如果 varmvvhatbeta1_powerbeta2_powerlrbeta1beta2epsilongrad 的数据类型既不是float16也不是float32,也不是float64。

  • RuntimeError - 如果 varmvvhatgrad 不支持数据类型转换。

支持平台:

Ascend GPU CPU

样例:

>>> from mindspore import ops
>>> import mindspore.nn as nn
>>> from mindspore import Tensor, Parameter
>>> import numpy as np
>>> class ApplyAdamWithAmsgradNet(nn.Cell):
...     def __init__(self, use_locking=False):
...         super(ApplyAdamWithAmsgradNet, self).__init__()
...         self.apply_adam_with_amsgrad = ops.ApplyAdamWithAmsgradV2(use_locking)
...         self.var = Parameter(Tensor(np.array([[0.2, 0.2], [0.2, 0.2]]).astype(np.float32)), name="var")
...         self.m = Parameter(Tensor(np.array([[0.1, 0.2], [0.4, 0.3]]).astype(np.float32)), name="m")
...         self.v = Parameter(Tensor(np.array([[0.2, 0.1], [0.3, 0.4]]).astype(np.float32)), name="v")
...         self.vhat = Parameter(Tensor(np.array([[0.1, 0.2], [0.6, 0.2]]).astype(np.float32)), name="vhat")
...         self.beta1 = 0.8
...         self.beta2 = 0.999
...         self.epsilon = 1e-8
...         self.beta1_power = 0.9
...         self.beta2_power = 0.999
...         self.lr = 0.01
...
...     def construct(self, grad):
...         out = self.apply_adam_with_amsgrad(self.var, self.m, self.v, self.vhat,
...                                            self.beta1_power, self.beta2_power, self.lr,
...                                            self.beta1, self.beta2, self.epsilon, grad)
...         return out
>>> net = ApplyAdamWithAmsgradNet()
>>> grad = Tensor(np.array([[0.4, 0.2], [0.2, 0.3]]).astype(np.float32))
>>> output = net(grad)
>>> print(net.var.asnumpy())
[[0.19886853 0.1985858 ]
[0.19853032 0.19849943]]