mindspore.ops.ApplyProximalGradientDescent

class mindspore.ops.ApplyProximalGradientDescent[源代码]

根据FOBOS(Forward Backward Splitting)算法更新网络参数。 请参阅论文 Efficient Learning using Forward-Backward Splitting

\[\begin{split}\begin{array}{ll} \\ \text{prox_v} = var - \alpha * \delta \\ var = \frac{sign(\text{prox_v})}{1 + \alpha * l2} * \max(\left| \text{prox_v} \right| - \alpha * l1, 0) \end{array}\end{split}\]

其中 \(\alpha\)alpha\(\delta\)delta

输入 vardelta 之间必须遵守隐式类型转换规则以保证数据类型的统一。如果数据类型不同,低精度的数据类型将被自动转换到高精度的数据类型。

输入:
  • var (Parameter) - Tensor,公式中的"var"。数据类型为float16或float32。shape为 \((N, *)\) ,其中 \(*\) 表示任何数量的附加维度。

  • alpha (Union[Number, Tensor]) - 比例系数,必须为标量。数据类型为float16或float32。

  • l1 (Union[Number, Tensor]) - l1正则化强度,必须为标量。数据类型为float16或float32。

  • l2 (Union[Number, Tensor]) - l2正则化强度,必须为标量。数据类型为float16或float32。

  • delta (Tensor) - 梯度Tensor。

输出:

Tensor,更新后的 var

异常:
  • TypeError - varalphal1l2 的数据类型非float16或float32。

  • TypeError - alphal1l2 不是Number或Tensor。

  • TypeError - delta 不是Tensor。

  • TypeError - vardelta 之间的数值转换不被支持。

支持平台:

Ascend GPU CPU

样例:

>>> import numpy as np
>>> from mindspore import Tensor, nn, ops, Parameter
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.apply_proximal_gradient_descent = ops.ApplyProximalGradientDescent()
...         self.var = Parameter(Tensor(np.ones([2, 2]).astype(np.float32)), name="var")
...         self.alpha = 0.001
...         self.l1 = 0.1
...         self.l2 = 0.1
...     def construct(self, delta):
...         out = self.apply_proximal_gradient_descent(self.var, self.alpha, self.l1, self.l2, delta)
...         return out
...
>>> net = Net()
>>> delta = Tensor(np.array([[0.1, 0.1], [0.1, 0.1]]).astype(np.float32))
>>> output = net(delta)
>>> print(output)
[[0.99969995 0.99969995]
 [0.99969995 0.99969995]]