mindspore.ops.ApplyFtrl

class mindspore.ops.ApplyFtrl(use_locking=False)[源代码]

根据FTRL算法更新相关参数。

更多详细信息请参见 mindspore.nn.FTRL

说明

当前在Ascend平台上仅支持正数,其余场景计算结果未定义。

参数:
  • use_locking (bool) - 是否对参数更新加锁保护。默认值:False。

输入:
  • var (Parameter) - 要更新的权重。数据类型必须为float16或float32。shape: \((N, *)\) ,其中 \(*\) 表示任意数量的附加维度。

  • accum (Parameter) - 要更新的累积,shape和数据类型必须与 var 相同。

  • linear (Parameter) - 要更新的线性系数,shape和数据类型必须与 var 相同。

  • grad (Tensor) - 梯度。数据类型必须为float16或float32。

  • lr (Union[Number, Tensor]) - 学习率,必须为正值。它必须是float或数据类型为float16或float32的Scalar的Tensor。默认值:0.001。

  • l1 (Union[Number, Tensor]) - l1正则化,必须大于或等于零。它必须是float类型或数据类型为float16或float32的Scalar的Tensor。默认值:0.0。

  • l2 (Union[Number, Tensor]) - l2正则化,必须大于或等于零。它必须是float类型或数据类型为float16或float32的Scalar的Tensor。默认值:0.0。

  • lr_power (Union[Number, Tensor]) - 在训练期间控制降低学习率,必须小于或等于零。如果lr_power为零,则使用固定学习率。它必须是float类型或数据类型为float16或float32的Scalar的Tensor。默认值:-0.5。

输出:
  • var (Tensor) - 表示更新后的 var 。由于输入参数已更新,因此当平台为GPU时,此值始终为零。

异常:
  • TypeError - 如果 use_locking 不是bool。

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

  • TypeError - 如果 lrl1l2lr_power 既不是数值型也不是Tensor。

  • TypeError - 如果 grad 不是Tensor。

  • RuntimeError - 如果 varaccumlinear 参数类型不一致。

  • RuntimeError - 如果 gradlrl1l2lr_power 的参数类型与 var 不一致且精度大于 var

支持平台:

Ascend GPU CPU

样例:

>>> class ApplyFtrlNet(nn.Cell):
...     def __init__(self):
...         super(ApplyFtrlNet, self).__init__()
...         self.apply_ftrl = ops.ApplyFtrl()
...         self.lr = 0.001
...         self.l1 = 0.0
...         self.l2 = 0.0
...         self.lr_power = -0.5
...         self.var = Parameter(Tensor(np.array([[0.6, 0.4],
...                                               [0.1, 0.5]]).astype(np.float32)), name="var")
...         self.accum = Parameter(Tensor(np.array([[0.6, 0.5],
...                                                 [0.2, 0.6]]).astype(np.float32)), name="accum")
...         self.linear = Parameter(Tensor(np.array([[0.9, 0.1],
...                                                  [0.7, 0.8]]).astype(np.float32)), name="linear")
...
...     def construct(self, grad):
...         out = self.apply_ftrl(self.var, self.accum, self.linear, grad, self.lr, self.l1, self.l2,
...                               self.lr_power)
...         return out
...
>>> net = ApplyFtrlNet()
>>> input_x = Tensor(np.array([[0.3, 0.7], [0.1, 0.8]]).astype(np.float32))
>>> output = net(input_x)
>>> print(net.var.asnumpy())
[[ 0.0390525  0.11492836]
 [ 0.00066425 0.15075898]]